diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-03 01:14:32 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-03 01:14:32 +0000 |
commit | 4baaa5ab52870c3d2e1961aaa7758908ea69579e (patch) | |
tree | d0b7a59ca83d21a73fbd5a907b01941e9199da31 /clang/lib/Sema/SemaExprCXX.cpp | |
parent | 05049bed027cb37ef4afcbc6b280603e767f7971 (diff) | |
download | bcm5719-llvm-4baaa5ab52870c3d2e1961aaa7758908ea69579e.tar.gz bcm5719-llvm-4baaa5ab52870c3d2e1961aaa7758908ea69579e.zip |
DR616, and part of P0135R1: member access (or pointer-to-member access) on a
temporary produces an xvalue, not a prvalue. Support this by materializing the
temporary prior to performing the member access.
llvm-svn: 288563
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 79b5356d79d..28ccd607507 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -4984,11 +4984,14 @@ QualType Sema::CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, !RHS.get()->getType()->isPlaceholderType() && "placeholders should have been weeded out by now"); - // The LHS undergoes lvalue conversions if this is ->*. - if (isIndirect) { + // The LHS undergoes lvalue conversions if this is ->*, and undergoes the + // temporary materialization conversion otherwise. + if (isIndirect) LHS = DefaultLvalueConversion(LHS.get()); - if (LHS.isInvalid()) return QualType(); - } + else if (LHS.get()->isRValue()) + LHS = TemporaryMaterializationConversion(LHS.get()); + if (LHS.isInvalid()) + return QualType(); // The RHS always undergoes lvalue conversions. RHS = DefaultLvalueConversion(RHS.get()); |