[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