diff options
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Parser/cxx0x-rvalue-reference.cpp | 5 | ||||
| -rw-r--r-- | clang/test/SemaCXX/rval-references.cpp | 17 |
3 files changed, 20 insertions, 4 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index a3c7997c6dd..5e9b0cd9f45 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/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/clang/test/Parser/cxx0x-rvalue-reference.cpp b/clang/test/Parser/cxx0x-rvalue-reference.cpp index 36432332722..5736b79ff76 100644 --- a/clang/test/Parser/cxx0x-rvalue-reference.cpp +++ b/clang/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/clang/test/SemaCXX/rval-references.cpp b/clang/test/SemaCXX/rval-references.cpp index ae2644919a7..aafb334b849 100644 --- a/clang/test/SemaCXX/rval-references.cpp +++ b/clang/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'}} } |

