diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Analysis/initializer.cpp | 23 | ||||
-rw-r--r-- | clang/test/CXX/drs/dr16xx.cpp | 94 | ||||
-rw-r--r-- | clang/test/CXX/drs/dr18xx.cpp | 11 | ||||
-rw-r--r-- | clang/test/CXX/special/class.copy/p11.0x.copy.cpp | 13 | ||||
-rw-r--r-- | clang/test/CXX/special/class.copy/p11.0x.move.cpp | 2 | ||||
-rw-r--r-- | clang/test/CXX/special/class.ctor/p5-0x.cpp | 6 | ||||
-rw-r--r-- | clang/test/CXX/temp/temp.param/p5.cpp | 12 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp | 30 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/temporaries.cpp | 27 | ||||
-rw-r--r-- | clang/test/SemaCXX/constant-expression-cxx11.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaCXX/constexpr-default-arg.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaCXX/eval-crashes.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/member-init.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-dangling-field.cpp | 6 |
15 files changed, 147 insertions, 108 deletions
diff --git a/clang/test/Analysis/initializer.cpp b/clang/test/Analysis/initializer.cpp index b73a94f1dbf..0cb68c4a978 100644 --- a/clang/test/Analysis/initializer.cpp +++ b/clang/test/Analysis/initializer.cpp @@ -178,29 +178,6 @@ namespace ReferenceInitialization { const MyStruct &myStruct(OtherStruct(5)); myStruct.method(); // no-warning } - - struct HasMyStruct { - const MyStruct &ms; // expected-note {{reference member declared here}} - const MyStruct &msWithCleanups; // expected-note {{reference member declared here}} - - // clang's Sema issues a warning when binding a reference member to a - // temporary value. - HasMyStruct() : ms(5), msWithCleanups(OtherStruct(5)) { - // expected-warning@-1 {{binding reference member 'ms' to a temporary value}} - // expected-warning@-2 {{binding reference member 'msWithCleanups' to a temporary value}} - - // At this point the members are not garbage so we should not expect an - // analyzer warning here even though binding a reference member - // to a member is a terrible idea. - ms.method(); // no-warning - msWithCleanups.method(); // no-warning - } - }; - - void referenceInitializeField() { - HasMyStruct hms; - } - }; namespace PR31592 { diff --git a/clang/test/CXX/drs/dr16xx.cpp b/clang/test/CXX/drs/dr16xx.cpp index e0af95ac39e..54648cfe969 100644 --- a/clang/test/CXX/drs/dr16xx.cpp +++ b/clang/test/CXX/drs/dr16xx.cpp @@ -9,6 +9,20 @@ #define static_assert(...) __extension__ _Static_assert(__VA_ARGS__) #endif +#if __cplusplus >= 201103L +namespace std { + typedef decltype(sizeof(int)) size_t; + + template<typename E> class initializer_list { + const E *begin; + size_t size; + + public: + initializer_list(); + }; +} // std +#endif + namespace dr1611 { // dr1611: dup 1658 struct A { A(int); }; struct B : virtual A { virtual void f() = 0; }; @@ -269,3 +283,83 @@ namespace dr1687 { // dr1687: 7 auto c = To<E1>() <=> To<E2>(); // expected-error {{invalid operands to binary expression ('To<dr1687::E1>' and 'To<dr1687::E2>')}} #endif } + +namespace dr1696 { // dr1696: 7 + namespace std_examples { +#if __cplusplus >= 201402L + extern struct A a; + struct A { + const A &x = { A{a, a} }; + const A &y = { A{} }; // expected-error {{default member initializer for 'y' needed within definition of enclosing class 'A' outside of member functions}} expected-note {{here}} + }; + A a{a, a}; +#endif + } + + struct A { A(); ~A(); }; +#if __cplusplus >= 201103L + struct B { + A &&a; // expected-note {{declared here}} + B() : a{} {} // expected-error {{reference member 'a' binds to a temporary object whose lifetime would be shorter than the constructed object}} + } b; +#endif + + struct C { + C(); + const A &a; // expected-note {{declared here}} + }; + C::C() : a(A()) {} // expected-error {{reference member 'a' binds to a temporary object whose lifetime would be shorter than the constructed object}} + +#if __cplusplus >= 201103L + // This is OK in C++14 onwards, per DR1815, though we don't support that yet: + // D1 d1 = {}; + // is equivalent to + // D1 d1 = {A()}; + // ... which lifetime-extends the A temporary. + struct D1 { + const A &a = A(); +#if __cplusplus < 201402L + // expected-error@-2 {{binds to a temporary}} + // expected-note@-4 {{here}} +#else + // expected-warning-re@-5 {{sorry, lifetime extension {{.*}} not supported}} +#endif + }; + D1 d1 = {}; // expected-note {{here}} + + struct D2 { + const A &a = A(); // expected-error {{binds to a temporary}} + D2() {} // expected-note {{used here}} + }; + + struct D3 { // expected-note {{used here}} + const A &a = A(); // expected-error {{binds to a temporary}} + }; + D3 d3; // expected-note {{first required here}} + + struct haslist1 { + std::initializer_list<int> il; // expected-note {{'std::initializer_list' member}} + haslist1(int i) : il{i, 2, 3} {} // expected-error {{backing array for 'std::initializer_list' member 'il' is a temporary object}} + }; + + struct haslist2 { + std::initializer_list<int> il; // expected-note {{'std::initializer_list' member}} + haslist2(); + }; + haslist2::haslist2() : il{1, 2} {} // expected-error {{backing array for 'std::initializer_list' member 'il' is a temporary object}} + + struct haslist3 { + std::initializer_list<int> il = {1, 2, 3}; + }; + + struct haslist4 { // expected-note {{in default member initializer}} + std::initializer_list<int> il = {1, 2, 3}; // expected-error {{backing array for 'std::initializer_list' member 'il' is a temporary object}} + }; + haslist4 hl4; // expected-note {{in implicit default constructor}} + + struct haslist5 { + std::initializer_list<int> il = {1, 2, 3}; // expected-error {{backing array for 'std::initializer_list' member 'il' is a temporary object}} + haslist5() {} // expected-note {{in default member initializer}} + }; +#endif +} diff --git a/clang/test/CXX/drs/dr18xx.cpp b/clang/test/CXX/drs/dr18xx.cpp index a0f470ed4a2..f6a4676bc7b 100644 --- a/clang/test/CXX/drs/dr18xx.cpp +++ b/clang/test/CXX/drs/dr18xx.cpp @@ -30,6 +30,17 @@ namespace dr1813 { // dr1813: 7 static_assert(!__is_standard_layout(U), ""); } +namespace dr1815 { // dr1815: no +#if __cplusplus >= 201402L + // FIXME: needs codegen test + struct A { int &&r = 0; }; // FIXME expected-warning {{not supported}} + A a = {}; // expected-note {{here}} + + struct B { int &&r = 0; }; // expected-error {{binds to a temporary}} expected-note {{here}} + B b; // expected-note {{here}} +#endif +} + namespace dr1881 { // dr1881: 7 struct A { int a : 4; }; struct B : A { int b : 3; }; diff --git a/clang/test/CXX/special/class.copy/p11.0x.copy.cpp b/clang/test/CXX/special/class.copy/p11.0x.copy.cpp index 1ca0143d093..a4d0cdcdc73 100644 --- a/clang/test/CXX/special/class.copy/p11.0x.copy.cpp +++ b/clang/test/CXX/special/class.copy/p11.0x.copy.cpp @@ -121,13 +121,22 @@ extern HasNoAccessDtorBase HNADBa; HasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}} // -- a non-static data member of rvalue reference type +int some_int; struct RValue { - int && ri = 1; // expected-note{{copy constructor of 'RValue' is implicitly deleted because field 'ri' is of rvalue reference type 'int &&'}} - // expected-warning@-1{{binding reference member 'ri' to a temporary}} expected-note@-1 {{here}} + int && ri = static_cast<int&&>(some_int); // expected-note{{copy constructor of 'RValue' is implicitly deleted because field 'ri' is of rvalue reference type 'int &&'}} }; RValue RVa; RValue RVb(RVa); // expected-error{{call to implicitly-deleted copy constructor}} +// FIXME: The note on the class-name is attached to the location of the +// constructor. This is not especially clear. +struct RValueTmp { // expected-note {{used here}} + int && ri = 1; // expected-note{{copy constructor of 'RValueTmp' is implicitly deleted because field 'ri' is of rvalue reference type 'int &&'}} + // expected-error@-1 {{reference member 'ri' binds to a temporary}} +}; +RValueTmp RVTa; // expected-note {{implicit default constructor for 'RValueTmp' first required here}} +RValueTmp RVTb(RVTa); // expected-error{{call to implicitly-deleted copy constructor}} + namespace PR13381 { struct S { S(const S&); diff --git a/clang/test/CXX/special/class.copy/p11.0x.move.cpp b/clang/test/CXX/special/class.copy/p11.0x.move.cpp index ab4259548e7..5b016836e9e 100644 --- a/clang/test/CXX/special/class.copy/p11.0x.move.cpp +++ b/clang/test/CXX/special/class.copy/p11.0x.move.cpp @@ -145,7 +145,7 @@ HasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy c // The restriction on rvalue reference members applies to only the copy // constructor. struct RValue { - int &&ri = 1; // expected-warning {{binding reference member 'ri' to a temporary}} expected-note {{here}} + int &&ri = 1; RValue(RValue&&); }; RValue::RValue(RValue&&) = default; diff --git a/clang/test/CXX/special/class.ctor/p5-0x.cpp b/clang/test/CXX/special/class.ctor/p5-0x.cpp index 2360345a484..5558313ce78 100644 --- a/clang/test/CXX/special/class.ctor/p5-0x.cpp +++ b/clang/test/CXX/special/class.ctor/p5-0x.cpp @@ -43,8 +43,12 @@ class NotDeleted2a { int &a = n; }; NotDeleted2a nd2a; class NotDeleted2b { int &a = error; }; // expected-error {{undeclared identifier}} NotDeleted2b nd2b; -class NotDeleted2c { int &&a = 0; }; // expected-warning {{binding reference member 'a' to a temporary}} expected-note {{here}} +class NotDeleted2c { int &&a = static_cast<int&&>(n); }; NotDeleted2c nd2c; +// Note: this one does not have a deleted default constructor even though the +// implicit default constructor is ill-formed! +class NotDeleted2d { int &&a = 0; }; // expected-error {{reference member 'a' binds to a temporary object}} expected-note {{here}} +NotDeleted2d nd2d; // expected-note {{first required here}} // - any non-variant non-static data member of const qualified type (or array // thereof) with no brace-or-equal-initializer does not have a user-provided diff --git a/clang/test/CXX/temp/temp.param/p5.cpp b/clang/test/CXX/temp/temp.param/p5.cpp index aa0d7e92b9e..de902a5e4d0 100644 --- a/clang/test/CXX/temp/temp.param/p5.cpp +++ b/clang/test/CXX/temp/temp.param/p5.cpp @@ -1,13 +1,13 @@ // RUN: %clang_cc1 -verify %s -std=c++14 -template<const int I> struct S { +template<const int I> struct S { // expected-note {{in default member initializer}} decltype(I) n; - int &&r = I; // expected-warning 2{{binding reference member 'r' to a temporary value}} expected-note 2{{declared here}} + int &&r = I; // expected-error {{reference member 'r' binds to a temporary object}} }; -S<5> s; // expected-note {{instantiation}} +S<5> s; // expected-note {{implicit default constructor}} -template<typename T, T v> struct U { +template<typename T, T v> struct U { // expected-note {{in default member initializer}} decltype(v) n; - int &&r = v; // expected-warning {{binding reference member 'r' to a temporary value}} expected-note {{declared here}} + int &&r = v; // expected-error {{reference member 'r' binds to a temporary object}} }; -U<const int, 6> u; // expected-note {{instantiation}} +U<const int, 6> u; // expected-note {{implicit default constructor}} diff --git a/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp b/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp index 3299763997e..0184a1d6e73 100644 --- a/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp +++ b/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp @@ -236,36 +236,6 @@ void fn9() { // CHECK: ret void } -struct haslist1 { - std::initializer_list<int> il; - haslist1(int i); -}; - -// CHECK-LABEL: define void @_ZN8haslist1C2Ei -haslist1::haslist1(int i) -// CHECK: alloca [3 x i32] -// CHECK: store i32 % -// CHECK: store i32 2 -// CHECK: store i32 3 - : il{i, 2, 3} -{ - destroyme2 dm2; -} - -struct haslist2 { - std::initializer_list<destroyme1> il; - haslist2(); -}; - -// CHECK-LABEL: define void @_ZN8haslist2C2Ev -haslist2::haslist2() - : il{destroyme1(), destroyme1()} -{ - destroyme2 dm2; - // CHECK: call void @_ZN10destroyme2D1Ev - // CHECK: call void @_ZN10destroyme1D1Ev -} - void fn10(int i) { // CHECK-LABEL: define void @_Z4fn10i // CHECK: alloca [3 x i32] diff --git a/clang/test/CodeGenCXX/temporaries.cpp b/clang/test/CodeGenCXX/temporaries.cpp index bad51ba353c..21372effbcf 100644 --- a/clang/test/CodeGenCXX/temporaries.cpp +++ b/clang/test/CodeGenCXX/temporaries.cpp @@ -198,20 +198,6 @@ B::B() f(); } -struct C { - C(); - - const B& b; -}; - -C::C() - // CHECK: call void @_ZN6PR50771BC1Ev - : b(B()) { - // CHECK: call void @_ZN6PR50771fEv - f(); - - // CHECK: call void @_ZN6PR50771BD1Ev -} } A f8() { @@ -816,16 +802,3 @@ namespace PR14130 { // CHECK: call void @_ZN7PR141301SC1Ei({{.*}} @_ZGRN7PR141301vE_, i32 0) // CHECK: store {{.*}} @_ZGRN7PR141301vE_, {{.*}} @_ZN7PR141301vE } - -namespace Ctor { - struct A { A(); ~A(); }; - void f(); - struct B { - A &&a; - B() : a{} { f(); } - } b; - // CHECK: define {{.*}}void @_ZN4Ctor1BC1Ev( - // CHECK: call void @_ZN4Ctor1AC1Ev( - // CHECK: call void @_ZN4Ctor1fEv( - // CHECK: call void @_ZN4Ctor1AD1Ev( -} diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index 4b4bd436349..e921634b1bf 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -1892,14 +1892,15 @@ namespace Lifetime { } constexpr int &get(int &&n) { return n; } + constexpr int &&get_rv(int &&n) { return static_cast<int&&>(n); } struct S { - int &&r; // expected-note 2{{declared here}} + int &&r; int &s; int t; - constexpr S() : r(0), s(get(0)), t(r) {} // expected-warning {{temporary}} - constexpr S(int) : r(0), s(get(0)), t(s) {} // expected-warning {{temporary}} expected-note {{read of object outside its lifetime}} + constexpr S() : r(get_rv(0)), s(get(0)), t(r) {} // expected-note {{read of object outside its lifetime}} + constexpr S(int) : r(get_rv(0)), s(get(0)), t(s) {} // expected-note {{read of object outside its lifetime}} }; - constexpr int k1 = S().t; // ok, int is lifetime-extended to end of constructor + constexpr int k1 = S().t; // expected-error {{constant expression}} expected-note {{in call}} constexpr int k2 = S(0).t; // expected-error {{constant expression}} expected-note {{in call}} } diff --git a/clang/test/SemaCXX/constexpr-default-arg.cpp b/clang/test/SemaCXX/constexpr-default-arg.cpp index 2fc873c3e5b..165c31aab63 100644 --- a/clang/test/SemaCXX/constexpr-default-arg.cpp +++ b/clang/test/SemaCXX/constexpr-default-arg.cpp @@ -31,8 +31,8 @@ void test_default_arg2() { } // Check that multiple CXXDefaultInitExprs don't cause an assertion failure. -struct A { int &&r = 0; }; // expected-warning {{binding reference member}} // expected-note {{reference member declared here}} +struct A { int &&r = 0; }; // expected-warning 2{{not supported}} struct B { A x, y; }; -B b = {}; +B b = {}; // expected-note 2{{in default member initializer for field 'r' used here}} } diff --git a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp index 860a4aa6c6f..ece014d93a5 100644 --- a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp +++ b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp @@ -153,13 +153,14 @@ void dangle() { } struct haslist1 { - std::initializer_list<int> il = {1, 2, 3}; // expected-warning{{at the end of the constructor}} - std::initializer_list<int> jl{1, 2, 3}; // expected-warning{{at the end of the constructor}} + std::initializer_list<int> il // expected-note {{declared here}} + = {1, 2, 3}; // ok, unused + std::initializer_list<int> jl{1, 2, 3}; // expected-error {{backing array for 'std::initializer_list' member 'jl' is a temporary object}} haslist1(); }; -haslist1::haslist1() -: il{1, 2, 3} // expected-warning{{at the end of the constructor}} +haslist1::haslist1() // expected-note {{used here}} +: il{1, 2, 3} // expected-error {{backing array for 'std::initializer_list' member 'il' is a temporary object}} {} namespace PR12119 { diff --git a/clang/test/SemaCXX/eval-crashes.cpp b/clang/test/SemaCXX/eval-crashes.cpp index 23946845d8e..33bde75de6b 100644 --- a/clang/test/SemaCXX/eval-crashes.cpp +++ b/clang/test/SemaCXX/eval-crashes.cpp @@ -26,10 +26,10 @@ namespace pr33140_0b { namespace pr33140_2 { // FIXME: The declaration of 'b' below should lifetime-extend two int - // temporaries, invalidating this warning to some extent. - struct A { int &&r = 0; }; // expected-warning {{binding reference member 'r' to a temporary}} expected-note {{here}} + // temporaries. + struct A { int &&r = 0; }; // expected-warning 2{{not supported}} struct B { A x, y; }; - B b = {}; + B b = {}; // expected-note 2{{used here}} } namespace pr33140_3 { diff --git a/clang/test/SemaCXX/member-init.cpp b/clang/test/SemaCXX/member-init.cpp index ad4a8f15b29..8a13eca2f17 100644 --- a/clang/test/SemaCXX/member-init.cpp +++ b/clang/test/SemaCXX/member-init.cpp @@ -86,9 +86,8 @@ namespace PR14838 { }; struct thing {}; struct another { - another() : r(thing()) {} + another() : r(thing()) {} // expected-error {{binds to a temporary object}} // expected-error@-1 {{temporary of type 'PR14838::function' has private destructor}} - // expected-warning@-2 {{binding reference member 'r' to a temporary value}} const function &r; // expected-note {{reference member declared here}} } af; } diff --git a/clang/test/SemaCXX/warn-dangling-field.cpp b/clang/test/SemaCXX/warn-dangling-field.cpp index eb65bd06692..97d4331c1f7 100644 --- a/clang/test/SemaCXX/warn-dangling-field.cpp +++ b/clang/test/SemaCXX/warn-dangling-field.cpp @@ -20,7 +20,7 @@ struct S { struct S2 { const X &x; // expected-note {{reference member declared here}} - S2(int i) : x(i) {} // expected-warning {{binding reference member 'x' to a temporary}} + S2(int i) : x(i) {} // expected-error {{member 'x' binds to a temporary}} }; struct S3 { @@ -43,9 +43,9 @@ S5 s5 = { 0 }; // ok, lifetime-extended struct S6 { S5 s5; // expected-note {{here}} - S6() : s5 { 0 } {} // expected-warning {{binding reference subobject of member 's5' to a temporary}} + S6() : s5 { 0 } {} // expected-error {{reference subobject of member 's5' binds to a temporary}} }; struct S7 : S5 { - S7() : S5 { 0 } {} // expected-warning {{binding reference member 'x' to a temporary}} + S7() : S5 { 0 } {} // expected-error {{reference member 'x' binds to a temporary}} }; |