]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: fix ICE with is_really_empty_class [PR110106]
authorMarek Polacek <polacek@redhat.com>
Tue, 18 Jul 2023 20:02:21 +0000 (16:02 -0400)
committerMarek Polacek <polacek@redhat.com>
Fri, 21 Jul 2023 17:52:19 +0000 (13:52 -0400)
is_really_empty_class is liable to crash when it gets an incomplete
or dependent type.  Since r11-557, we pass the yet-uninstantiated
class type S<0> of the PARM_DECL s to is_really_empty_class -- because
of the potential_rvalue_constant_expression -> is_rvalue_constant_expression
change in cp_parser_constant_expression.  Here we're not parsing
a template so we did not check COMPLETE_TYPE_P as we should.

It should work to complete the type before checking COMPLETE_TYPE_P.

PR c++/110106

gcc/cp/ChangeLog:

* constexpr.cc (potential_constant_expression_1): Try to complete the
type when !processing_template_decl.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/noexcept80.C: New test.

gcc/cp/constexpr.cc
gcc/testsuite/g++.dg/cpp0x/noexcept80.C [new file with mode: 0644]

index 6e8f1c2b61ecaa1de1ba3f143ee4c6dc6a347f15..fb94f3cefcb6b8c77cee3cf99ae2efb665dabaf9 100644 (file)
@@ -9116,8 +9116,9 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
       if (now && want_rval)
        {
          tree type = TREE_TYPE (t);
-         if ((processing_template_decl && !COMPLETE_TYPE_P (type))
-             || dependent_type_p (type)
+         if (dependent_type_p (type)
+             || !COMPLETE_TYPE_P (processing_template_decl
+                                  ? type : complete_type (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/cpp0x/noexcept80.C b/gcc/testsuite/g++.dg/cpp0x/noexcept80.C
new file mode 100644 (file)
index 0000000..3e90af7
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/110106
+// { dg-do compile { target c++11 } }
+
+template<int> struct S
+{
+};
+
+struct G {
+  G(S<0>);
+};
+
+void y(S<0> s) noexcept(noexcept(G{s}));