]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: complete_vars ICE with non-exported constexpr var
authorPatrick Palka <ppalka@redhat.com>
Fri, 1 Mar 2024 21:50:20 +0000 (16:50 -0500)
committerPatrick Palka <ppalka@redhat.com>
Fri, 1 Mar 2024 21:50:20 +0000 (16:50 -0500)
Here after stream-in of the non-exported constexpr global 'A a' we call
maybe_register_incomplete_var, which we'd expect to be a no-op here but
it manages to take its second branch and pushes {a, NULL_TREE} onto
incomplete_vars.  Later after defining B we ICE from complete_vars due
to this pushed NULL_TREE class context.

Judging by the two commits that introduced/modified this part of
maybe_register_incomplete_var, r196852 and r214333, it seems this second
branch is only concerned with constexpr static data members (whose
initializer may contain a pointer-to-member for a not-yet-complete class)
So this patch restricts this branch accordingly so it's not inadvertently
taken during stream-in.

gcc/cp/ChangeLog:

* decl.cc (maybe_register_incomplete_var): Restrict second
branch to static data members from a not-yet-complete class.

gcc/testsuite/ChangeLog:

* g++.dg/modules/cexpr-4_a.C: New test.
* g++.dg/modules/cexpr-4_b.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/decl.cc
gcc/testsuite/g++.dg/modules/cexpr-4_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/cexpr-4_b.C [new file with mode: 0644]

index 993d7ef4d2bf52379c87e85c58bfb73584167f78..dbc3df24e77f2b17bb65d6fecae946225109942d 100644 (file)
@@ -18979,6 +18979,8 @@ maybe_register_incomplete_var (tree var)
          vec_safe_push (incomplete_vars, iv);
        }
       else if (!(DECL_LANG_SPECIFIC (var) && DECL_TEMPLATE_INFO (var))
+              && DECL_CLASS_SCOPE_P (var)
+              && TYPE_BEING_DEFINED (DECL_CONTEXT (var))
               && decl_constant_var_p (var)
               && (TYPE_PTRMEM_P (inner_type) || CLASS_TYPE_P (inner_type)))
        {
diff --git a/gcc/testsuite/g++.dg/modules/cexpr-4_a.C b/gcc/testsuite/g++.dg/modules/cexpr-4_a.C
new file mode 100644 (file)
index 0000000..44eea35
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-additional-options "-fmodules-ts" }
+export module Cexpr4;
+// { dg-module-cmi "Cexpr4" }
+
+struct A { int m = 42; };
+
+constexpr A a;
+
+export
+inline int f() { return a.m; }
diff --git a/gcc/testsuite/g++.dg/modules/cexpr-4_b.C b/gcc/testsuite/g++.dg/modules/cexpr-4_b.C
new file mode 100644 (file)
index 0000000..8ead58e
--- /dev/null
@@ -0,0 +1,6 @@
+// { dg-additional-options "-fmodules-ts" }
+import Cexpr4;
+
+int v = f();
+
+struct B { };