diff options
| author | Douglas Gregor <dgregor@apple.com> | 2011-11-07 20:56:01 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2011-11-07 20:56:01 +0000 |
| commit | 5d1b4e3d1f63a7761337cfc4535eb10d5ee3ec4a (patch) | |
| tree | 6f75dadf4870230820e1f48deb2d30fc04ccb9d9 /clang/test/CXX | |
| parent | 7f076cb6cc537a1ef77bf2a16549394f03605d33 (diff) | |
| download | bcm5719-llvm-5d1b4e3d1f63a7761337cfc4535eb10d5ee3ec4a.tar.gz bcm5719-llvm-5d1b4e3d1f63a7761337cfc4535eb10d5ee3ec4a.zip | |
When we notice that a member function is defined with "= delete" or "=
default", make a note of which is used when creating the
initial declaration. Previously, we would wait until later to handle
default/delete as a definition, but this is too late: when adding the
declaration, we already treated the declaration as "user-provided"
when in fact it was merely "user-declared".
Fixes PR10861 and PR10442, along with a bunch of FIXMEs.
llvm-svn: 144011
Diffstat (limited to 'clang/test/CXX')
| -rw-r--r-- | clang/test/CXX/basic/basic.types/p10.cpp | 1 | ||||
| -rw-r--r-- | clang/test/CXX/class/p6-0x.cpp | 15 | ||||
| -rw-r--r-- | clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp | 12 | ||||
| -rw-r--r-- | clang/test/CXX/special/class.ctor/p5-0x.cpp | 14 | ||||
| -rw-r--r-- | clang/test/CXX/special/class.temporary/p1.cpp | 3 |
5 files changed, 33 insertions, 12 deletions
diff --git a/clang/test/CXX/basic/basic.types/p10.cpp b/clang/test/CXX/basic/basic.types/p10.cpp index 3b438d15f28..1f66e5522df 100644 --- a/clang/test/CXX/basic/basic.types/p10.cpp +++ b/clang/test/CXX/basic/basic.types/p10.cpp @@ -18,6 +18,7 @@ struct UserProvDtor { constexpr UserProvDtor(); // expected-error {{non-literal type 'UserProvDtor' cannot have constexpr members}} ~UserProvDtor(); // expected-note {{has a user-provided destructor}} }; + struct NonTrivDtor { constexpr NonTrivDtor(); // expected-error {{non-literal type 'NonTrivDtor' cannot have constexpr members}} virtual ~NonTrivDtor() = default; // expected-note {{has a non-trivial destructor}} diff --git a/clang/test/CXX/class/p6-0x.cpp b/clang/test/CXX/class/p6-0x.cpp index 3384af09c78..f2cf4828211 100644 --- a/clang/test/CXX/class/p6-0x.cpp +++ b/clang/test/CXX/class/p6-0x.cpp @@ -13,3 +13,18 @@ static_assert(!__is_trivial(NonTrivial2), "NonTrivial2 is trivial"); static_assert(!__is_trivial(NonTrivial3), "NonTrivial3 is trivial"); static_assert(!__is_trivial(NonTrivial4), "NonTrivial4 is trivial"); static_assert(!__is_trivial(NonTrivial5), "NonTrivial5 is trivial"); + +struct Trivial2 { + Trivial2() = default; + Trivial2(const Trivial2 &) = default; + Trivial2(Trivial2 &&) = default; + Trivial2 &operator=(const Trivial2 &) = default; + Trivial2 &operator=(Trivial2 &) = default; + ~Trivial2() = default; +}; + +class NonTrivial6 { ~NonTrivial6(); }; + +NonTrivial6::~NonTrivial6() = default; + +static_assert(!__is_trivial(NonTrivial6), "NonTrivial6 is trivial"); diff --git a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp index 13b02c014e4..ac8794f455e 100644 --- a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp +++ b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp @@ -64,3 +64,15 @@ struct NonAggr6 { int n; }; NonAggr6 na6 = { 42 }; // expected-error {{non-aggregate type 'NonAggr6'}} + +struct DefaultedAggr { + int n; + + DefaultedAggr() = default; + DefaultedAggr(const DefaultedAggr &) = default; + DefaultedAggr(DefaultedAggr &&) = default; + DefaultedAggr &operator=(const DefaultedAggr &) = default; + DefaultedAggr &operator=(DefaultedAggr &) = default; + ~DefaultedAggr() = default; +}; +DefaultedAggr da = { 42 } ; diff --git a/clang/test/CXX/special/class.ctor/p5-0x.cpp b/clang/test/CXX/special/class.ctor/p5-0x.cpp index de2dea5be16..c8d206ae377 100644 --- a/clang/test/CXX/special/class.ctor/p5-0x.cpp +++ b/clang/test/CXX/special/class.ctor/p5-0x.cpp @@ -48,10 +48,8 @@ class Deleted3a { const int a; }; // expected-note {{here}} \ Deleted3a d3a; // expected-error {{deleted constructor}} class Deleted3b { const DefaultedDefCtor1 a[42]; }; // expected-note {{here}} Deleted3b d3b; // expected-error {{deleted constructor}} -// FIXME: clang implements the pre-FDIS rule, under which DefaultedDefCtor2's -// default constructor is user-provided. -class Deleted3c { const DefaultedDefCtor2 a; }; // desired-note {{here}} -Deleted3c d3c; // desired-error {{deleted constructor}} +class Deleted3c { const DefaultedDefCtor2 a; }; // expected-note {{deleted}} +Deleted3c d3c; // expected-error {{deleted constructor}} class NotDeleted3a { const int a = 0; }; NotDeleted3a nd3a; class NotDeleted3b { const DefaultedDefCtor1 a[42] = {}; }; @@ -159,11 +157,7 @@ static_assert(!__has_trivial_constructor(NonTrivialDefCtor6), "NonTrivialDefCtor // Otherwise, the default constructor is non-trivial. class Trivial2 { Trivial2() = delete; }; -//static_assert(__has_trivial_constructor(Trivial2), "NonTrivialDefCtor2 is trivial"); -// FIXME: clang implements the pre-FDIS rule, under which this class is non-trivial. -static_assert(!__has_trivial_constructor(Trivial2), "NonTrivialDefCtor2 is trivial"); +static_assert(__has_trivial_constructor(Trivial2), "NonTrivialDefCtor2 is trivial"); class Trivial3 { Trivial3() = default; }; -//static_assert(__has_trivial_constructor(Trivial3), "NonTrivialDefCtor3 is trivial"); -// FIXME: clang implements the pre-FDIS rule, under which this class is non-trivial. -static_assert(!__has_trivial_constructor(Trivial3), "NonTrivialDefCtor3 is trivial"); +static_assert(__has_trivial_constructor(Trivial3), "NonTrivialDefCtor3 is trivial"); diff --git a/clang/test/CXX/special/class.temporary/p1.cpp b/clang/test/CXX/special/class.temporary/p1.cpp index 384b1f89fda..4f6ac0a0029 100644 --- a/clang/test/CXX/special/class.temporary/p1.cpp +++ b/clang/test/CXX/special/class.temporary/p1.cpp @@ -31,8 +31,7 @@ namespace test1 { void test() { A a; - // FIXME: this error about variadics is bogus - foo(a); // expected-error {{calling a private constructor of class 'test1::A'}} expected-error {{cannot pass object of non-trivial type 'test1::A' through variadic function}} + foo(a); // expected-error {{calling a private constructor of class 'test1::A'}} } } |

