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