[cfe-commits] r162229 - in /cfe/trunk: lib/Parse/ParseDecl.cpp test/SemaCXX/warn-thread-safety-parsing.cpp

Richard Smith richard at metafoo.co.uk
Mon Aug 20 19:29:32 PDT 2012


On Mon, Aug 20, 2012 at 2:32 PM, DeLesley Hutchins <delesley at google.com>wrote:

> Author: delesley
> Date: Mon Aug 20 16:32:18 2012
> New Revision: 162229
>
> URL: http://llvm.org/viewvc/llvm-project?rev=162229&view=rev
> Log:
> Thread-safety analysis: fix scoping issues related to 'this', including an
> ICE in friend functions.
>
> Modified:
>     cfe/trunk/lib/Parse/ParseDecl.cpp
>     cfe/trunk/test/SemaCXX/warn-thread-safety-parsing.cpp
>
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=162229&r1=162228&r2=162229&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Mon Aug 20 16:32:18 2012
> @@ -851,10 +851,6 @@
>      Actions.ActOnStartDelayedMemberDeclarations(getCurScope(),
>                                                  Class.TagOrTemplate);
>    if (!Class.LateParsedDeclarations.empty()) {
> -    // Allow 'this' within late-parsed attributes.
> -    Sema::CXXThisScopeRAII ThisScope(Actions, Class.TagOrTemplate,
> -                                     /*TypeQuals=*/0);
> -
>      for (unsigned i = 0, ni = Class.LateParsedDeclarations.size(); i <
> ni; ++i){
>        Class.LateParsedDeclarations[i]->ParseLexedAttributes();
>      }
> @@ -904,34 +900,43 @@
>    ParsedAttributes Attrs(AttrFactory);
>    SourceLocation endLoc;
>
> -  if (LA.Decls.size() == 1) {
> +  if (LA.Decls.size() > 0) {
>      Decl *D = LA.Decls[0];
> +    NamedDecl *ND  = dyn_cast<NamedDecl>(D);
> +    RecordDecl *RD = dyn_cast_or_null<RecordDecl>(D->getDeclContext());
>
> -    // If the Decl is templatized, add template parameters to scope.
> -    bool HasTemplateScope = EnterScope && D->isTemplateDecl();
> -    ParseScope TempScope(this, Scope::TemplateParamScope,
> HasTemplateScope);
> -    if (HasTemplateScope)
> -      Actions.ActOnReenterTemplateScope(Actions.CurScope, D);
> -
> -    // If the Decl is on a function, add function parameters to the scope.
> -    bool HasFunctionScope = EnterScope &&
> D->isFunctionOrFunctionTemplate();
> -    ParseScope FnScope(this, Scope::FnScope|Scope::DeclScope,
> HasFunctionScope);
> -    if (HasFunctionScope)
> -      Actions.ActOnReenterFunctionContext(Actions.CurScope, D);
> -
> -    ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc);
> -
> -    if (HasFunctionScope) {
> -      Actions.ActOnExitFunctionContext();
> -      FnScope.Exit();  // Pop scope, and remove Decls from IdResolver
> -    }
> -    if (HasTemplateScope) {
> -      TempScope.Exit();
> -    }
> -  } else if (LA.Decls.size() > 0) {
> -    // If there are multiple decls, then the decl cannot be within the
> -    // function scope.
> -    ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc);
> +    // Allow 'this' within late-parsed attributes.
> +    Sema::CXXThisScopeRAII ThisScope(Actions, RD,
> +                                     /*TypeQuals=*/0,
>

I don't know whether you care about this for the thread safety annotations,
but I believe you're now in a position where you can get the type
qualifiers "right"  -- if the attribute is attached to a CXXMethodDecl, you
can use the cv-qualifiers specified on that function declaration in the
type of 'this'.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120820/a8a3efc7/attachment.html>


More information about the cfe-commits mailing list