| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291 |
- // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
- // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
- // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
- // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
- namespace dr300 { // dr300: yes
- template<typename R, typename A> void f(R (&)(A)) {}
- int g(int);
- void h() { f(g); }
- }
- namespace dr301 { // dr301: yes
- // see also dr38
- struct S;
- template<typename T> void operator+(T, T);
- void operator-(S, S);
- void f() {
- bool a = (void(*)(S, S))operator+<S> <
- (void(*)(S, S))operator+<S>;
- bool b = (void(*)(S, S))operator- <
- (void(*)(S, S))operator-;
- bool c = (void(*)(S, S))operator+ <
- (void(*)(S, S))operator-; // expected-error {{expected '>'}}
- }
- template<typename T> void f() {
- typename T::template operator+<int> a; // expected-error {{typename specifier refers to a non-type template}} expected-error +{{}}
- // FIXME: This shouldn't say (null).
- class T::template operator+<int> b; // expected-error {{identifier followed by '<' indicates a class template specialization but (null) refers to a function template}}
- enum T::template operator+<int> c; // expected-error {{expected identifier}} expected-error {{does not declare anything}}
- enum T::template operator+<int>::E d; // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}} expected-error {{forward reference}}
- enum T::template X<int>::E e;
- T::template operator+<int>::foobar(); // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}}
- T::template operator+<int>(0); // ok
- }
- template<typename T> class operator&<T*> {}; // expected-error +{{}}
- template<typename T> class T::operator& {}; // expected-error +{{}}
- template<typename T> class S::operator&<T*> {}; // expected-error +{{}}
- }
- namespace dr302 { // dr302: yes
- struct A { A(); ~A(); };
- #if __cplusplus < 201103L
- struct B { // expected-error {{implicit default constructor for 'dr302::B' must explicitly initialize the const member 'n'}}
- const int n; // expected-note {{declared here}}
- A a;
- } b = B(); // expected-note {{first required here}}
- // Trivial default constructor C::C() is not called here.
- struct C {
- const int n;
- } c = C();
- #else
- struct B {
- const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}}
- A a;
- } b = B(); // expected-error {{call to implicitly-deleted default constructor}}
- // C::C() is called here, because even though it's trivial, it's deleted.
- struct C {
- const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}}
- } c = C(); // expected-error {{call to implicitly-deleted default constructor}}
- struct D {
- const int n = 0;
- } d = D();
- #endif
- }
- // dr303: na
- namespace dr304 { // dr304: yes
- typedef int &a;
- int n = a(); // expected-error {{requires an initializer}}
- struct S { int &b; };
- int m = S().b;
- #if __cplusplus < 201103L
- // expected-error@-3 {{requires an initializer}}
- // expected-note@-3 {{in value-initialization}}
- #else
- // expected-error@-5 {{deleted}}
- // expected-note@-7 {{reference}}
- #endif
- }
- namespace dr305 { // dr305: no
- struct A {
- typedef A C;
- };
- void f(A *a) {
- struct A {};
- a->~A();
- a->~C();
- }
- typedef A B;
- void g(B *b) {
- b->~B();
- b->~C();
- }
- void h(B *b) {
- struct B {}; // expected-note {{declared here}}
- b->~B(); // expected-error {{does not match}}
- }
- template<typename T> struct X {};
- void i(X<int>* x) {
- struct X {};
- x->~X<int>();
- x->~X();
- x->~X<char>(); // expected-error {{no member named}}
- }
- #if __cplusplus >= 201103L
- struct Y {
- template<typename T> using T1 = Y;
- };
- template<typename T> using T2 = Y;
- void j(Y *y) {
- y->~T1<int>();
- y->~T2<int>();
- }
- struct Z {
- template<typename T> using T2 = T;
- };
- void k(Z *z) {
- // FIXME: This diagnostic is terrible.
- z->~T1<int>(); // expected-error {{'T1' following the 'template' keyword does not refer to a template}} expected-error +{{}}
- z->~T2<int>(); // expected-error {{no member named '~int'}}
- z->~T2<Z>();
- }
- // FIXME: This is valid.
- namespace Q {
- template<typename A> struct R {};
- }
- template<typename A> using R = Q::R<int>;
- void qr(Q::R<int> x) { x.~R<char>(); } // expected-error {{no member named}}
- #endif
- }
- namespace dr306 { // dr306: no
- // FIXME: dup 39
- // FIXME: This should be accepted.
- struct A { struct B {}; }; // expected-note 2{{member}}
- struct C { typedef A::B B; }; // expected-note {{member}}
- struct D : A, A::B, C {};
- D::B b; // expected-error {{found in multiple base classes of different types}}
- }
- // dr307: na
- namespace dr308 { // dr308: yes
- // This is mostly an ABI library issue.
- struct A {};
- struct B : A {};
- struct C : A {};
- struct D : B, C {};
- void f() {
- try {
- throw D();
- } catch (const A&) { // expected-note {{for type 'const dr308::A &'}}
- // unreachable
- } catch (const B&) { // expected-warning {{exception of type 'const dr308::B &' will be caught by earlier handler}}
- // get here instead
- }
- }
- }
- // dr309: dup 485
- namespace dr311 { // dr311: yes
- namespace X { namespace Y {} }
- namespace X::Y {}
- #if __cplusplus <= 201402L
- // expected-error@-2 {{define each namespace separately}}
- #endif
- namespace X {
- namespace X::Y {}
- #if __cplusplus <= 201402L
- // expected-error@-2 {{define each namespace separately}}
- #endif
- }
- // FIXME: The diagnostics here are not very good.
- namespace ::dr311::X {} // expected-error 2+{{}} // expected-warning {{extra qual}}
- }
- // dr312: dup 616
- namespace dr313 { // dr313: dup 299 c++11
- struct A { operator int() const; };
- int *p = new int[A()];
- #if __cplusplus < 201103L
- // FIXME: should this be available in c++98 mode? expected-error@-2 {{extension}}
- #endif
- }
- namespace dr314 { // FIXME 314: dup 1710
- template<typename T> struct A {
- template<typename U> struct B {};
- };
- template<typename T> struct C : public A<T>::template B<T> {
- C() : A<T>::template B<T>() {}
- };
- }
- // dr315: na
- // dr316: sup 1004
- namespace dr317 { // dr317: 3.5
- void f() {} // expected-note {{previous}}
- inline void f(); // expected-error {{inline declaration of 'f' follows non-inline definition}}
- int g();
- int n = g();
- inline int g() { return 0; }
- int h();
- int m = h();
- int h() { return 0; } // expected-note {{previous}}
- inline int h(); // expected-error {{inline declaration of 'h' follows non-inline definition}}
- }
- namespace dr318 { // dr318: sup 1310
- struct A {};
- struct A::A a;
- }
- namespace dr319 { // dr319: no
- // FIXME: dup dr389
- // FIXME: We don't have a diagnostic for a name with linkage
- // having a type without linkage.
- typedef struct {
- int i;
- } *ps;
- extern "C" void f(ps);
- void g(ps); // FIXME: ill-formed, type 'ps' has no linkage
- static enum { e } a1;
- enum { e2 } a2; // FIXME: ill-formed, enum type has no linkage
- enum { n1 = 1u };
- typedef int (*pa)[n1];
- pa parr; // ok, type has linkage despite using 'n1'
- template<typename> struct X {};
- void f() {
- struct A { int n; };
- extern A a; // FIXME: ill-formed
- X<A> xa;
- typedef A B;
- extern B b; // FIXME: ill-formed
- X<B> xb;
- const int n = 1;
- typedef int (*C)[n];
- extern C c; // ok
- X<C> xc;
- }
- #if __cplusplus < 201103L
- // expected-error@-12 {{uses local type 'A'}}
- // expected-error@-9 {{uses local type 'A'}}
- #endif
- }
- namespace dr320 { // dr320: yes
- #if __cplusplus >= 201103L
- struct X {
- constexpr X() {}
- constexpr X(const X &x) : copies(x.copies + 1) {}
- unsigned copies = 0;
- };
- constexpr X f(X x) { return x; }
- constexpr unsigned g(X x) { return x.copies; }
- static_assert(f(X()).copies == g(X()) + 1, "expected one extra copy for return value");
- #endif
- }
- namespace dr321 { // dr321: dup 557
- namespace N {
- template<int> struct A {
- template<int> struct B;
- };
- template<> template<> struct A<0>::B<0>;
- void f(A<0>::B<0>);
- }
- template<> template<> struct N::A<0>::B<0> {};
- template<typename T> void g(T t) { f(t); }
- template void g(N::A<0>::B<0>);
- namespace N {
- template<typename> struct I { friend bool operator==(const I&, const I&); };
- }
- N::I<int> i, j;
- bool x = i == j;
- }
- namespace dr322 { // dr322: yes
- struct A {
- template<typename T> operator T&();
- } a;
- int &r = static_cast<int&>(a);
- int &s = a;
- }
- // dr323: no
- namespace dr324 { // dr324: yes
- struct S { int n : 1; } s; // expected-note 3{{bit-field is declared here}}
- int &a = s.n; // expected-error {{non-const reference cannot bind to bit-field}}
- int *b = &s.n; // expected-error {{address of bit-field}}
- int &c = (s.n = 0); // expected-error {{non-const reference cannot bind to bit-field}}
- int *d = &(s.n = 0); // expected-error {{address of bit-field}}
- int &e = true ? s.n : s.n; // expected-error {{non-const reference cannot bind to bit-field}}
- int *f = &(true ? s.n : s.n); // expected-error {{address of bit-field}}
- int &g = (void(), s.n); // expected-error {{non-const reference cannot bind to bit-field}}
- int *h = &(void(), s.n); // expected-error {{address of bit-field}}
- int *i = &++s.n; // expected-error {{address of bit-field}}
- }
- namespace dr326 { // dr326: yes
- struct S {};
- int test[__is_trivially_constructible(S, const S&) ? 1 : -1];
- }
- namespace dr327 { // dr327: dup 538
- struct A;
- class A {};
- class B;
- struct B {};
- }
- namespace dr328 { // dr328: yes
- struct A; // expected-note 3{{forward declaration}}
- struct B { A a; }; // expected-error {{incomplete}}
- template<typename> struct C { A a; }; // expected-error {{incomplete}}
- A *p = new A[0]; // expected-error {{incomplete}}
- }
- namespace dr329 { // dr329: 3.5
- struct B {};
- template<typename T> struct A : B {
- friend void f(A a) { g(a); }
- friend void h(A a) { g(a); } // expected-error {{undeclared}}
- friend void i(B b) {} // expected-error {{redefinition}} expected-note {{previous}}
- };
- A<int> a;
- A<char> b; // expected-note {{instantiation}}
- void test() {
- h(a); // expected-note {{instantiation}}
- }
- }
- namespace dr331 { // dr331: yes
- struct A {
- A(volatile A&); // expected-note {{candidate}}
- } const a, b(a); // expected-error {{no matching constructor}}
- }
- namespace dr332 { // dr332: dup 577
- void f(volatile void); // expected-error {{'void' as parameter must not have type qualifiers}}
- void g(const void); // expected-error {{'void' as parameter must not have type qualifiers}}
- void h(int n, volatile void); // expected-error {{'void' must be the first and only parameter}}
- }
- namespace dr333 { // dr333: yes
- int n = 0;
- int f(int(n));
- int g((int(n)));
- int h = f(g);
- }
- namespace dr334 { // dr334: yes
- template<typename T> void f() {
- T x;
- f((x, 123));
- }
- struct S {
- friend S operator,(S, int);
- friend void f(S);
- };
- template void f<S>();
- }
- // dr335: no
- namespace dr336 { // dr336: yes
- namespace Pre {
- template<class T1> class A {
- template<class T2> class B {
- template<class T3> void mf1(T3);
- void mf2();
- };
- };
- template<> template<class X> class A<int>::B {};
- template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {} // expected-error {{does not match}}
- template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}}
- }
- namespace Post {
- template<class T1> class A {
- template<class T2> class B {
- template<class T3> void mf1(T3);
- void mf2();
- };
- };
- template<> template<class X> class A<int>::B {
- template<class T> void mf1(T);
- };
- template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {}
- // FIXME: This diagnostic isn't very good.
- template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}}
- }
- }
- namespace dr337 { // dr337: yes
- template<typename T> void f(T (*)[1]);
- template<typename T> int &f(...);
- struct A { virtual ~A() = 0; };
- int &r = f<A>(0);
- // FIXME: The language rules here are completely broken. We cannot determine
- // whether an incomplete type is abstract. See DR1640, which will probably
- // supersede this one and remove this rule.
- struct B;
- int &s = f<B>(0); // expected-error {{of type 'void'}}
- struct B { virtual ~B() = 0; };
- }
- namespace dr339 { // dr339: yes
- template <int I> struct A { static const int value = I; };
- char xxx(int);
- char (&xxx(float))[2];
- template<class T> A<sizeof(xxx((T)0))> f(T) {} // expected-note {{candidate}}
- void test() {
- A<1> a = f(0);
- A<2> b = f(0.0f);
- A<3> c = f("foo"); // expected-error {{no matching function}}
- }
- char f(int);
- int f(...);
- template <class T> struct conv_int {
- static const bool value = sizeof(f(T())) == 1;
- };
- template <class T> bool conv_int2(A<sizeof(f(T()))> p);
- template<typename T> A<sizeof(f(T()))> make_A();
- int a[conv_int<char>::value ? 1 : -1];
- bool b = conv_int2<char>(A<1>());
- A<1> c = make_A<char>();
- }
- namespace dr340 { // dr340: yes
- struct A { A(int); };
- struct B { B(A, A, int); };
- int x, y;
- B b(A(x), A(y), 3);
- }
- namespace dr341 { // dr341: sup 1708
- namespace A {
- int n;
- extern "C" int &dr341_a = n; // expected-note {{previous}} expected-note {{declared with C language linkage here}}
- }
- namespace B {
- extern "C" int &dr341_a = dr341_a; // expected-error {{redefinition}}
- }
- extern "C" void dr341_b(); // expected-note {{declared with C language linkage here}}
- }
- int dr341_a; // expected-error {{declaration of 'dr341_a' in global scope conflicts with declaration with C language linkage}}
- int dr341_b; // expected-error {{declaration of 'dr341_b' in global scope conflicts with declaration with C language linkage}}
- int dr341_c; // expected-note {{declared in global scope here}}
- int dr341_d; // expected-note {{declared in global scope here}}
- namespace dr341 {
- extern "C" int dr341_c; // expected-error {{declaration of 'dr341_c' with C language linkage conflicts with declaration in global scope}}
- extern "C" void dr341_d(); // expected-error {{declaration of 'dr341_d' with C language linkage conflicts with declaration in global scope}}
- namespace A { extern "C" int dr341_e; } // expected-note {{previous}}
- namespace B { extern "C" void dr341_e(); } // expected-error {{redefinition of 'dr341_e' as different kind of symbol}}
- }
- // dr342: na
- namespace dr343 { // FIXME 343: no
- // FIXME: dup 1710
- template<typename T> struct A {
- template<typename U> struct B {};
- };
- // FIXME: In these contexts, the 'template' keyword is optional.
- template<typename T> struct C : public A<T>::B<T> { // expected-error {{use 'template'}}
- C() : A<T>::B<T>() {} // expected-error {{use 'template'}}
- };
- }
- namespace dr344 { // dr344: dup 1435
- struct A { inline virtual ~A(); };
- struct B { friend A::~A(); };
- }
- namespace dr345 { // dr345: yes
- struct A {
- struct X {};
- int X; // expected-note {{here}}
- };
- struct B {
- struct X {};
- };
- template <class T> void f(T t) { typename T::X x; } // expected-error {{refers to non-type member 'X'}}
- void f(A a, B b) {
- f(b);
- f(a); // expected-note {{instantiation}}
- }
- }
- // dr346: na
- namespace dr347 { // dr347: yes
- struct base {
- struct nested;
- static int n;
- static void f();
- void g();
- };
- struct derived : base {};
- struct derived::nested {}; // expected-error {{no struct named 'nested'}}
- int derived::n; // expected-error {{no member named 'n'}}
- void derived::f() {} // expected-error {{does not match any}}
- void derived::g() {} // expected-error {{does not match any}}
- }
- // dr348: na
- namespace dr349 { // dr349: no
- struct A {
- template <class T> operator T ***() {
- int ***p = 0;
- return p; // expected-error {{cannot initialize return object of type 'const int ***' with an lvalue of type 'int ***'}}
- }
- };
- // FIXME: This is valid.
- A a;
- const int *const *const *p1 = a; // expected-note {{in instantiation of}}
- struct B {
- template <class T> operator T ***() {
- const int ***p = 0;
- return p;
- }
- };
- // FIXME: This is invalid.
- B b;
- const int *const *const *p2 = b;
- }
- // dr351: na
- namespace dr352 { // dr352: yes
- namespace example1 {
- namespace A {
- enum E {};
- template<typename R, typename A> void foo(E, R (*)(A)); // expected-note 2{{couldn't infer template argument 'R'}}
- }
- template<typename T> void arg(T);
- template<typename T> int arg(T) = delete; // expected-note {{here}} expected-error 0-1{{extension}}
- void f(A::E e) {
- foo(e, &arg); // expected-error {{no matching function}}
- using A::foo;
- foo<int, int>(e, &arg); // expected-error {{deleted}}
- }
- int arg(int);
- void g(A::E e) {
- foo(e, &arg); // expected-error {{no matching function}}
- using A::foo;
- foo<int, int>(e, &arg); // ok, uses non-template
- }
- }
- namespace contexts {
- template<int I> void f1(int (&)[I]);
- template<int I> void f2(int (&)[I+1]); // expected-note {{couldn't infer}}
- template<int I> void f3(int (&)[I+1], int (&)[I]);
- void f() {
- int a[4];
- int b[3];
- f1(a);
- f2(a); // expected-error {{no matching function}}
- f3(a, b);
- }
- template<int I> struct S {};
- template<int I> void g1(S<I>);
- template<int I> void g2(S<I+1>); // expected-note {{couldn't infer}}
- template<int I> void g3(S<I+1>, S<I>);
- void g() {
- S<4> a;
- S<3> b;
- g1(a);
- g2(a); // expected-error {{no matching function}}
- g3(a, b);
- }
- template<typename T> void h1(T = 0); // expected-note {{couldn't infer}}
- template<typename T> void h2(T, T = 0);
- void h() {
- h1(); // expected-error {{no matching function}}
- h1(0);
- h1<int>();
- h2(0);
- }
- template<typename T> int tmpl(T);
- template<typename R, typename A> void i1(R (*)(A)); // expected-note 3{{couldn't infer}}
- template<typename R, typename A> void i2(R, A, R (*)(A)); // expected-note {{not viable}}
- void i() {
- extern int single(int);
- i1(single);
- i2(0, 0, single);
- extern int ambig(float), ambig(int);
- i1(ambig); // expected-error {{no matching function}}
- i2(0, 0, ambig);
- extern void no_match(float), no_match(int);
- i1(no_match); // expected-error {{no matching function}}
- i2(0, 0, no_match); // expected-error {{no matching function}}
- i1(tmpl); // expected-error {{no matching function}}
- i2(0, 0, tmpl);
- }
- }
- template<typename T> struct is_int;
- template<> struct is_int<int> {};
- namespace example2 {
- template<typename T> int f(T (*p)(T)) { is_int<T>(); }
- int g(int);
- int g(char);
- int i = f(g);
- }
- namespace example3 {
- template<typename T> int f(T, T (*p)(T)) { is_int<T>(); }
- int g(int);
- char g(char);
- int i = f(1, g);
- }
- namespace example4 {
- template <class T> int f(T, T (*p)(T)) { is_int<T>(); }
- char g(char);
- template <class T> T g(T);
- int i = f(1, g);
- }
- namespace example5 {
- template<int I> class A {};
- template<int I> void g(A<I+1>); // expected-note {{couldn't infer}}
- template<int I> void f(A<I>, A<I+1>);
- void h(A<1> a1, A<2> a2) {
- g(a1); // expected-error {{no matching function}}
- g<0>(a1);
- f(a1, a2);
- }
- }
- }
- // dr353 needs an IRGen test.
- namespace dr354 { // dr354: yes c++11
- // FIXME: Should we allow this in C++98 too?
- struct S {};
- template<int*> struct ptr {}; // expected-note 0-4{{here}}
- ptr<0> p0;
- ptr<(int*)0> p1;
- ptr<(float*)0> p2;
- ptr<(int S::*)0> p3;
- #if __cplusplus < 201103L
- // expected-error@-5 {{does not refer to any decl}}
- // expected-error@-5 {{does not refer to any decl}}
- // expected-error@-5 {{does not refer to any decl}}
- // expected-error@-5 {{does not refer to any decl}}
- #elif __cplusplus <= 201402L
- // expected-error@-10 {{must be cast}}
- // ok
- // expected-error@-10 {{does not match}}
- // expected-error@-10 {{does not match}}
- #else
- // expected-error@-15 {{conversion from 'int' to 'int *' is not allowed}}
- // ok
- // expected-error@-15 {{'float *' is not implicitly convertible to 'int *'}}
- // expected-error@-15 {{'int dr354::S::*' is not implicitly convertible to 'int *'}}
- #endif
- template<int*> int both();
- template<int> int both();
- int b0 = both<0>();
- int b1 = both<(int*)0>();
- #if __cplusplus < 201103L
- // expected-error@-2 {{no matching function}}
- // expected-note@-6 {{candidate}}
- // expected-note@-6 {{candidate}}
- #endif
- template<int S::*> struct ptr_mem {}; // expected-note 0-4{{here}}
- ptr_mem<0> m0;
- ptr_mem<(int S::*)0> m1;
- ptr_mem<(float S::*)0> m2;
- ptr_mem<(int *)0> m3;
- #if __cplusplus < 201103L
- // expected-error@-5 {{cannot be converted}}
- // expected-error@-5 {{is not a pointer to member constant}}
- // expected-error@-5 {{cannot be converted}}
- // expected-error@-5 {{cannot be converted}}
- #elif __cplusplus <= 201402L
- // expected-error@-10 {{must be cast}}
- // ok
- // expected-error@-10 {{does not match}}
- // expected-error@-10 {{does not match}}
- #else
- // expected-error@-15 {{conversion from 'int' to 'int dr354::S::*' is not allowed}}
- // ok
- // expected-error@-15 {{'float dr354::S::*' is not implicitly convertible to 'int dr354::S::*'}}
- // expected-error@-15 {{'int *' is not implicitly convertible to 'int dr354::S::*'}}
- #endif
- }
- struct dr355_S; // dr355: yes
- struct ::dr355_S {}; // expected-warning {{extra qualification}}
- namespace dr355 { struct ::dr355_S s; }
- // dr356: na
- namespace dr357 { // dr357: yes
- template<typename T> struct A {
- void f() const; // expected-note {{const qualified}}
- };
- template<typename T> void A<T>::f() {} // expected-error {{does not match}}
- struct B {
- template<typename T> void f();
- };
- template<typename T> void B::f() const {} // expected-error {{does not match}}
- }
- namespace dr358 { // dr358: yes
- extern "C" void dr358_f();
- namespace N {
- int var;
- extern "C" void dr358_f() { var = 10; }
- }
- }
- namespace dr359 { // dr359: yes
- // Note, the example in the DR is wrong; it doesn't contain an anonymous
- // union.
- struct E {
- union {
- struct {
- int x;
- } s;
- } v;
- union {
- struct { // expected-error {{extension}}
- int x;
- } s;
- struct S { // expected-error {{types cannot be declared in an anonymous union}}
- int x;
- } t;
- union { // expected-error {{extension}}
- int u;
- };
- };
- };
- }
- // dr362: na
- // dr363: na
- namespace dr364 { // dr364: yes
- struct S {
- static void f(int);
- void f(char);
- };
- void g() {
- S::f('a'); // expected-error {{call to non-static}}
- S::f(0);
- }
- }
- #if "foo" // expected-error {{invalid token}} dr366: yes
- #endif
- namespace dr367 { // dr367: yes
- // FIXME: These diagnostics are terrible. Don't diagnose an ill-formed global
- // array as being a VLA!
- int a[true ? throw 0 : 4]; // expected-error 2{{variable length array}}
- int b[true ? 4 : throw 0];
- int c[true ? *new int : 4]; // expected-error 2{{variable length array}}
- int d[true ? 4 : *new int];
- #if __cplusplus < 201103L
- // expected-error@-4 {{variable length array}} expected-error@-4 {{constant expression}}
- // expected-error@-3 {{variable length array}} expected-error@-3 {{constant expression}}
- #endif
- }
- namespace dr368 { // dr368: yes
- template<typename T, T> struct S {}; // expected-note {{here}}
- template<typename T> int f(S<T, T()> *); // expected-error {{function type}}
- //template<typename T> int g(S<T, (T())> *); // FIXME: crashes clang
- template<typename T> int g(S<T, true ? T() : T()> *); // expected-note {{cannot have type 'dr368::X'}}
- struct X {};
- int n = g<X>(0); // expected-error {{no matching}}
- }
- // dr370: na
- namespace dr372 { // dr372: no
- namespace example1 {
- template<typename T> struct X {
- protected:
- typedef T Type; // expected-note 2{{protected}}
- };
- template<typename T> struct Y {};
- // FIXME: These two are valid; deriving from T1<T> gives Z1 access to
- // the protected member T1<T>::Type.
- template<typename T,
- template<typename> class T1,
- template<typename> class T2> struct Z1 :
- T1<T>,
- T2<typename T1<T>::Type> {}; // expected-error {{protected}}
- template<typename T,
- template<typename> class T1,
- template<typename> class T2> struct Z2 :
- T2<typename T1<T>::Type>, // expected-error {{protected}}
- T1<T> {};
- Z1<int, X, Y> z1; // expected-note {{instantiation of}}
- Z2<int, X, Y> z2; // expected-note {{instantiation of}}
- }
- namespace example2 {
- struct X {
- private:
- typedef int Type; // expected-note {{private}}
- };
- template<typename T> struct A {
- typename T::Type t; // expected-error {{private}}
- };
- A<X> ax; // expected-note {{instantiation of}}
- }
- namespace example3 {
- struct A {
- protected:
- typedef int N; // expected-note 2{{protected}}
- };
- template<typename T> struct B {};
- template<typename U> struct C : U, B<typename U::N> {}; // expected-error {{protected}}
- template<typename U> struct D : B<typename U::N>, U {}; // expected-error {{protected}}
- C<A> x; // expected-note {{instantiation of}}
- D<A> y; // expected-note {{instantiation of}}
- }
- namespace example4 {
- class A {
- class B {};
- friend class X;
- };
- struct X : A::B {
- A::B mx;
- class Y {
- A::B my;
- };
- };
- }
- }
- namespace dr373 { // dr373: no
- // FIXME: This is valid.
- namespace X { int dr373; } // expected-note 2{{here}}
- struct dr373 { // expected-note {{here}}
- void f() {
- using namespace dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}}
- int k = dr373; // expected-error {{does not refer to a value}}
- namespace Y = dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}}
- k = Y::dr373;
- }
- };
- }
- namespace dr374 { // dr374: yes c++11
- namespace N {
- template<typename T> void f();
- template<typename T> struct A { void f(); };
- }
- template<> void N::f<char>() {}
- template<> void N::A<char>::f() {}
- template<> struct N::A<int> {};
- #if __cplusplus < 201103L
- // expected-error@-4 {{extension}} expected-note@-7 {{here}}
- // expected-error@-4 {{extension}} expected-note@-7 {{here}}
- // expected-error@-4 {{extension}} expected-note@-8 {{here}}
- #endif
- }
- // dr375: dup 345
- // dr376: na
- namespace dr377 { // dr377: yes
- enum E { // expected-error {{enumeration values exceed range of largest integer}}
- a = -__LONG_LONG_MAX__ - 1, // expected-error 0-1{{extension}}
- b = 2 * (unsigned long long)__LONG_LONG_MAX__ // expected-error 0-2{{extension}}
- };
- }
- // dr378: dup 276
- // dr379: na
- namespace dr381 { // dr381: yes
- struct A {
- int a;
- };
- struct B : virtual A {};
- struct C : B {};
- struct D : B {};
- struct E : public C, public D {};
- struct F : public A {};
- void f() {
- E e;
- e.B::a = 0; // expected-error {{ambiguous conversion}}
- F f;
- f.A::a = 1;
- }
- }
- namespace dr382 { // dr382: yes c++11
- // FIXME: Should we allow this in C++98 mode?
- struct A { typedef int T; };
- typename A::T t;
- typename dr382::A a;
- #if __cplusplus < 201103L
- // expected-error@-3 {{occurs outside of a template}}
- // expected-error@-3 {{occurs outside of a template}}
- #endif
- typename A b; // expected-error {{expected a qualified name}}
- }
- namespace dr383 { // dr383: yes
- struct A { A &operator=(const A&); };
- struct B { ~B(); };
- union C { C &operator=(const C&); };
- union D { ~D(); };
- int check[(__is_pod(A) || __is_pod(B) || __is_pod(C) || __is_pod(D)) ? -1 : 1];
- }
- namespace dr384 { // dr384: yes
- namespace N1 {
- template<typename T> struct Base {};
- template<typename T> struct X {
- struct Y : public Base<T> {
- Y operator+(int) const;
- };
- Y f(unsigned i) { return Y() + i; }
- };
- }
- namespace N2 {
- struct Z {};
- template<typename T> int *operator+(T, unsigned);
- }
- int main() {
- N1::X<N2::Z> v;
- v.f(0);
- }
- }
- namespace dr385 { // dr385: yes
- struct A { protected: void f(); };
- struct B : A { using A::f; };
- struct C : A { void g(B b) { b.f(); } };
- void h(B b) { b.f(); }
- struct D { int n; }; // expected-note {{member}}
- struct E : protected D {}; // expected-note 2{{protected}}
- struct F : E { friend int i(E); };
- int i(E e) { return e.n; } // expected-error {{protected base}} expected-error {{protected member}}
- }
- namespace dr387 { // dr387: yes
- namespace old {
- template<typename T> class number {
- number(int); // expected-note 2{{here}}
- friend number gcd(number &x, number &y) {}
- };
- void g() {
- number<double> a(3), b(4); // expected-error 2{{private}}
- a = gcd(a, b);
- b = gcd(3, 4); // expected-error {{undeclared}}
- }
- }
- namespace newer {
- template <typename T> class number {
- public:
- number(int);
- friend number gcd(number x, number y) { return 0; }
- };
- void g() {
- number<double> a(3), b(4);
- a = gcd(a, b);
- b = gcd(3, 4); // expected-error {{undeclared}}
- }
- }
- }
- // FIXME: dr388 needs codegen test
- namespace dr389 { // dr389: no
- struct S {
- typedef struct {} A;
- typedef enum {} B;
- typedef struct {} const C; // expected-note 0-2{{here}}
- typedef enum {} const D; // expected-note 0-1{{here}}
- };
- template<typename> struct T {};
- struct WithLinkage1 {};
- enum WithLinkage2 {};
- typedef struct {} *WithLinkage3a, WithLinkage3b;
- typedef enum {} WithLinkage4a, *WithLinkage4b;
- typedef S::A WithLinkage5;
- typedef const S::B WithLinkage6;
- typedef int WithLinkage7;
- typedef void (*WithLinkage8)(WithLinkage2 WithLinkage1::*, WithLinkage5 *);
- typedef T<WithLinkage5> WithLinkage9;
- typedef struct {} *WithoutLinkage1; // expected-note 0-1{{here}}
- typedef enum {} const WithoutLinkage2; // expected-note 0-1{{here}}
- // These two types don't have linkage even though they are externally visible
- // and the ODR requires them to be merged across TUs.
- typedef S::C WithoutLinkage3;
- typedef S::D WithoutLinkage4;
- typedef void (*WithoutLinkage5)(int (WithoutLinkage3::*)(char));
- #if __cplusplus >= 201103L
- // This has linkage even though its template argument does not.
- // FIXME: This is probably a defect.
- typedef T<WithoutLinkage1> WithLinkage10;
- #else
- typedef int WithLinkage10; // dummy
- typedef T<WithLinkage1> GoodArg1;
- typedef T<WithLinkage2> GoodArg2;
- typedef T<WithLinkage3a> GoodArg3a;
- typedef T<WithLinkage3b> GoodArg3b;
- typedef T<WithLinkage4a> GoodArg4a;
- typedef T<WithLinkage4b> GoodArg4b;
- typedef T<WithLinkage5> GoodArg5;
- typedef T<WithLinkage6> GoodArg6;
- typedef T<WithLinkage7> GoodArg7;
- typedef T<WithLinkage8> GoodArg8;
- typedef T<WithLinkage9> GoodArg9;
- typedef T<WithoutLinkage1> BadArg1; // expected-error{{template argument uses}}
- typedef T<WithoutLinkage2> BadArg2; // expected-error{{template argument uses}}
- typedef T<WithoutLinkage3> BadArg3; // expected-error{{template argument uses}}
- typedef T<WithoutLinkage4> BadArg4; // expected-error{{template argument uses}}
- typedef T<WithoutLinkage5> BadArg5; // expected-error{{template argument uses}}
- #endif
- extern WithLinkage1 withLinkage1;
- extern WithLinkage2 withLinkage2;
- extern WithLinkage3a withLinkage3a;
- extern WithLinkage3b withLinkage3b;
- extern WithLinkage4a withLinkage4a;
- extern WithLinkage4b withLinkage4b;
- extern WithLinkage5 withLinkage5;
- extern WithLinkage6 withLinkage6;
- extern WithLinkage7 withLinkage7;
- extern WithLinkage8 withLinkage8;
- extern WithLinkage9 withLinkage9;
- extern WithLinkage10 withLinkage10;
- // FIXME: These are all ill-formed.
- extern WithoutLinkage1 withoutLinkage1;
- extern WithoutLinkage2 withoutLinkage2;
- extern WithoutLinkage3 withoutLinkage3;
- extern WithoutLinkage4 withoutLinkage4;
- extern WithoutLinkage5 withoutLinkage5;
- // OK, extern "C".
- extern "C" {
- extern WithoutLinkage1 dr389_withoutLinkage1;
- extern WithoutLinkage2 dr389_withoutLinkage2;
- extern WithoutLinkage3 dr389_withoutLinkage3;
- extern WithoutLinkage4 dr389_withoutLinkage4;
- extern WithoutLinkage5 dr389_withoutLinkage5;
- }
- // OK, defined.
- WithoutLinkage1 withoutLinkageDef1;
- WithoutLinkage2 withoutLinkageDef2 = WithoutLinkage2();
- WithoutLinkage3 withoutLinkageDef3 = {};
- WithoutLinkage4 withoutLinkageDef4 = WithoutLinkage4();
- WithoutLinkage5 withoutLinkageDef5;
- void use(const void *);
- void use_all() {
- use(&withLinkage1); use(&withLinkage2); use(&withLinkage3a); use(&withLinkage3b);
- use(&withLinkage4a); use(&withLinkage4b); use(&withLinkage5); use(&withLinkage6);
- use(&withLinkage7); use(&withLinkage8); use(&withLinkage9); use(&withLinkage10);
- use(&withoutLinkage1); use(&withoutLinkage2); use(&withoutLinkage3);
- use(&withoutLinkage4); use(&withoutLinkage5);
- use(&dr389_withoutLinkage1); use(&dr389_withoutLinkage2);
- use(&dr389_withoutLinkage3); use(&dr389_withoutLinkage4);
- use(&dr389_withoutLinkage5);
- use(&withoutLinkageDef1); use(&withoutLinkageDef2); use(&withoutLinkageDef3);
- use(&withoutLinkageDef4); use(&withoutLinkageDef5);
- }
- void local() {
- // FIXME: This is ill-formed.
- extern WithoutLinkage1 withoutLinkageLocal;
- }
- }
- namespace dr390 { // dr390: yes
- template<typename T>
- struct A {
- A() { f(); } // expected-warning {{call to pure virt}}
- virtual void f() = 0; // expected-note {{here}}
- virtual ~A() = 0;
- };
- template<typename T> A<T>::~A() { T::error; } // expected-error {{cannot be used prior to}}
- template<typename T> void A<T>::f() { T::error; } // ok, not odr-used
- struct B : A<int> { // expected-note 2{{in instantiation of}}
- void f() {}
- } b;
- }
- namespace dr391 { // dr391: yes c++11
- // FIXME: Should this apply to C++98 too?
- class A { A(const A&); }; // expected-note 0-1{{here}}
- A fa();
- const A &a = fa();
- #if __cplusplus < 201103L
- // expected-error@-2 {{C++98 requires an accessible copy constructor}}
- #endif
- struct B { B(const B&) = delete; }; // expected-error 0-1{{extension}} expected-note 0-1{{here}}
- B fb();
- const B &b = fb();
- #if __cplusplus < 201103L
- // expected-error@-2 {{deleted}}
- #endif
- template<typename T>
- struct C {
- C(const C&) { T::error; }
- };
- C<int> fc();
- const C<int> &c = fc();
- }
- // dr392 FIXME write codegen test
- // dr394: na
- namespace dr395 { // dr395: yes
- struct S {
- template <typename T, int N>(&operator T())[N]; // expected-error {{cannot specify any part of a return type}}
- template <typename T, int N> operator(T (&)[N])(); // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error +{{}}
- template <typename T> operator T *() const { return 0; }
- template <typename T, typename U> operator T U::*() const { return 0; }
- template <typename T, typename U> operator T (U::*)()() const { return 0; } // expected-error +{{}}
- };
- struct null1_t {
- template <class T, class U> struct ptr_mem_fun_t {
- typedef T (U::*type)();
- };
- template <class T, class U>
- operator typename ptr_mem_fun_t<T, U>::type() const { // expected-note {{couldn't infer}}
- return 0;
- }
- } null1;
- int (S::*p)() = null1; // expected-error {{no viable conversion}}
- template <typename T> using id = T; // expected-error 0-1{{extension}}
- struct T {
- template <typename T, int N> operator id<T[N]> &();
- template <typename T, typename U> operator id<T (U::*)()>() const;
- };
- struct null2_t {
- template<class T, class U> using ptr_mem_fun_t = T (U::*)(); // expected-error 0-1{{extension}}
- template<class T, class U> operator ptr_mem_fun_t<T, U>() const { return 0; };
- } null2;
- int (S::*q)() = null2;
- }
- namespace dr396 { // dr396: yes
- void f() {
- auto int a(); // expected-error {{storage class on function}}
- int (i); // expected-note {{previous}}
- auto int (i); // expected-error {{redefinition}}
- #if __cplusplus >= 201103L
- // expected-error@-4 {{'auto' storage class}} expected-error@-2 {{'auto' storage class}}
- #endif
- }
- }
- // dr397: sup 1823
- namespace dr398 { // dr398: yes
- namespace example1 {
- struct S {
- static int const I = 42;
- };
- template <int N> struct X {};
- template <typename T> void f(X<T::I> *) {}
- template <typename T> void f(X<T::J> *) {}
- void foo() { f<S>(0); }
- }
- namespace example2 {
- template <int I> struct X {};
- template <template <class T> class> struct Z {};
- template <class T> void f(typename T::Y *) {} // expected-note 2{{substitution failure}}
- template <class T> void g(X<T::N> *) {} // expected-note {{substitution failure}}
- template <class T> void h(Z<T::template TT> *) {} // expected-note {{substitution failure}}
- struct A {};
- struct B {
- int Y;
- };
- struct C {
- typedef int N;
- };
- struct D {
- typedef int TT;
- };
- void test() {
- f<A>(0); // expected-error {{no matching function}}
- f<B>(0); // expected-error {{no matching function}}
- g<C>(0); // expected-error {{no matching function}}
- h<D>(0); // expected-error {{no matching function}}
- }
- }
- }
|