Index: include/clang/Frontend/CompilerInstance.h =================================================================== --- include/clang/Frontend/CompilerInstance.h +++ include/clang/Frontend/CompilerInstance.h @@ -779,6 +779,9 @@ void addDependencyCollector(std::shared_ptr Listener) { DependencyCollectors.push_back(std::move(Listener)); } + + /// load plugins that were added by -load + void loadPlugins(); }; } // end namespace clang Index: lib/Frontend/ASTUnit.cpp =================================================================== --- lib/Frontend/ASTUnit.cpp +++ lib/Frontend/ASTUnit.cpp @@ -1135,6 +1135,8 @@ llvm::CrashRecoveryContextCleanupRegistrar ActCleanup(Act.get()); + Clang->loadPlugins(); + if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) goto error; Index: lib/Frontend/CompilerInstance.cpp =================================================================== --- lib/Frontend/CompilerInstance.cpp +++ lib/Frontend/CompilerInstance.cpp @@ -45,6 +45,7 @@ #include "llvm/Support/Signals.h" #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Support/DynamicLibrary.h" #include #include #include @@ -1752,3 +1753,15 @@ return false; } void CompilerInstance::resetAndLeakSema() { BuryPointer(takeSema()); } + +void +CompilerInstance::loadPlugins(){ + // Load any requested plugins. + for (unsigned i = 0, e = getFrontendOpts().Plugins.size(); i != e; ++i) { + const std::string &Path = getFrontendOpts().Plugins[i]; + std::string Error; + if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error)) + getDiagnostics().Report(diag::err_fe_unable_to_load_plugin) + << Path << Error; + } +} Index: lib/FrontendTool/ExecuteCompilerInvocation.cpp =================================================================== --- lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -185,14 +185,8 @@ } // Load any requested plugins. - for (unsigned i = 0, - e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) { - const std::string &Path = Clang->getFrontendOpts().Plugins[i]; - std::string Error; - if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error)) - Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin) - << Path << Error; - } + Clang->loadPlugins(); + // Honor -mllvm. // Index: test/CXX/drs/dr3xx.cpp =================================================================== --- test/CXX/drs/dr3xx.cpp +++ /dev/null @@ -1,1291 +0,0 @@ -// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors - -namespace dr300 { // dr300: yes - template void f(R (&)(A)) {} - int g(int); - void h() { f(g); } -} - -namespace dr301 { // dr301: yes - // see also dr38 - struct S; - template void operator+(T, T); - void operator-(S, S); - - void f() { - bool a = (void(*)(S, S))operator+ < - (void(*)(S, S))operator+; - bool b = (void(*)(S, S))operator- < - (void(*)(S, S))operator-; - bool c = (void(*)(S, S))operator+ < - (void(*)(S, S))operator-; // expected-error {{expected '>'}} - } - - template void f() { - typename T::template operator+ a; // expected-error {{typename specifier refers to a non-type template}} expected-error +{{}} - // FIXME: This shouldn't say (null). - class T::template operator+ b; // expected-error {{identifier followed by '<' indicates a class template specialization but (null) refers to a function template}} - enum T::template operator+ c; // expected-error {{expected identifier}} expected-error {{does not declare anything}} - enum T::template operator+::E d; // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}} expected-error {{forward reference}} - enum T::template X::E e; - T::template operator+::foobar(); // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}} - T::template operator+(0); // ok - } - - template class operator& {}; // expected-error +{{}} - template class T::operator& {}; // expected-error +{{}} - template class S::operator& {}; // 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 struct X {}; - void i(X* x) { - struct X {}; - x->~X(); - x->~X(); - x->~X(); // expected-error {{no member named}} - } - -#if __cplusplus >= 201103L - struct Y { - template using T1 = Y; - }; - template using T2 = Y; - void j(Y *y) { - y->~T1(); - y->~T2(); - } - struct Z { - template using T2 = T; - }; - void k(Z *z) { - // FIXME: This diagnostic is terrible. - z->~T1(); // expected-error {{'T1' following the 'template' keyword does not refer to a template}} expected-error +{{}} - z->~T2(); // expected-error {{no member named '~int'}} - z->~T2(); - } - - // FIXME: This is valid. - namespace Q { - template struct R {}; - } - template using R = Q::R; - void qr(Q::R x) { x.~R(); } // 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 struct A { - template struct B {}; - }; - template struct C : public A::template B { - C() : A::template B() {} - }; -} - -// 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 struct X {}; - - void f() { - struct A { int n; }; - extern A a; // FIXME: ill-formed - X xa; - - typedef A B; - extern B b; // FIXME: ill-formed - X xb; - - const int n = 1; - typedef int (*C)[n]; - extern C c; // ok - X 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 struct A { - template struct B; - }; - template<> template<> struct A<0>::B<0>; - void f(A<0>::B<0>); - } - template<> template<> struct N::A<0>::B<0> {}; - - template void g(T t) { f(t); } - template void g(N::A<0>::B<0>); - - namespace N { - template struct I { friend bool operator==(const I&, const I&); }; - } - N::I i, j; - bool x = i == j; -} - -namespace dr322 { // dr322: yes - struct A { - template operator T&(); - } a; - int &r = static_cast(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 struct C { A a; }; // expected-error {{incomplete}} - A *p = new A[0]; // expected-error {{incomplete}} -} - -namespace dr329 { // dr329: 3.5 - struct B {}; - template 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 a; - A 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 void f() { - T x; - f((x, 123)); - } - struct S { - friend S operator,(S, int); - friend void f(S); - }; - template void f(); -} - -// dr335: no - -namespace dr336 { // dr336: yes - namespace Pre { - template class A { - template class B { - template void mf1(T3); - void mf2(); - }; - }; - template<> template class A::B {}; - template<> template<> template void A::B::mf1(T t) {} // expected-error {{does not match}} - template template<> void A::B::mf2() {} // expected-error {{does not refer into a class}} - } - namespace Post { - template class A { - template class B { - template void mf1(T3); - void mf2(); - }; - }; - template<> template class A::B { - template void mf1(T); - }; - template<> template<> template void A::B::mf1(T t) {} - // FIXME: This diagnostic isn't very good. - template template<> void A::B::mf2() {} // expected-error {{does not refer into a class}} - } -} - -namespace dr337 { // dr337: yes - template void f(T (*)[1]); - template int &f(...); - - struct A { virtual ~A() = 0; }; - int &r = f(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(0); // expected-error {{of type 'void'}} - struct B { virtual ~B() = 0; }; -} - -namespace dr339 { // dr339: yes - template struct A { static const int value = I; }; - - char xxx(int); - char (&xxx(float))[2]; - - template A 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 struct conv_int { - static const bool value = sizeof(f(T())) == 1; - }; - - template bool conv_int2(A p); - - template A make_A(); - - int a[conv_int::value ? 1 : -1]; - bool b = conv_int2(A<1>()); - A<1> c = make_A(); -} - -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 struct A { - template struct B {}; - }; - // FIXME: In these contexts, the 'template' keyword is optional. - template struct C : public A::B { // expected-error {{use 'template'}} - C() : A::B() {} // 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 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 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 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 void foo(E, R (*)(A)); // expected-note 2{{couldn't infer template argument 'R'}} - } - - template void arg(T); - template 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(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(e, &arg); // ok, uses non-template - } - } - - namespace contexts { - template void f1(int (&)[I]); - template void f2(int (&)[I+1]); // expected-note {{couldn't infer}} - template 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 struct S {}; - template void g1(S); - template void g2(S); // expected-note {{couldn't infer}} - template void g3(S, S); - void g() { - S<4> a; - S<3> b; - g1(a); - g2(a); // expected-error {{no matching function}} - g3(a, b); - } - - template void h1(T = 0); // expected-note {{couldn't infer}} - template void h2(T, T = 0); - void h() { - h1(); // expected-error {{no matching function}} - h1(0); - h1(); - h2(0); - } - - template int tmpl(T); - template void i1(R (*)(A)); // expected-note 3{{couldn't infer}} - template 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 struct is_int; - template<> struct is_int {}; - - namespace example2 { - template int f(T (*p)(T)) { is_int(); } - int g(int); - int g(char); - int i = f(g); - } - - namespace example3 { - template int f(T, T (*p)(T)) { is_int(); } - int g(int); - char g(char); - int i = f(1, g); - } - - namespace example4 { - template int f(T, T (*p)(T)) { is_int(); } - char g(char); - template T g(T); - int i = f(1, g); - } - - namespace example5 { - template class A {}; - template void g(A); // expected-note {{couldn't infer}} - template void f(A, A); - 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 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 both(); - template 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 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 struct A { - void f() const; // expected-note {{const qualified}} - }; - template void A::f() {} // expected-error {{does not match}} - - struct B { - template void f(); - }; - template 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 struct S {}; // expected-note {{here}} - template int f(S *); // expected-error {{function type}} - //template int g(S *); // FIXME: crashes clang - template int g(S *); // expected-note {{cannot have type 'dr368::X'}} - struct X {}; - int n = g(0); // expected-error {{no matching}} -} - -// dr370: na - -namespace dr372 { // dr372: no - namespace example1 { - template struct X { - protected: - typedef T Type; // expected-note 2{{protected}} - }; - template struct Y {}; - - // FIXME: These two are valid; deriving from T1 gives Z1 access to - // the protected member T1::Type. - template class T1, - template class T2> struct Z1 : - T1, - T2::Type> {}; // expected-error {{protected}} - - template class T1, - template class T2> struct Z2 : - T2::Type>, // expected-error {{protected}} - T1 {}; - - Z1 z1; // expected-note {{instantiation of}} - Z2 z2; // expected-note {{instantiation of}} - } - - namespace example2 { - struct X { - private: - typedef int Type; // expected-note {{private}} - }; - template struct A { - typename T::Type t; // expected-error {{private}} - }; - A ax; // expected-note {{instantiation of}} - } - - namespace example3 { - struct A { - protected: - typedef int N; // expected-note 2{{protected}} - }; - - template struct B {}; - template struct C : U, B {}; // expected-error {{protected}} - template struct D : B, U {}; // expected-error {{protected}} - - C x; // expected-note {{instantiation of}} - D 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 void f(); - template struct A { void f(); }; - } - template<> void N::f() {} - template<> void N::A::f() {} - template<> struct N::A {}; -#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 struct Base {}; - template struct X { - struct Y : public Base { - Y operator+(int) const; - }; - Y f(unsigned i) { return Y() + i; } - }; - } - - namespace N2 { - struct Z {}; - template int *operator+(T, unsigned); - } - - int main() { - N1::X 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 class number { - number(int); // expected-note 2{{here}} - friend number gcd(number &x, number &y) {} - }; - - void g() { - number a(3), b(4); // expected-error 2{{private}} - a = gcd(a, b); - b = gcd(3, 4); // expected-error {{undeclared}} - } - } - - namespace newer { - template class number { - public: - number(int); - friend number gcd(number x, number y) { return 0; } - }; - - void g() { - number 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 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 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 WithLinkage10; -#else - typedef int WithLinkage10; // dummy - - typedef T GoodArg1; - typedef T GoodArg2; - typedef T GoodArg3a; - typedef T GoodArg3b; - typedef T GoodArg4a; - typedef T GoodArg4b; - typedef T GoodArg5; - typedef T GoodArg6; - typedef T GoodArg7; - typedef T GoodArg8; - typedef T GoodArg9; - - typedef T BadArg1; // expected-error{{template argument uses}} - typedef T BadArg2; // expected-error{{template argument uses}} - typedef T BadArg3; // expected-error{{template argument uses}} - typedef T BadArg4; // expected-error{{template argument uses}} - typedef T 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 - struct A { - A() { f(); } // expected-warning {{call to pure virt}} - virtual void f() = 0; // expected-note {{here}} - virtual ~A() = 0; - }; - template A::~A() { T::error; } // expected-error {{cannot be used prior to}} - template void A::f() { T::error; } // ok, not odr-used - struct B : A { // 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 - struct C { - C(const C&) { T::error; } - }; - C fc(); - const C &c = fc(); -} - -// dr392 FIXME write codegen test -// dr394: na - -namespace dr395 { // dr395: yes - struct S { - template (&operator T())[N]; // expected-error {{cannot specify any part of a return type}} - template operator(T (&)[N])(); // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error +{{}} - template operator T *() const { return 0; } - template operator T U::*() const { return 0; } - template operator T (U::*)()() const { return 0; } // expected-error +{{}} - }; - - struct null1_t { - template struct ptr_mem_fun_t { - typedef T (U::*type)(); - }; - - template - operator typename ptr_mem_fun_t::type() const { // expected-note {{couldn't infer}} - return 0; - } - } null1; - int (S::*p)() = null1; // expected-error {{no viable conversion}} - - template using id = T; // expected-error 0-1{{extension}} - - struct T { - template operator id &(); - template operator id() const; - }; - - struct null2_t { - template using ptr_mem_fun_t = T (U::*)(); // expected-error 0-1{{extension}} - template operator ptr_mem_fun_t() 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 struct X {}; - template void f(X *) {} - template void f(X *) {} - void foo() { f(0); } - } - - namespace example2 { - template struct X {}; - template