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