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