r225571 - Fix temporary lifetime extension from an initializer using braced "functional"

Richard Smith richard-llvm at metafoo.co.uk
Fri Jan 9 17:28:13 PST 2015


Author: rsmith
Date: Fri Jan  9 19:28:13 2015
New Revision: 225571

URL: http://llvm.org/viewvc/llvm-project?rev=225571&view=rev
Log:
Fix temporary lifetime extension from an initializer using braced "functional"
cast notation T{...} when T is a reference type.

Modified:
    cfe/trunk/lib/Sema/SemaInit.cpp
    cfe/trunk/test/CodeGenCXX/temporaries.cpp

Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=225571&r1=225570&r2=225571&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Fri Jan  9 19:28:13 2015
@@ -5497,18 +5497,18 @@ static void performLifetimeExtension(Exp
 static bool
 performReferenceExtension(Expr *Init,
                           const InitializedEntity *ExtendingEntity) {
-  if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
-    if (ILE->getNumInits() == 1 && ILE->isGLValue()) {
-      // This is just redundant braces around an initializer. Step over it.
-      Init = ILE->getInit(0);
-    }
-  }
-
   // Walk past any constructs which we can lifetime-extend across.
   Expr *Old;
   do {
     Old = Init;
 
+    if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
+      if (ILE->getNumInits() == 1 && ILE->isGLValue()) {
+        // This is just redundant braces around an initializer. Step over it.
+        Init = ILE->getInit(0);
+      }
+    }
+
     // Step over any subobject adjustments; we may have a materialized
     // temporary inside them.
     SmallVector<const Expr *, 2> CommaLHSs;

Modified: cfe/trunk/test/CodeGenCXX/temporaries.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/temporaries.cpp?rev=225571&r1=225570&r2=225571&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/temporaries.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/temporaries.cpp Fri Jan  9 19:28:13 2015
@@ -42,6 +42,13 @@ namespace PR20227 {
   // CHECK: @_ZGRN7PR202271cE_ = private global
 }
 
+namespace BraceInit {
+  typedef const int &CIR;
+  CIR x = CIR{3};
+  // CHECK: @_ZGRN9BraceInit1xE_ = private constant i32 3
+  // CHECK: @_ZN9BraceInit1xE = constant i32* @_ZGRN9BraceInit1xE_
+}
+
 struct A {
   A();
   ~A();





More information about the cfe-commits mailing list