On 1/5/24 11:50, Patrick Palka wrote:
Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK
for trunk and perhaps 13?

-- >8 --

invalid_tparm_referent_p was rejecting using the address of a class NTTP
object as a template argument, but this should be fine.

Hmm, I suppose so; https://eel.is/c++draft/temp#param-8 saying "No two template parameter objects are template-argument-equivalent" suggests there can be only one. And clang/msvc allow it.

        PR c++/113242

gcc/cp/ChangeLog:

        * pt.cc (invalid_tparm_referent_p) <case ADDR_EXPR>: Suppress
        DECL_ARTIFICIAL rejection test for class NTTP objects.

gcc/testsuite/ChangeLog:

        * g++.dg/cpp2a/nontype-class61.C: New test.
---
  gcc/cp/pt.cc                                 |  3 ++-
  gcc/testsuite/g++.dg/cpp2a/nontype-class61.C | 27 ++++++++++++++++++++
  2 files changed, 29 insertions(+), 1 deletion(-)
  create mode 100644 gcc/testsuite/g++.dg/cpp2a/nontype-class61.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 154ac76cb65..8c7d178328d 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -7219,7 +7219,8 @@ invalid_tparm_referent_p (tree type, tree expr, 
tsubst_flags_t complain)
           * a string literal (5.13.5),
           * the result of a typeid expression (8.2.8), or
           * a predefined __func__ variable (11.4.1).  */
-       else if (VAR_P (decl) && DECL_ARTIFICIAL (decl))
+       else if (VAR_P (decl) && !DECL_NTTP_OBJECT_P (decl)
+                && DECL_ARTIFICIAL (decl))

If now some artificial variables are OK and others are not, perhaps we should enumerate them either way and abort if it's one we haven't specifically considered.

Jason

Reply via email to