[PATCH] PR22931 - When cloning scopes, reset the scope in Sema instead of using the cloned scope as the current scope

Richard Smith richard at metafoo.co.uk
Wed Mar 18 12:02:41 PDT 2015


On Wed, Mar 18, 2015 at 8:56 AM, Delesley Hutchins <delesley at google.com>
wrote:

>
> Nice catch!  LGTM.   BTW, I'm surprised it has taken so long for this bug
> to manifest, since we should have lots of code with multiple
> late parsed attributes.  When did it show up?
>

It caused an assert to fire, which doesn't show up for release Clang builds.


> On Tue, Mar 17, 2015 at 8:12 PM, Richard Trieu <rtrieu at google.com> wrote:
>
>> Hi delesley,
>>
>> Fix for PR22931, assertion failure with attributes and templates.
>>
>> When cloning a scope, the constructor of LocalInstantiationScope will set
>> the current scope in Sema to be that new scope.  However, cloning scopes
>> doesn't change what the current scope should be.  This manifests when
>> multiple late parsed attributed are used.  The first attribute has a
>> properly cloned scope, but the other attributes get the wrong scope.  The
>> assertion in PR22931 is triggered when a Decl is looked up within an
>> incorrect scope and is not found.
>>
>> http://reviews.llvm.org/D8407
>>
>> Files:
>>   include/clang/Sema/Template.h
>>   test/SemaCXX/warn-thread-safety-negative.cpp
>>
>> Index: include/clang/Sema/Template.h
>> ===================================================================
>> --- include/clang/Sema/Template.h
>> +++ include/clang/Sema/Template.h
>> @@ -273,6 +273,11 @@
>>      /// outermost scope.
>>      LocalInstantiationScope *cloneScopes(LocalInstantiationScope
>> *Outermost) {
>>        if (this == Outermost) return this;
>> +
>> +      // Save the current scope from SemaRef since the
>> LocalInstantiationScope
>> +      // will overwrite it on construction
>> +      LocalInstantiationScope *oldScope =
>> SemaRef.CurrentInstantiationScope;
>> +
>>        LocalInstantiationScope *newScope =
>>          new LocalInstantiationScope(SemaRef, CombineWithOuterScope);
>>
>> @@ -299,6 +304,8 @@
>>            newScope->ArgumentPacks.push_back(NewPack);
>>          }
>>        }
>> +      // Restore the saved scope to SemaRef
>> +      SemaRef.CurrentInstantiationScope = oldScope;
>>        return newScope;
>>      }
>>
>> Index: test/SemaCXX/warn-thread-safety-negative.cpp
>> ===================================================================
>> --- test/SemaCXX/warn-thread-safety-negative.cpp
>> +++ test/SemaCXX/warn-thread-safety-negative.cpp
>> @@ -102,3 +102,20 @@
>>  };
>>
>>  }  // end namespace SimpleTest
>> +
>> +namespace DoubleAttribute {
>> +
>> +struct Foo {
>> +  Mutex &mutex();
>> +};
>> +
>> +template <typename A>
>> +class TemplateClass {
>> +  template <typename B>
>> +  static void Function(Foo *F)
>> +      EXCLUSIVE_LOCKS_REQUIRED(F->mutex()) UNLOCK_FUNCTION(F->mutex()) {}
>> +};
>> +
>> +void test() { TemplateClass<int> TC; }
>> +
>> +}  // end namespace DoubleAttribute
>>
>> EMAIL PREFERENCES
>>   http://reviews.llvm.org/settings/panel/emailpreferences/
>>
>
>
>
> --
> DeLesley Hutchins | Software Engineer | delesley at google.com | 505-206-0315
>
> _______________________________________________
> 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/20150318/a4b5d33f/attachment.html>


More information about the cfe-commits mailing list