https://gcc.gnu.org/g:655fe94ae4c95d7f113c62787ca382d2742fad6f

commit r15-1831-g655fe94ae4c95d7f113c62787ca382d2742fad6f
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Jul 3 17:27:48 2024 -0400

    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:
---
 gcc/cp/pt.cc | 5 +++++
 1 file changed, 5 insertions(+)

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;

Reply via email to