Commit 856367df by Volker Reichelt Committed by Volker Reichelt

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
parent 0a9367cb
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.
......
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.
// PR c++/28249
// { dg-do compile }
void foo()
{
try {}
catch (long long long) {} // { dg-error "long long long" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment