]> granicus.if.org Git - clang/commitdiff
A CXXExprWithTemporaries expression is an lvalue if its subexpression
authorDouglas Gregor <dgregor@apple.com>
Sat, 19 Dec 2009 07:07:47 +0000 (07:07 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 19 Dec 2009 07:07:47 +0000 (07:07 +0000)
is an lvalue. Fixes PR5787.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91765 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
test/CXX/dcl.decl/dcl.init/dcl.init.ref/basic.cpp [new file with mode: 0644]

index dcf4411d854380f04f7b6d75459b2585a4cb26ba..034b91ed0f5910ec974f9cdfb80a25c7769c26e4 100644 (file)
@@ -1213,6 +1213,16 @@ Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const {
     return LV_Valid;
   }
 
+  case Expr::CXXExprWithTemporariesClass:
+    return cast<CXXExprWithTemporaries>(this)->getSubExpr()->isLvalue(Ctx);
+
+  case Expr::ObjCMessageExprClass:
+    if (const ObjCMethodDecl *Method
+          = cast<ObjCMessageExpr>(this)->getMethodDecl())
+      if (Method->getResultType()->isLValueReferenceType())
+        return LV_Valid;
+    break;
+
   default:
     break;
   }
diff --git a/test/CXX/dcl.decl/dcl.init/dcl.init.ref/basic.cpp b/test/CXX/dcl.decl/dcl.init/dcl.init.ref/basic.cpp
new file mode 100644 (file)
index 0000000..885d11b
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// PR5787
+class C {
+ public:
+  ~C() {}
+};
+
+template <typename T>
+class E {
+ public:
+  E& Foo(const C&);
+  E& Bar() { return Foo(C()); }
+};
+
+void Test() {
+  E<int> e;
+  e.Bar();
+}