From: Jason Merrill Date: Wed, 3 Jul 2024 21:27:48 +0000 (-0400) Subject: c++: CTAD and trait built-ins X-Git-Tag: basepoints/gcc-16~7722 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=655fe94ae4c95d7f113c62787ca382d2742fad6f;p=thirdparty%2Fgcc.git c++: CTAD and trait built-ins While poking at 101232 I noticed that we started trying to parse __is_invocable(_Fn, _Args...) as a functional cast to a CTAD placeholder type; we shouldn't consider CTAD for a template that shares a name (reserved for the implementation) with a built-in trait. gcc/cp/ChangeLog: * pt.cc (ctad_template_p): Return false for trait names. --- diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 017cc7fd0ab..d1316483e24 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -30811,6 +30811,11 @@ ctad_template_p (tree tmpl) where the nested-name-specifier (if any) is non-dependent and the template-name of the simple-template-id names a deducible template. */ + if (DECL_CLASS_TEMPLATE_P (tmpl) + && IDENTIFIER_TRAIT_P (DECL_NAME (tmpl))) + /* Don't consider CTAD for templates with the same name as a trait; that + is ambiguous with e.g. __is_invocable(_Fn,_Args...). */ + return false; if (DECL_CLASS_TEMPLATE_P (tmpl) || DECL_TEMPLATE_TEMPLATE_PARM_P (tmpl)) return true;