r369834 - PR42513: Enter the proper DeclContext before substituting into an
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 27 03:37:13 PDT 2019
Merged to release_90 in r370038.
On Sat, Aug 24, 2019 at 4:28 AM Richard Smith via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: rsmith
> Date: Fri Aug 23 19:30:00 2019
> New Revision: 369834
>
> URL: http://llvm.org/viewvc/llvm-project?rev=369834&view=rev
> Log:
> PR42513: Enter the proper DeclContext before substituting into an
> default template argument expression.
>
> We already did this for type template parameters and template template
> parameters, but apparently forgot to do so for non-type template
> parameters. This causes the substituted default argument expression to
> be substituted in the proper context, and in particular to properly mark
> its subexpressions as odr-used.
>
> Modified:
> cfe/trunk/lib/Sema/SemaTemplate.cpp
> cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
> cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=369834&r1=369833&r2=369834&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Fri Aug 23 19:30:00 2019
> @@ -4693,6 +4693,7 @@ 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::ExpressionEvaluationContext::ConstantEvaluated);
> return SemaRef.SubstExpr(Param->getDefaultArgument(), TemplateArgLists);
>
> Modified: cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp?rev=369834&r1=369833&r2=369834&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp Fri Aug 23 19:30:00 2019
> @@ -268,13 +268,16 @@ namespace tuple_tests {
> // Don't get caught by surprise when X<...> doesn't even exist in the
> // selected specialization!
> namespace libcxx_2 {
> - template<class ...T> struct tuple { // expected-note {{candidate}}
> + template<class ...T> struct tuple {
> template<class ...Args> struct X { static const bool value = false; };
> + // Substitution into X<U...>::value succeeds but produces the
> + // value-dependent expression
> + // tuple<T...>::X<>::value
> + // FIXME: Is that the right behavior?
> template<class ...U, bool Y = X<U...>::value> tuple(U &&...u);
> - // expected-note at -1 {{substitution failure [with T = <>, U = <int, int, int>]: cannot reference member of primary template because deduced class template specialization 'tuple<>' is an explicit specialization}}
> };
> template <> class tuple<> {};
> - tuple a = {1, 2, 3}; // expected-error {{no viable constructor or deduction guide}}
> + tuple a = {1, 2, 3}; // expected-error {{excess elements in struct initializer}}
> }
>
> namespace libcxx_3 {
>
> Modified: cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp?rev=369834&r1=369833&r2=369834&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Fri Aug 23 19:30:00 2019
> @@ -48,3 +48,20 @@ void Useage() {
> }
> }
>
> +namespace PR42513 {
> + template<typename X, int Ret = WidgetCtor((X*)nullptr)> void f();
> + constexpr int WidgetCtor(struct X1*);
> +
> + struct X1 {
> + friend constexpr int WidgetCtor(X1*);
> + };
> + template<typename X1>
> + struct StandardWidget {
> + friend constexpr int WidgetCtor(X1*) {
> + return 0;
> + }
> + };
> + template struct StandardWidget<X1>;
> +
> + void use() { f<X1>(); }
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list