re PR c++/28249 ("long long long" accepted by catch)
PR c++/28249 * parser.c (cp_parser_check_decl_spec): New function. (cp_parser_decl_specifier_seq): Factor out check for repeated decl-specifiers into cp_parser_check_decl_spec. Use it. (cp_parser_type_specifier_seq) Use it. * g++.dg/parse/catch1.C: New test. From-SVN: r115469
This commit is contained in:
parent
0a9367cbdb
commit
856367df08
4 changed files with 63 additions and 36 deletions
|
@ -1,5 +1,11 @@
|
|||
2006-07-15 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||
|
||||
PR c++/28249
|
||||
* parser.c (cp_parser_check_decl_spec): New function.
|
||||
(cp_parser_decl_specifier_seq): Factor out check for repeated
|
||||
decl-specifiers into cp_parser_check_decl_spec. Use it.
|
||||
(cp_parser_type_specifier_seq) Use it.
|
||||
|
||||
PR c++/28294
|
||||
* semantics.c (finish_offsetof): Use TREE_OPERAND for COMPONENT_REFs
|
||||
only.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2006-07-15 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||
|
||||
PR c++/28249
|
||||
* g++.dg/parse/catch1.C: New test.
|
||||
|
||||
PR c++/28294
|
||||
* g++.dg/ext/offsetof1.C: Add test with function pointer arithmetic.
|
||||
|
||||
|
|
8
gcc/testsuite/g++.dg/parse/catch1.C
Normal file
8
gcc/testsuite/g++.dg/parse/catch1.C
Normal file
|
@ -0,0 +1,8 @@
|
|||
// PR c++/28249
|
||||
// { dg-do compile }
|
||||
|
||||
void foo()
|
||||
{
|
||||
try {}
|
||||
catch (long long long) {} // { dg-error "long long long" }
|
||||
}
|
Loading…
Add table
Reference in a new issue