1 struct A { int a_member; }; 2 inline int use_a(A a) { return a.a_member; } 3 4 class B { 5 struct Inner1 {}; 6 public: 7 struct Inner2; 8 struct Inner3; 9 template<typename T> void f(); 10 }; 11 struct BFriend { 12 friend class B::Inner3; 13 private: 14 struct Inner3Base {}; 15 }; 16 // Check that lookup and access checks are performed in the right context. 17 struct B::Inner2 : Inner1 {}; 18 struct B::Inner3 : BFriend::Inner3Base {}; 19 template<typename T> void B::f() {} 20 template<> inline void B::f<int>() {} 21 22 // Check that base-specifiers are correctly disambiguated. 23 template<int N> struct C_Base { struct D { constexpr operator int() const { return 0; } }; }; 24 const int C_Const = 0; 25 struct C1 : C_Base<C_Base<0>::D{}> {} extern c1; 26 struct C2 : C_Base<C_Const<0>::D{} extern c2; 27 28 typedef struct { int a; void f(); struct X; } D; 29 struct D::X { int dx; } extern dx; 30 inline int use_dx(D::X dx) { return dx.dx; } 31 32 template<typename T> int E(T t) { return t; } 33 34 template<typename T> struct F { 35 int f(); 36 template<typename U> int g(); 37 static int n; 38 }; 39 template<typename T> int F<T>::f() { return 0; } 40 template<typename T> template<typename U> int F<T>::g() { return 0; } 41 template<typename T> int F<T>::n = 0; 42 template<> inline int F<char>::f() { return 0; } 43 template<> template<typename U> int F<char>::g() { return 0; } 44 template<> struct F<void> { int h(); }; 45 inline int F<void>::h() { return 0; } 46 template<typename T> struct F<T *> { int i(); }; 47 template<typename T> int F<T*>::i() { return 0; } 48 49 namespace G { 50 enum A { a, b, c, d, e }; 51 enum { f, g, h }; 52 typedef enum { i, j } k; 53 typedef enum {} l; 54 } 55 56 template<typename T = int, int N = 3, template<typename> class K = F> int H(int a = 1); 57 template<typename T = int, int N = 3, template<typename> class K = F> using I = decltype(H<T, N, K>()); 58 template<typename T = int, int N = 3, template<typename> class K = F> struct J {}; 59 60 namespace NS { 61 struct A {}; 62 template<typename T> struct B : A {}; 63 template<typename T> struct B<T*> : B<char> {}; 64 template<> struct B<int> : B<int*> {}; 65 inline void f() {} 66 } 67 68 namespace StaticInline { 69 struct X {}; 70 static inline void f(X); 71 static inline void g(X x) { f(x); } 72 } 73 74 namespace FriendDefArg { 75 template<typename = int> struct A; 76 template<int = 0> struct B; 77 template<template<typename> class = A> struct C; 78 template<typename = int, int = 0, template<typename> class = A> struct D {}; 79 template<typename U> struct Y { 80 template<typename> friend struct A; 81 template<int> friend struct B; 82 template<template<typename> class> friend struct C; 83 template<typename, int, template<typename> class> friend struct D; 84 }; 85 } 86 87 namespace SeparateInline { 88 inline void f(); 89 void f() {} 90 constexpr int g() { return 0; } 91 } 92 93 namespace TrailingAttributes { 94 template<typename T> struct X {} __attribute__((aligned(8))); 95 } 96 97 namespace MergeFunctionTemplateSpecializations { 98 template<typename T> T f(); 99 template<typename T> struct X { 100 template<typename U> using Q = decltype(f<T>() + U()); 101 }; 102 using xiq = X<int>::Q<int>; 103 } 104 105 enum ScopedEnum : int; 106 enum ScopedEnum : int { a, b, c }; 107 108 namespace RedeclDifferentDeclKind { 109 struct X {}; 110 typedef X X; 111 using RedeclDifferentDeclKind::X; 112 } 113 114 namespace Anon { 115 struct X { 116 union { 117 int n; 118 }; 119 }; 120 } 121 122 namespace ClassTemplatePartialSpec { 123 template<typename T> struct F; 124 template<template<int> class A, int B> struct F<A<B>> { 125 template<typename C> F(); 126 }; 127 template<template<int> class A, int B> template<typename C> F<A<B>>::F() {} 128 129 template<typename A, int B> struct F<A[B]> { 130 template<typename C> F(); 131 }; 132 template<typename A, int B> template<typename C> F<A[B]>::F() {} 133 } 134 135 struct MemberClassTemplate { 136 template<typename T> struct A; 137 }; 138 template<typename T> struct MemberClassTemplate::A {}; 139 template<typename T> struct MemberClassTemplate::A<T*> {}; 140 template<> struct MemberClassTemplate::A<int> {}; 141