1 // RUN: %clang_cc1 -fsyntax-only -verify %s
6 template<typename T> struct A {
14 S::A<int>::Nested::type *ip = &i;
26 template<typename V> T bar(V);
27 template<typename V> T* bar(V);
36 class Outer<X>::Inner0 {
43 void Outer<X>::Inner0<Y>::f(X, Y) {
48 struct Outer<X>::Inner1<Y>::ReallyInner {
56 void Outer<X>::Inner1<Y>::ReallyInner::g(X, Y) {
61 X Outer<X>::Inner1<Y>::foo(Y) {
68 X Outer<X>::Inner1<Y>::bar(Z) {
75 X* Outer<X>::Inner1<Y>::bar(Z) {
81 X Outer<X>::Inner1<Y>::value1 = 0;
85 Y Outer<X>::Inner1<Y>::value2 = Y();
89 Y Outer<X>::Inner1<Y>::ReallyInner::value3 = Y();
93 Y Outer<X>::Inner1<Y*>::ReallyInner::value4; // expected-error{{Outer<X>::Inner1<Y *>::ReallyInner::}}
102 void f(U u = T()) { }
108 template<typename, bool = false> struct B { };
110 template struct X1<int>::B<bool>;
112 // Template template parameters
115 template<template<class U, T Value> class> // expected-error{{cannot have type 'float'}} \
116 // expected-note{{previous non-type template}}
121 int Value> // expected-note{{template non-type parameter}}
124 X2<int>::Inner<X2_arg> x2i1;
125 X2<float> x2a; // expected-note{{instantiation}}
126 X2<long>::Inner<X2_arg> x2i3; // expected-error{{template template argument has different}}
129 template<typename TN>
137 T SomeField; // expected-error {{member 'SomeField' declared as a template}}