<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Apr 20, 2015 at 1:00 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:reid@kleckner.net" target="_blank">reid@kleckner.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rnk<br>
Date: Mon Apr 20 15:00:49 2015<br>
New Revision: 235335<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=235335&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=235335&view=rev</a><br>
Log:<br>
Put statement expression decls in the enclosing code DeclContext<br>
<br>
We already check that statement expressions are in a function or block,<br>
but we didn't do anything with that information. Now we use that<br>
DeclContext for the duration of the statement expression. Otherwise,<br>
we'd treat statement expression locals as static data members and go<br>
into the weeds.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Parse/ParseExpr.cpp<br>
    cfe/trunk/test/Sema/statements.c<br>
<br>
Modified: cfe/trunk/lib/Parse/ParseExpr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=235335&r1=235334&r2=235335&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=235335&r1=235334&r2=235335&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Parse/ParseExpr.cpp (original)<br>
+++ cfe/trunk/lib/Parse/ParseExpr.cpp Mon Apr 20 15:00:49 2015<br>
@@ -2106,6 +2106,17 @@ Parser::ParseParenExpression(ParenParseO<br>
     if (!getCurScope()->getFnParent() && !getCurScope()->getBlockParent()) {<br>
       Result = ExprError(Diag(OpenLoc, diag::err_stmtexpr_file_scope));<br>
     } else {<br>
+      // Find the nearest non-record decl context. Variables declared in a<br>
+      // statement expression behave as if they were declared in the enclosing<br>
+      // function, block, or other code construct.<br>
+      DeclContext *CodeDC = Actions.CurContext;<br>
+      while (CodeDC->isRecord() || isa<EnumDecl>(CodeDC)) {<br>
+        CodeDC = CodeDC->getParent();<br>
+        assert(CodeDC && !CodeDC->isFileContext() &&<br>
+               "statement expr not in code context");<br>
+      }<br></blockquote><div><br></div><div>Given that you already found a FnParent or BlockParent, you could ask that scope for its Entity instead of recomputing it here.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      Sema::ContextRAII SavedContext(Actions, CodeDC, /*NewThisContext=*/false);<br>
+<br>
       Actions.ActOnStartStmtExpr();<br>
<br>
       StmtResult Stmt(ParseCompoundStatement(true));<br>
<br>
Modified: cfe/trunk/test/Sema/statements.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/statements.c?rev=235335&r1=235334&r2=235335&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/statements.c?rev=235335&r1=235334&r2=235335&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Sema/statements.c (original)<br>
+++ cfe/trunk/test/Sema/statements.c Mon Apr 20 15:00:49 2015<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 %s -fsyntax-only -verify  -triple x86_64-pc-linux-gnu<br>
+// RUN: %clang_cc1 %s -fsyntax-only -verify  -triple x86_64-pc-linux-gnu -Wno-unevaluated-expression<br>
<br>
 typedef unsigned __uint32_t;<br>
<br>
@@ -97,3 +97,16 @@ int test_pr8880() {<br>
   return 1;<br>
 }<br>
<br>
+// In PR22849, we considered __ptr to be a static data member of the anonymous<br>
+// union. Now we declare it in the parent DeclContext.<br>
+void test_pr22849() {<br>
+  struct Bug {<br>
+    typeof(({ unsigned long __ptr; (int *)(0); })) __val;<br>
+    union Nested {<br>
+      typeof(({ unsigned long __ptr; (int *)(0); })) __val;<br>
+    } n;<br>
+  };<br>
+  enum E {<br>
+    SIZE = sizeof(({unsigned long __ptr; __ptr;}))<br>
+  };<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>