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
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