From: Douglas Gregor Date: Fri, 20 Mar 2009 20:21:37 +0000 (+0000) Subject: Some minor tweaks and additional tests for rvalue references X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ff44784d180bb96953c22de4a0b2efb5d50263a;p=clang Some minor tweaks and additional tests for rvalue references git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67397 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index a3c7997c6d..5e9b0cd9f4 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -104,7 +104,7 @@ bool CXXRecordDecl::hasConstCopyAssignment(ASTContext &Context) const { QualType ArgType = FnType->getArgType(0); if (const LValueReferenceType *Ref = ArgType->getAsLValueReferenceType()) { ArgType = Ref->getPointeeType(); - // Is it a non-const reference? + // Is it a non-const lvalue reference? if (!ArgType.isConstQualified()) AcceptsConst = false; } diff --git a/test/Parser/cxx0x-rvalue-reference.cpp b/test/Parser/cxx0x-rvalue-reference.cpp index 3643233272..5736b79ff7 100644 --- a/test/Parser/cxx0x-rvalue-reference.cpp +++ b/test/Parser/cxx0x-rvalue-reference.cpp @@ -3,4 +3,7 @@ int && r1(int &&a); typedef int && R; -void r2(const R a); +void r2(const R a) { + int & &&ar = a; // expected-error{{'ar' declared as a reference to a reference}} +} + diff --git a/test/SemaCXX/rval-references.cpp b/test/SemaCXX/rval-references.cpp index ae2644919a..aafb334b84 100644 --- a/test/SemaCXX/rval-references.cpp +++ b/test/SemaCXX/rval-references.cpp @@ -14,11 +14,17 @@ struct not_int {}; int over(int&); not_int over(int&&); +int over2(const int&); +not_int over2(int&&); + +struct conv_to_not_int_rvalue { + operator not_int &&(); +}; + void f() { int &&virr1; // expected-error {{declaration of reference variable 'virr1' requires an initializer}} int &&virr2 = 0; - // FIXME: named rvalue references are lvalues! - //int &&virr3 = virr1; // xpected-error {{rvalue reference cannot bind to lvalue}} + int &&virr3 = virr2; // expected-error {{rvalue reference cannot bind to lvalue}} int i1 = 0; int &&virr4 = i1; // expected-error {{rvalue reference cannot bind to lvalue}} int &&virr5 = ret_irr(); @@ -28,6 +34,13 @@ void f() { int i3 = over(virr2); not_int ni2 = over(ret_irr()); + int i4 = over2(i1); + // not_int ni3 = over2(0); FIXME: this should be well-formed. + ilr_c1 vilr1 = i1; ilr_c2 vilr2 = i1; + + conv_to_not_int_rvalue cnir; + not_int &&ni4 = cnir; + not_int &ni5 = cnir; // expected-error{{non-const lvalue reference to type 'struct not_int' cannot be initialized with a value of type 'struct conv_to_not_int_rvalue'}} }