On 3/16/26 10:39 AM, Marek Polacek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

OK.  Does this also fix 124494 without the other patch?

-- >8 --
Here we emit a bogus "type/value mismatch" error because
convert_template_argument gets a USING_DECL instead of an expected
TYPE_DECL.  When we are parsing a reflect-expression we set
cp_preserve_using_decl not to strip USING_DECLs.  The flag should
probably go, subject to 124169, but meanwhile we can at least move
overriding cp_preserve_using_decl below, just before the call to
cp_parser_lookup_name_simple, where it actually matters.  The wrong
error comes from _reflection_name -> _nested_name_specifier_opt
which happens before cp_parser_identifier.

        PR c++/124472

gcc/cp/ChangeLog:

        * parser.cc (cp_parser_reflection_name): Move the
        cp_preserve_using_decl overriding below, before
        cp_parser_lookup_name_simple.

gcc/testsuite/ChangeLog:

        * g++.dg/reflect/using2.C: New test.
---
  gcc/cp/parser.cc                      |  2 +-
  gcc/testsuite/g++.dg/reflect/using2.C | 12 ++++++++++++
  2 files changed, 13 insertions(+), 1 deletion(-)
  create mode 100644 gcc/testsuite/g++.dg/reflect/using2.C

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index ffb22aa776f..2879aaae833 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -10052,7 +10052,6 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
  static tree
  cp_parser_reflection_name (cp_parser *parser)
  {
-  auto s = make_temp_override (cp_preserve_using_decl, true);
/* Look for the optional `::' operator. */
    bool global_scope_p
@@ -10076,6 +10075,7 @@ cp_parser_reflection_name (cp_parser *parser)
      cp_parser_error (parser, "%<template%> must follow a nested-name-"
                     "specifier");
+ auto s = make_temp_override (cp_preserve_using_decl, true);
    /* Look for the identifier.  */
    location_t loc = cp_lexer_peek_token (parser->lexer)->location;
    tree name = cp_parser_identifier (parser);
diff --git a/gcc/testsuite/g++.dg/reflect/using2.C 
b/gcc/testsuite/g++.dg/reflect/using2.C
new file mode 100644
index 00000000000..3e69748f9fc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/using2.C
@@ -0,0 +1,12 @@
+// PR c++/124472
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+using foo = int;
+namespace X {
+    using ::foo;
+    template<class> using bar = int;
+}
+
+X::bar<X::foo> y;
+constexpr auto x = ^^X::bar<X::foo>;

base-commit: 172f92a464f64b3d6e0a6835882c6cbab36ffc3e

Reply via email to