]> granicus.if.org Git - clang/commitdiff
[analyzer] Add a comment: why we treat array compound literals as lvalues.
authorJordan Rose <jordan_rose@apple.com>
Mon, 18 Jun 2012 21:31:27 +0000 (21:31 +0000)
committerJordan Rose <jordan_rose@apple.com>
Mon, 18 Jun 2012 21:31:27 +0000 (21:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158681 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/ExprEngineC.cpp

index 0056089af9aaf19c1abd8e0890ebf28ba4f95a89..c2590d5ef250be4dda3e8523ce4ffe97a70b0870 100644 (file)
@@ -407,7 +407,15 @@ void ExprEngine::VisitCompoundLiteralExpr(const CompoundLiteralExpr *CL,
   SVal ILV = state->getSVal(ILE, Pred->getLocationContext());
   const LocationContext *LC = Pred->getLocationContext();
   state = state->bindCompoundLiteral(CL, LC, ILV);
-  
+
+  // Compound literal expressions are a GNU extension in C++.
+  // Unlike in C, where CLs are lvalues, in C++ CLs are prvalues,
+  // and like temporary objects created by the functional notation T()
+  // CLs are destroyed at the end of the containing full-expression.
+  // HOWEVER, an rvalue of array type is not something the analyzer can
+  // reason about, since we expect all regions to be wrapped in Locs.
+  // So we treat array CLs as lvalues as well, knowing that they will decay
+  // to pointers as soon as they are used.
   if (CL->isGLValue() || CL->getType()->isArrayType())
     B.generateNode(CL, Pred, state->BindExpr(CL, LC, state->getLValue(CL, LC)));
   else