https://gcc.gnu.org/g:cfbd8735359d84a2d716549415eac70e885167bf

commit r15-1016-gcfbd8735359d84a2d716549415eac70e885167bf
Author: Simon Martin <si...@nasilyan.com>
Date:   Fri May 24 17:00:17 2024 +0200

    Fix PR c++/111106: missing ; causes internal compiler error
    
    We currently fail upon the following because an assert in dependent_type_p
    fails for f's parameter
    
    === cut here ===
    consteval int id (int i) { return i; }
    constexpr int
    f (auto i) requires requires { id (i) } { return i; }
    void g () { f (42); }
    === cut here ===
    
    This patch fixes this by relaxing the assert to pass during error recovery.
    
    Successfully tested on x86_64-pc-linux-gnu.
    
            PR c++/111106
    
    gcc/cp/ChangeLog:
    
            * pt.cc (dependent_type_p): Don't fail assert during error recovery.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/consteval37.C: New test.

Diff:
---
 gcc/cp/pt.cc                             |  3 ++-
 gcc/testsuite/g++.dg/cpp2a/consteval37.C | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index dfce1b3c359..edb94a000ea 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -28019,7 +28019,8 @@ dependent_type_p (tree type)
       /* If we are not processing a template, then nobody should be
         providing us with a dependent type.  */
       gcc_assert (type);
-      gcc_assert (TREE_CODE (type) != TEMPLATE_TYPE_PARM || is_auto (type));
+      gcc_assert (TREE_CODE (type) != TEMPLATE_TYPE_PARM || is_auto (type)
+                 || seen_error());
       return false;
     }
 
diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval37.C 
b/gcc/testsuite/g++.dg/cpp2a/consteval37.C
new file mode 100644
index 00000000000..519d83d9bf8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/consteval37.C
@@ -0,0 +1,16 @@
+// PR c++/111106
+// { dg-do compile { target c++20 } }
+
+consteval int id (int i) { return i; }
+
+constexpr int f (auto i)
+  requires requires { id (i) } // { dg-error "expected" }
+{
+  return i;
+}
+
+void g () {
+  f (42);
+}
+
+// { dg-excess-errors "" }

Reply via email to