Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk/15?

-- >8 --

When importing a CNTTP object, since r15-3031-g0b7904e274fbd6 we
shortcut the processing of the generated NTTP so that we don't attempt
to recursively load pendings.  However, due to an oversight we do not
properly set TREE_CONSTANT or DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P
on the decl, which confuses later processing.  This patch ensures that
this happens correctly.

        PR c++/119938

gcc/cp/ChangeLog:

        * pt.cc (get_template_parm_object): When !check_init, add assert
        that expr really is constant and mark decl as such.

gcc/testsuite/ChangeLog:

        * g++.dg/modules/tpl-nttp-2_a.H: New test.
        * g++.dg/modules/tpl-nttp-2_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
---
 gcc/cp/pt.cc                                |  7 ++++++-
 gcc/testsuite/g++.dg/modules/tpl-nttp-2_a.H | 14 ++++++++++++++
 gcc/testsuite/g++.dg/modules/tpl-nttp-2_b.C | 10 ++++++++++
 3 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/modules/tpl-nttp-2_a.H
 create mode 100644 gcc/testsuite/g++.dg/modules/tpl-nttp-2_b.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index a71705fd085..75d34532426 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -7492,8 +7492,13 @@ get_template_parm_object (tree expr, tree name, bool 
check_init/*=true*/)
     {
       /* The EXPR is the already processed initializer, set it on the NTTP
         object now so that cp_finish_decl doesn't do it again later.  */
+      gcc_checking_assert (reduced_constant_expression_p (expr));
       DECL_INITIAL (decl) = expr;
-      DECL_INITIALIZED_P (decl) = 1;
+      DECL_INITIALIZED_P (decl) = true;
+      DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = true;
+      /* FIXME setting TREE_CONSTANT on refs breaks the back end.  */
+      if (!TYPE_REF_P (type))
+       TREE_CONSTANT (decl) = true;
     }
 
   pushdecl_top_level_and_finish (decl, expr);
diff --git a/gcc/testsuite/g++.dg/modules/tpl-nttp-2_a.H 
b/gcc/testsuite/g++.dg/modules/tpl-nttp-2_a.H
new file mode 100644
index 00000000000..bfae11cd185
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/tpl-nttp-2_a.H
@@ -0,0 +1,14 @@
+// PR c++/119938
+// { dg-additional-options "-fmodules -std=c++20" }
+// { dg-module-cmi {} }
+
+struct A { int x; };
+
+template <A a> struct B { static_assert(a.x == 1); };
+using C = B<A{1}>;
+
+template <A a> void D() { static_assert(a.x == 2); };
+inline void E() { D<A{2}>(); }
+
+template <A a> struct F { static constexpr int result = a.x; };
+template <int=0> constexpr int G() { return F<A{3}>::result; };
diff --git a/gcc/testsuite/g++.dg/modules/tpl-nttp-2_b.C 
b/gcc/testsuite/g++.dg/modules/tpl-nttp-2_b.C
new file mode 100644
index 00000000000..7e661cbdef0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/tpl-nttp-2_b.C
@@ -0,0 +1,10 @@
+// PR c++/119938
+// { dg-additional-options "-fmodules -std=c++20" }
+
+import "tpl-nttp-2_a.H";
+
+int main() {
+  C c;
+  E();
+  static_assert(G() == 3);
+}
-- 
2.47.0

Reply via email to