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
