[gcc/devel/gccgo] c++: ICE in is_really_empty_class [PR95497]

Ian Lance Taylor ian@gcc.gnu.org
Sun Jul 12 20:28:23 GMT 2020


https://gcc.gnu.org/g:9eb7d0d76eb652caa9186766da4fe965f113b1b8

commit 9eb7d0d76eb652caa9186766da4fe965f113b1b8
Author: Patrick Palka <ppalka@redhat.com>
Date:   Wed Jul 8 14:17:47 2020 -0400

    c++: ICE in is_really_empty_class [PR95497]
    
    We are ICEing in the testcase below because we pass the
    yet-uninstantiated class type A<int> of the PARM_DECL b to
    is_really_empty_class from is_rvalue_constant_expression when parsing
    the requirement t += b.
    
    This patch fixes the ICE by guarding the problematic call to
    is_really_empty_class with a COMPLETE_TYPE_P check, which should also
    subsume the existing dependent_type_p check.
    
    gcc/cp/ChangeLog:
    
            PR c++/95497
            * constexpr.c (potential_constant_expression_1) <case PARM_DECL>:
            When processing_template_decl, check COMPLETE_TYPE_P before
            calling is_really_empty_class.  Don't check dependent_type_p.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/95497
            * g++.dg/cpp2a/concepts-pr95497.C: New test.

Diff:
---
 gcc/cp/constexpr.c                            |  2 +-
 gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C | 12 ++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 1939166e907..ff78ebda2dc 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -7443,7 +7443,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
       if (now && want_rval)
 	{
 	  tree type = TREE_TYPE (t);
-	  if (dependent_type_p (type)
+	  if ((processing_template_decl && !COMPLETE_TYPE_P (type))
 	      || is_really_empty_class (type, /*ignore_vptr*/false))
 	    /* An empty class has no data to read.  */
 	    return true;
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C b/gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C
new file mode 100644
index 00000000000..4d7718ad5e8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C
@@ -0,0 +1,12 @@
+// PR c++/95497
+// { dg-do compile { target c++20 } }
+
+template <typename T>
+struct A{};
+
+template <typename T>
+concept c =
+    requires(T t, A<int> b) // note that A<int> is independent of T
+    {
+        { t += b };
+    };


More information about the Gcc-cvs mailing list