aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2009-11-16 08:31:26 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2009-11-16 08:31:26 +0000
commit0229b692f4cba2d23b960284c79384b6f5b2309a (patch)
tree1e489fe775913d9cc90f3d4f84139b663da9da30 /gcc/cp
parent0fc4f703e53c1282e7ff8613b235194ae815e721 (diff)
downloadgcc-0229b692f4cba2d23b960284c79384b6f5b2309a.zip
gcc-0229b692f4cba2d23b960284c79384b6f5b2309a.tar.gz
gcc-0229b692f4cba2d23b960284c79384b6f5b2309a.tar.bz2
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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/decl.c10
-rw-r--r--gcc/cp/decl.h1
-rw-r--r--gcc/cp/parser.c2
4 files changed, 21 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d5dc053..2b18d01 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 0375dd5..73bf995 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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)
diff --git a/gcc/cp/decl.h b/gcc/cp/decl.h
index d6e3c83..a8a2b78 100644
--- a/gcc/cp/decl.h
+++ b/gcc/cp/decl.h
@@ -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 */
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 05def24..3a4b409 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -10508,7 +10508,7 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
parm = grokdeclarator (parameter_declarator->declarator,
&parameter_declarator->decl_specifiers,
- PARM, /*initialized=*/0,
+ TPARM, /*initialized=*/0,
/*attrlist=*/NULL);
if (parm == error_mark_node)
return error_mark_node;