From: Jason Merrill Date: Wed, 9 May 2018 02:08:52 +0000 (-0400) Subject: PR c++/85706 - class deduction under decltype X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=655b16da125b1210096b2f394ba0f222631fb44b;p=gcc.git PR c++/85706 - class deduction under decltype * pt.c (for_each_template_parm_r): Handle DECLTYPE_TYPE. Clear *walk_subtrees whether or not we walked into the operand. (type_uses_auto): Only look at deduced contexts. From-SVN: r260066 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index aa42de2c05f..bf56581327c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-05-08 Jason Merrill + + PR c++/85706 - class deduction under decltype + * pt.c (for_each_template_parm_r): Handle DECLTYPE_TYPE. Clear + *walk_subtrees whether or not we walked into the operand. + (type_uses_auto): Only look at deduced contexts. + 2018-05-08 Paolo Carlini PR c++/84588 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c604f46f742..180dfd6861c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9829,6 +9829,7 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d) break; case TYPEOF_TYPE: + case DECLTYPE_TYPE: case UNDERLYING_TYPE: if (pfd->include_nondeduced_p && for_each_template_parm (TYPE_VALUES_RAW (t), fn, data, @@ -9836,6 +9837,7 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d) pfd->include_nondeduced_p, pfd->any_fn)) return error_mark_node; + *walk_subtrees = false; break; case FUNCTION_DECL: @@ -26862,7 +26864,7 @@ type_uses_auto (tree type) them. */ if (uses_template_parms (type)) return for_each_template_parm (type, is_auto_r, /*data*/NULL, - /*visited*/NULL, /*nondeduced*/true); + /*visited*/NULL, /*nondeduced*/false); else return NULL_TREE; } diff --git a/gcc/testsuite/g++.dg/concepts/class-deduction2.C b/gcc/testsuite/g++.dg/concepts/class-deduction2.C new file mode 100644 index 00000000000..286e59a5039 --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/class-deduction2.C @@ -0,0 +1,9 @@ +// PR c++/85706 +// { dg-additional-options "-std=c++17 -fconcepts" } + +template struct S { + S(T); +}; + +template +auto f() -> decltype(S(42)); // error