r235335 - Put statement expression decls in the enclosing code DeclContext
Richard Smith
richard at metafoo.co.uk
Mon Apr 20 14:26:14 PDT 2015
On Mon, Apr 20, 2015 at 1:00 PM, Reid Kleckner <reid at kleckner.net> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150420/dca93ef0/attachment.html>
More information about the cfe-commits
mailing list