diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/CXX/dcl.decl/dcl.meaning/dcl.fct/dcl.fct.def.default/p1.cpp | 4 | ||||
-rw-r--r-- | test/CodeGenCXX/member-init-ctor.cpp | 14 | ||||
-rw-r--r-- | test/SemaCXX/cxx0x-defaulted-functions.cpp | 60 | ||||
-rw-r--r-- | test/SemaCXX/implicit-exception-spec.cpp | 17 | ||||
-rw-r--r-- | test/SemaCXX/member-init.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/type-traits.cpp | 8 | ||||
-rw-r--r-- | test/SemaTemplate/instantiation-depth.cpp | 20 |
7 files changed, 96 insertions, 29 deletions
diff --git a/test/CXX/dcl.decl/dcl.meaning/dcl.fct/dcl.fct.def.default/p1.cpp b/test/CXX/dcl.decl/dcl.meaning/dcl.fct/dcl.fct.def.default/p1.cpp index 15efb48477..21f71f0541 100644 --- a/test/CXX/dcl.decl/dcl.meaning/dcl.fct/dcl.fct.def.default/p1.cpp +++ b/test/CXX/dcl.decl/dcl.meaning/dcl.fct/dcl.fct.def.default/p1.cpp @@ -4,9 +4,11 @@ // [...] // -- not have default arguments struct DefArg { + static DefArg &&make(); DefArg(int n = 5) = default; // expected-error {{an explicitly-defaulted constructor cannot have default arguments}} - DefArg(const DefArg &DA = DefArg(2)) = default; // expected-error {{an explicitly-defaulted constructor cannot have default arguments}} + DefArg(const DefArg &DA = make()) = default; // expected-error {{an explicitly-defaulted constructor cannot have default arguments}} DefArg(const DefArg &DA, int k = 3) = default; // expected-error {{an explicitly-defaulted copy constructor cannot have default arguments}} + DefArg(DefArg &&DA = make()) = default; // expected-error {{an explicitly-defaulted constructor cannot have default arguments}} DefArg(DefArg &&DA, int k = 3) = default; // expected-error {{an explicitly-defaulted move constructor cannot have default arguments}} DefArg &operator=(const DefArg&, int k = 4) = default; // expected-error {{parameter of overloaded 'operator=' cannot have a default argument}} DefArg &operator=(DefArg&&, int k = 4) = default; // expected-error {{parameter of overloaded 'operator=' cannot have a default argument}} diff --git a/test/CodeGenCXX/member-init-ctor.cpp b/test/CodeGenCXX/member-init-ctor.cpp deleted file mode 100644 index 2172394257..0000000000 --- a/test/CodeGenCXX/member-init-ctor.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - | FileCheck %s - -bool b(); -struct S { - int n = b() ? S().n + 1 : 0; -}; - -S s; - -// CHECK: define {{.*}} @_ZN1SC2Ev( -// CHECK-NOT } -// CHECK: call {{.*}} @_Z1bv() -// CHECK-NOT } -// CHECK: call {{.*}} @_ZN1SC1Ev( diff --git a/test/SemaCXX/cxx0x-defaulted-functions.cpp b/test/SemaCXX/cxx0x-defaulted-functions.cpp index 595d428806..61c4c3338c 100644 --- a/test/SemaCXX/cxx0x-defaulted-functions.cpp +++ b/test/SemaCXX/cxx0x-defaulted-functions.cpp @@ -57,3 +57,63 @@ struct Friends { friend S<bar>::S(const S&); friend S<bar>::S(S&&); }; + +namespace DefaultedFnExceptionSpec { + // DR1330: The exception-specification of an implicitly-declared special + // member function is evaluated as needed. + template<typename T> T &&declval(); + template<typename T> struct pair { + pair(const pair&) noexcept(noexcept(T(declval<T>()))); + }; + + struct Y; + struct X { X(); X(const Y&); }; + struct Y { pair<X> p; }; + + template<typename T> + struct A { + pair<T> p; + }; + struct B { + B(); + B(const A<B>&); + }; + + // Don't crash here. + void f() { + X x = X(); + (void)noexcept(B(declval<B>())); + } + + template<typename T> + struct Error { + // FIXME: Type canonicalization causes all the errors to point at the first + // declaration which has the type 'void () noexcept (T::error)'. We should + // get one error for 'Error<int>::Error()' and one for 'Error<int>::~Error()'. + void f() noexcept(T::error); // expected-error 2{{has no members}} + + Error() noexcept(T::error); + Error(const Error&) noexcept(T::error); + Error(Error&&) noexcept(T::error); + Error &operator=(const Error&) noexcept(T::error); + Error &operator=(Error&&) noexcept(T::error); + ~Error() noexcept(T::error); + }; + + struct DelayImplicit { + Error<int> e; + }; + + // Don't instantiate the exception specification here. + void test1(decltype(declval<DelayImplicit>() = DelayImplicit(DelayImplicit()))); + void test2(decltype(declval<DelayImplicit>() = declval<const DelayImplicit>())); + void test3(decltype(DelayImplicit(declval<const DelayImplicit>()))); + + // Any odr-use causes the exception specification to be evaluated. + struct OdrUse { // \ + expected-note {{instantiation of exception specification for 'Error'}} \ + expected-note {{instantiation of exception specification for '~Error'}} + Error<int> e; + }; + OdrUse use; // expected-note {{implicit default constructor for 'DefaultedFnExceptionSpec::OdrUse' first required here}} +} diff --git a/test/SemaCXX/implicit-exception-spec.cpp b/test/SemaCXX/implicit-exception-spec.cpp index 25316f8d51..b29cff5c5d 100644 --- a/test/SemaCXX/implicit-exception-spec.cpp +++ b/test/SemaCXX/implicit-exception-spec.cpp @@ -17,7 +17,7 @@ namespace InClassInitializers { // is false. bool ThrowSomething() noexcept(false); struct ConstExpr { - bool b = noexcept(ConstExpr()) && ThrowSomething(); // expected-error {{exception specification is not available until end of class definition}} + bool b = noexcept(ConstExpr()) && ThrowSomething(); // expected-error {{cannot be used by non-static data member initializer}} }; // We can use it now. bool w = noexcept(ConstExpr()); @@ -25,18 +25,27 @@ namespace InClassInitializers { // Much more obviously broken: we can't parse the initializer without already // knowing whether it produces a noexcept expression. struct TemplateArg { - int n = ExceptionIf<noexcept(TemplateArg())>::f(); // expected-error {{exception specification is not available until end of class definition}} + int n = ExceptionIf<noexcept(TemplateArg())>::f(); // expected-error {{cannot be used by non-static data member initializer}} }; bool x = noexcept(TemplateArg()); // And within a nested class. + // FIXME: The diagnostic location is terrible here. struct Nested { struct Inner { - int n = ExceptionIf<noexcept(Nested())>::f(); // expected-error {{exception specification is not available until end of class definition}} - } inner; + int n = ExceptionIf<noexcept(Nested())>::f(); + } inner; // expected-error {{cannot be used by non-static data member initializer}} }; bool y = noexcept(Nested()); bool z = noexcept(Nested::Inner()); + + struct Nested2 { + struct Inner; + int n = Inner().n; // expected-error {{cannot be used by non-static data member initializer}} + struct Inner { + int n = ExceptionIf<noexcept(Nested())>::f(); + } inner; + }; } namespace ExceptionSpecification { diff --git a/test/SemaCXX/member-init.cpp b/test/SemaCXX/member-init.cpp index 3ca41a0563..a13941fce5 100644 --- a/test/SemaCXX/member-init.cpp +++ b/test/SemaCXX/member-init.cpp @@ -14,7 +14,7 @@ public: bool b(); int k; struct Recurse { - int &n = b() ? Recurse().n : k; // ok + int &n = b() ? Recurse().n : k; // expected-error {{defaulted default constructor of 'Recurse' cannot be used by non-static data member initializer which appears before end of class definition}} }; struct UnknownBound { diff --git a/test/SemaCXX/type-traits.cpp b/test/SemaCXX/type-traits.cpp index 63286e6e13..bf590f9c72 100644 --- a/test/SemaCXX/type-traits.cpp +++ b/test/SemaCXX/type-traits.cpp @@ -1384,9 +1384,6 @@ void has_nothrow_copy() { { int arr[F(__has_nothrow_copy(cvoid))]; } } -template<bool b> struct assert_expr; -template<> struct assert_expr<true> {}; - void has_nothrow_constructor() { { int arr[T(__has_nothrow_constructor(Int))]; } { int arr[T(__has_nothrow_constructor(IntAr))]; } @@ -1415,11 +1412,6 @@ void has_nothrow_constructor() { { int arr[F(__has_nothrow_constructor(void))]; } { int arr[F(__has_nothrow_constructor(cvoid))]; } { int arr[F(__has_nothrow_constructor(HasTemplateCons))]; } - - // While parsing an in-class initializer, the constructor is not known to be - // non-throwing yet. - struct HasInClassInit { int n = (assert_expr<!__has_nothrow_constructor(HasInClassInit)>(), 0); }; - { int arr[T(__has_nothrow_constructor(HasInClassInit))]; } } void has_virtual_destructor() { diff --git a/test/SemaTemplate/instantiation-depth.cpp b/test/SemaTemplate/instantiation-depth.cpp index 8e1b80368d..c0b8bb2a12 100644 --- a/test/SemaTemplate/instantiation-depth.cpp +++ b/test/SemaTemplate/instantiation-depth.cpp @@ -2,12 +2,30 @@ // RUN: %clang -fsyntax-only -Xclang -verify -ftemplate-depth-5 -ftemplate-backtrace-limit=4 %s // RUN: %clang -fsyntax-only -Xclang -verify -ftemplate-depth=5 -ftemplate-backtrace-limit=4 %s +#ifndef NOEXCEPT + template<typename T> struct X : X<T*> { }; \ // expected-error{{recursive template instantiation exceeded maximum depth of 5}} \ // expected-note 3 {{instantiation of template class}} \ // expected-note {{skipping 2 contexts in backtrace}} \ // expected-note {{use -ftemplate-depth=N to increase recursive template instantiation depth}} -void test() { +void test() { (void)sizeof(X<int>); // expected-note {{instantiation of template class}} } + +#else + +// RUN: %clang_cc1 -fsyntax-only -verify -ftemplate-depth 5 -ftemplate-backtrace-limit 4 -std=c++11 -DNOEXCEPT %s + +template<typename T> struct S { + S() noexcept(noexcept(T())); +}; +struct T : S<T> {}; \ +// expected-error{{recursive template instantiation exceeded maximum depth of 5}} \ +// expected-note 4 {{in instantiation of exception spec}} \ +// expected-note {{skipping 2 contexts in backtrace}} \ +// expected-note {{use -ftemplate-depth=N to increase recursive template instantiation depth}} +T t; // expected-note {{implicit default constructor for 'T' first required here}} + +#endif |