re PR c++/32056 (Storage classes on template parameters)
cp/ 2009-11-16 Paolo Carlini <paolo.carlini@oracle.com> PR c++/32056 * decl.h (enum decl_context): Add TPARM enumerator. * decl.c (grokdeclarator): Per 14.1/2, error out if a storage class is specified in a template parameter declaration. * parser.c (cp_parser_template_parameter): Call grokdeclarator with TPARM as third argument. testsuite/ 2009-11-16 Paolo Carlini <paolo.carlini@oracle.com> PR c++/32056 * testsuite/g++.dg/template/error44.C: New. From-SVN: r154198
This commit is contained in:
parent
0fc4f703e5
commit
0229b692f4
|
@ -1,3 +1,12 @@
|
|||
2009-11-16 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/32056
|
||||
* decl.h (enum decl_context): Add TPARM enumerator.
|
||||
* decl.c (grokdeclarator): Per 14.1/2, error out if a storage class
|
||||
is specified in a template parameter declaration.
|
||||
* parser.c (cp_parser_template_parameter): Call grokdeclarator with
|
||||
TPARM as third argument.
|
||||
|
||||
2009-11-13 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/27425
|
||||
|
|
|
@ -7574,11 +7574,13 @@ check_var_type (tree identifier, tree type)
|
|||
try to parse.
|
||||
PARM for a parameter declaration (either within a function prototype
|
||||
or before a function body). Make a PARM_DECL, or return void_type_node.
|
||||
TPARM for a template parameter declaration.
|
||||
CATCHPARM for a parameter declaration before a catch clause.
|
||||
TYPENAME if for a typename (in a cast or sizeof).
|
||||
Don't make a DECL node; just return the ..._TYPE node.
|
||||
FIELD for a struct or union field; make a FIELD_DECL.
|
||||
BITFIELD for a field with specified width.
|
||||
|
||||
INITIALIZED is as for start_decl.
|
||||
|
||||
ATTRLIST is a pointer to the list of attributes, which may be NULL
|
||||
|
@ -7662,6 +7664,7 @@ grokdeclarator (const cp_declarator *declarator,
|
|||
bool type_was_error_mark_node = false;
|
||||
bool parameter_pack_p = declarator? declarator->parameter_pack_p : false;
|
||||
bool template_type_arg = false;
|
||||
bool template_parm_flag = false;
|
||||
bool constexpr_p = declspecs->specs[(int) ds_constexpr];
|
||||
const char *errmsg;
|
||||
|
||||
|
@ -7680,6 +7683,8 @@ grokdeclarator (const cp_declarator *declarator,
|
|||
bitfield = 1, decl_context = FIELD;
|
||||
else if (decl_context == TEMPLATE_TYPE_ARG)
|
||||
template_type_arg = true, decl_context = TYPENAME;
|
||||
else if (decl_context == TPARM)
|
||||
template_parm_flag = true, decl_context = PARM;
|
||||
|
||||
if (initialized > 1)
|
||||
funcdef_flag = true;
|
||||
|
@ -8179,6 +8184,11 @@ grokdeclarator (const cp_declarator *declarator,
|
|||
error ("typedef declaration invalid in parameter declaration");
|
||||
return error_mark_node;
|
||||
}
|
||||
else if (template_parm_flag && storage_class != sc_none)
|
||||
{
|
||||
error ("storage class specified for template parameter %qs", name);
|
||||
return error_mark_node;
|
||||
}
|
||||
else if (storage_class == sc_static
|
||||
|| storage_class == sc_extern
|
||||
|| thread_p)
|
||||
|
|
|
@ -23,6 +23,7 @@ enum decl_context
|
|||
{ NORMAL, /* Ordinary declaration */
|
||||
FUNCDEF, /* Function definition */
|
||||
PARM, /* Declaration of parm before function body */
|
||||
TPARM, /* Declaration of template parm */
|
||||
CATCHPARM, /* Declaration of catch parm */
|
||||
FIELD, /* Declaration inside struct or union */
|
||||
BITFIELD, /* Likewise but with specified width */
|
||||
|
|
|
@ -10508,7 +10508,7 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
|
|||
|
||||
parm = grokdeclarator (parameter_declarator->declarator,
|
||||
¶meter_declarator->decl_specifiers,
|
||||
PARM, /*initialized=*/0,
|
||||
TPARM, /*initialized=*/0,
|
||||
/*attrlist=*/NULL);
|
||||
if (parm == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2009-11-16 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/32056
|
||||
* testsuite/g++.dg/template/error44.C: New.
|
||||
|
||||
2009-11-16 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
|
||||
|
||||
* gcc.c-torture/execute/pr41919.c: Mark chars explicitely as signed.
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// PR c++/32056
|
||||
|
||||
template <auto int T> struct A {}; // { dg-error "storage class specified" }
|
||||
template <extern int T> struct B {}; // { dg-error "storage class specified" }
|
||||
template <static int T> struct C {}; // { dg-error "storage class specified" }
|
||||
template <register int T> struct D {}; // { dg-error "storage class specified" }
|
||||
template <mutable int T> struct E {}; // { dg-error "storage class specified" }
|
Loading…
Reference in New Issue