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

Delesley Hutchins delesley at google.com
Tue Aug 21 08:01:20 PDT 2012


Thanks for the suggestion!  For thread safety stuff, I probably want
'this' to always be const, regardless of what the underlying method
says.  I don't do that currently, so it should be fixed.

  -DeLesley

On Mon, Aug 20, 2012 at 7:29 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> 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'.



-- 
DeLesley Hutchins | Software Engineer | delesley at google.com | 505-206-0315



More information about the cfe-commits mailing list