[gcc r16-7042] c++: tweak for cp_parser_type_id_1
Marek Polacek
mpolacek@gcc.gnu.org
Mon Jan 26 13:56:57 GMT 2026
https://gcc.gnu.org/g:8c7e749cfe4ac27c584c30ca831caf8ab42b9310
commit r16-7042-g8c7e749cfe4ac27c584c30ca831caf8ab42b9310
Author: Marek Polacek <polacek@redhat.com>
Date: Thu Jan 22 14:49:08 2026 -0500
c++: tweak for cp_parser_type_id_1
This addresses the cp_parser_type_id_1 comment in
<https://gcc.gnu.org/pipermail/gcc-patches/2025-December/704168.html>
asking for simplifying the type_alias_p handling.
gcc/cp/ChangeLog:
* parser.cc (cp_parser_type_specifier): Adjust comment.
(cp_parser_type_id_1): Simplify setting of type_alias_p.
Use nullptr instead of NULL.
Reviewed-by: Jason Merrill <jason@redhat.com>
Diff:
---
gcc/cp/parser.cc | 25 ++++++++++---------------
1 file changed, 10 insertions(+), 15 deletions(-)
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 58d8c3d87852..168c2f3f1d14 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -22277,7 +22277,7 @@ cp_parser_type_specifier (cp_parser* parser,
/* Fall through. */
case RID_TYPENAME:
/* If we see 'typename [:', this could be a typename-specifier.
- But if there's no '::' after the '[:x:]' then it is probably
+ But if there's no '::' after the '[:x:]' then it is
a simple-type-specifier. */
if (keyword == RID_TYPENAME
&& cp_parser_nth_token_starts_splice_without_nns_p (parser, 2))
@@ -27661,7 +27661,6 @@ cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags flags,
{
cp_decl_specifier_seq type_specifier_seq;
cp_declarator *abstract_declarator;
- cp_token *next = nullptr;
/* Parse the type-specifier-seq. */
cp_parser_type_specifier_seq (parser, flags,
@@ -27671,17 +27670,6 @@ cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags flags,
if (type_location)
*type_location = type_specifier_seq.locations[ds_type_spec];
- /* If there is just ds_type_spec specified, this could be a type alias. */
- if (type_alias_p && is_typedef_decl (type_specifier_seq.type))
- {
- int i;
- for (i = ds_first; i < ds_last; ++i)
- if (i != ds_type_spec && type_specifier_seq.locations[i])
- break;
- if (i == ds_last)
- next = cp_lexer_peek_token (parser->lexer);
- }
-
if (is_template_arg && type_specifier_seq.type
&& TREE_CODE (type_specifier_seq.type) == TEMPLATE_TYPE_PARM
&& CLASS_PLACEHOLDER_TEMPLATE (type_specifier_seq.type))
@@ -27707,12 +27695,19 @@ cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags flags,
/*static_p=*/false);
/* Check to see if there really was a declarator. */
if (!cp_parser_parse_definitely (parser))
- abstract_declarator = NULL;
+ abstract_declarator = nullptr;
/* If we found * or & and similar after the type-specifier, it's not
a type alias. */
if (type_alias_p)
- *type_alias_p = cp_lexer_peek_token (parser->lexer) == next;
+ *type_alias_p = [&] {
+ if (abstract_declarator || !is_typedef_decl (type_specifier_seq.type))
+ return false;
+ for (int i = ds_first; i < ds_last; ++i)
+ if (i != ds_type_spec && type_specifier_seq.locations[i])
+ return false;
+ return true;
+ } ();
bool auto_typeid_ok = false;
/* DR 625 prohibits use of auto as a template-argument. We allow 'auto'
More information about the Gcc-cvs
mailing list