It seems Richard is out of office, but perhaps he can verify this later.

Dimitry: go ahead and merge it (or let me know if you'd like me to).

On Fri, Jan 22, 2016 at 12:38 PM, Dimitry Andric <dimi...@andric.com> wrote:
> 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
>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to