207 lines · cpp
1// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s2 3template <class T>4class A {5 void foo() {6 undeclared();7 }8 void foo2();9};10 11template <class T>12class B {13 void foo4() { } // expected-note {{previous definition is here}}14 void foo4() { } // expected-error {{class member cannot be redeclared}}15 void foo5() { } // expected-note {{previous definition is here}}16 17 friend void foo3() {18 undeclared();19 }20};21 22 23template <class T>24void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}}25}26 27template <class T>28void A<T>::foo2() {29 undeclared();30}31 32 33template <class T>34void foo3() {35 undeclared();36}37 38template void A<int>::foo2();39 40 41void undeclared()42{43 44}45 46template <class T> void foo5() {} //expected-note {{previous definition is here}}47template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}}48 49 50 51 52namespace PR11931 {53 54template <typename RunType>55struct BindState;56 57 template<>58struct BindState<void(void*)> {59 static void Run() { }60};61 62class Callback {63public:64 typedef void RunType();65 66 template <typename RunType>67 Callback(BindState<RunType> bind_state) {68 BindState<RunType>::Run();69 }70};71 72 73Callback Bind() {74 return Callback(BindState<void(void*)>());75}76 77}78 79namespace rdar11700604 {80 template<typename T> void foo() = delete;81 82 struct X {83 X() = default;84 85 template<typename T> void foo() = delete;86 };87}88 89namespace PR17334 {90 91template <typename = void> struct ArrayRef {92 constexpr ArrayRef() {}93};94template <typename = void> void CreateConstInBoundsGEP2_32() {95 ArrayRef<> IdxList;96}97void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); }98 99}100 101namespace PR17661 {102template <typename T>103constexpr T Fun(T A) { return T(0); }104 105constexpr int Var = Fun(20);106}107 108template <typename T>109auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}}110 111namespace PR19613 {112 113struct HeapTypeConfig {114 static void from_bitset();115};116 117template <class Config>118struct TypeImpl {119 struct BitsetType;120 121 static void Any() {122 BitsetType::New();123 }124};125 126template<class Config>127struct TypeImpl<Config>::BitsetType {128 static void New() {129 Config::from_bitset();130 }131};132 133static void f() {134 TypeImpl<HeapTypeConfig>::Any();135}136 137template<typename A> struct S {138 template<typename B> struct T;139};140template<typename A> template<typename B> struct S<A>::T {141 template<typename C, typename D> struct U;142 template<typename C> struct U<C, C> {143 template<typename E> static int f() {144 return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E);145 }146 };147};148 149static void g() {150 S<int>::T<int>::U<int,int>::f<int>();151}152 153template<typename T> struct SS {154 template<typename U> struct X;155 template<typename U> struct X<U*>;156};157template<typename T> template<typename U> struct SS<T>::X<U*> {158 static int f() {159 return sizeof(T) + sizeof(U);160 }161};162 163static void h() {164 SS<int>::X<int*>::f();165}166 167}168 169struct PR38460 {170 template <typename>171 struct T {172 static void foo() {173 struct U {174 void dummy() {175 use_delayed_identifier();176 }177 };178 }179 };180};181void use_delayed_identifier();182void trigger_PR38460() {183 PR38460::T<int>::foo();184}185 186template <typename> struct PR38460_2 {187 struct p {188 struct G {189 bool operator()(int) {}190 };191 };192 static void as() {193 typename p::G g;194 g(0);195 }196};197template struct PR38460_2<int>;198 199namespace LateParsedAttrs {200 template <class>201 void f(int a) __attribute__((__diagnose_if__(a > 0, "foo", "error"))) {}202 // expected-note@-1 {{from 'diagnose_if' attribute on 'f<int>'}}203 void g() {204 f<int>(1); // expected-error {{foo}}205 }206} // namespace LateParsedAttrs207