Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
-- >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
--
2.53.0