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

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