diff options
Diffstat (limited to 'gcc/cp/parser.c')
| -rw-r--r-- | gcc/cp/parser.c | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 63a6b88..81000bf 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1950,6 +1950,49 @@ cp_parser_simulate_error (cp_parser* parser) return false; } +/* Check for repeated decl-specifiers. */ + +static void +cp_parser_check_decl_spec (cp_decl_specifier_seq *decl_specs) +{ + cp_decl_spec ds; + + for (ds = ds_first; ds != ds_last; ++ds) + { + unsigned count = decl_specs->specs[(int)ds]; + if (count < 2) + continue; + /* The "long" specifier is a special case because of "long long". */ + if (ds == ds_long) + { + if (count > 2) + error ("%<long long long%> is too long for GCC"); + else if (pedantic && !in_system_header && warn_long_long) + pedwarn ("ISO C++ does not support %<long long%>"); + } + else if (count > 1) + { + static const char *const decl_spec_names[] = { + "signed", + "unsigned", + "short", + "long", + "const", + "volatile", + "restrict", + "inline", + "virtual", + "explicit", + "friend", + "typedef", + "__complex", + "__thread" + }; + error ("duplicate %qs", decl_spec_names[(int)ds]); + } + } +} + /* This function is called when a type is defined. If type definitions are forbidden at this point, an error message is issued. */ @@ -7376,7 +7419,6 @@ cp_parser_decl_specifier_seq (cp_parser* parser, int* declares_class_or_enum) { bool constructor_possible_p = !parser->in_declarator_p; - cp_decl_spec ds; /* Clear DECL_SPECS. */ clear_decl_specs (decl_specs); @@ -7559,41 +7601,7 @@ cp_parser_decl_specifier_seq (cp_parser* parser, flags |= CP_PARSER_FLAGS_OPTIONAL; } - /* Check for repeated decl-specifiers. */ - for (ds = ds_first; ds != ds_last; ++ds) - { - unsigned count = decl_specs->specs[(int)ds]; - if (count < 2) - continue; - /* The "long" specifier is a special case because of "long long". */ - if (ds == ds_long) - { - if (count > 2) - error ("%<long long long%> is too long for GCC"); - else if (pedantic && !in_system_header && warn_long_long) - pedwarn ("ISO C++ does not support %<long long%>"); - } - else if (count > 1) - { - static const char *const decl_spec_names[] = { - "signed", - "unsigned", - "short", - "long", - "const", - "volatile", - "restrict", - "inline", - "virtual", - "explicit", - "friend", - "typedef", - "__complex", - "__thread" - }; - error ("duplicate %qs", decl_spec_names[(int)ds]); - } - } + cp_parser_check_decl_spec (decl_specs); /* Don't allow a friend specifier with a class definition. */ if (decl_specs->specs[(int) ds_friend] != 0 @@ -12030,6 +12038,8 @@ cp_parser_type_specifier_seq (cp_parser* parser, if (is_condition && !is_cv_qualifier) flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES; } + + cp_parser_check_decl_spec (type_specifier_seq); } /* Parse a parameter-declaration-clause. |
