Hans,

This change looks pretty trivial, and is required to not crash for the test 
cases in PR26134.  Can we merge it to release_38, please?

-Dimitry

> On 19 Jan 2016, at 19:28, Dimitry Andric via cfe-commits 
> <cfe-commits@lists.llvm.org> wrote:
> 
> Hi Richard,
> 
> I am unsure if you are specifically the code owner of Sema, but can you 
> please approve this change for the 3.8 branch?
> 
> -Dimitry
> 
>> On 19 Jan 2016, at 04:58, Faisal Vali via cfe-commits 
>> <cfe-commits@lists.llvm.org> wrote:
>> 
>> Author: faisalv
>> Date: Mon Jan 18 21:58:55 2016
>> New Revision: 258110
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=258110&view=rev
>> Log:
>> Fix PR26134: When substituting into default template arguments, keep 
>> CurContext unchanged.
>> 
>> Or, do not set Sema's CurContext to the template declaration's when 
>> substituting into default template arguments of said template declaration.
>> If we do push the template declaration context on to Sema, and the template 
>> declaration is at namespace scope, Sema can get confused and try and do odr 
>> analysis when substituting into default template arguments, even though the 
>> substitution could be occurring within a dependent context.
>> I'm not sure why this was being done, perhaps there was concern that if a 
>> default template argument referred to a previous template parameter, it 
>> might not be found during substitution - but all regression tests pass, and 
>> I can't craft a test that would cause it to fails (if some one does, please 
>> inform me, and i'll craft a different fix for the PR).
>> 
>> 
>> This patch removes a single line of code, but unfortunately adds more than 
>> it removes, because of the tests.  Some day I still hope to commit a patch 
>> that removes far more lines than it adds, while leaving clang better for it 
>> ;)
>> 
>> Sorry that r253590 ("Change the expression evaluation context from 
>> Unevaluated to ConstantEvaluated while substituting into non-type template 
>> argument defaults") caused the PR!
>> 
>> 
>> 
>> 
>> 
>> Modified:
>>   cfe/trunk/lib/Sema/SemaTemplate.cpp
>>   cfe/trunk/test/SemaTemplate/default-arguments.cpp
>> 
>> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=258110&r1=258109&r2=258110&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon Jan 18 21:58:55 2016
>> @@ -3281,7 +3281,6 @@ SubstDefaultTemplateArgument(Sema &SemaR
>>  for (unsigned i = 0, e = Param->getDepth(); i != e; ++i)
>>    TemplateArgLists.addOuterTemplateArguments(None);
>> 
>> -  Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext());
>>  EnterExpressionEvaluationContext ConstantEvaluated(SemaRef,
>>                                                     Sema::ConstantEvaluated);
>>  return SemaRef.SubstExpr(Param->getDefaultArgument(), TemplateArgLists);
>> 
>> Modified: cfe/trunk/test/SemaTemplate/default-arguments.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/default-arguments.cpp?rev=258110&r1=258109&r2=258110&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/SemaTemplate/default-arguments.cpp (original)
>> +++ cfe/trunk/test/SemaTemplate/default-arguments.cpp Mon Jan 18 21:58:55 
>> 2016
>> @@ -179,3 +179,31 @@ struct C {
>>  C(T t = ); // expected-error {{expected expression}}
>> };
>> C<int> obj;
>> +
>> +namespace PR26134 {
>> +// Make sure when substituting default template arguments we do it in the 
>> current context.
>> +template<class T, bool Val = T::value>
>> +struct X {};
>> +
>> +template<bool B> struct Y {
>> +  void f() { X<Y> xy; }
>> +  static const bool value = B;
>> +};
>> +
>> +namespace ns1 {
>> +template<class T0>
>> +struct X {
>> +  template<bool B = T0::value> struct XInner { static const bool value = B; 
>> };
>> +};
>> +template<bool B> struct S { static const bool value = B; };
>> +#if __cplusplus > 199711L
>> +template<bool B> struct Y {
>> +  static constexpr bool f() { return typename X<S<B>>::template 
>> XInner<>{}.value; }
>> +  static_assert(f() == B, "");
>> +};
>> +Y<true> y;
>> +Y<false> y2;
>> +#endif
>> +
>> +} // end ns1
>> +} // end ns PR26134
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits@lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to