diff options
author | giovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-12-16 15:54:28 +0000 |
---|---|---|
committer | giovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-12-16 15:54:28 +0000 |
commit | 7fc97909d54804a33f039b9841ce66ed26f09022 (patch) | |
tree | 5afd8cce9ceab35df290769d4595b8a5cdf5d96d /gcc/cp/semantics.c | |
parent | 1802e8b59431036701b07e0d90863c95b694ab80 (diff) | |
download | gcc-7fc97909d54804a33f039b9841ce66ed26f09022.tar.gz |
* semantics.c (finish_id_expression): Refactor the code to handle
template parameters, and emit a more informative error message
when they are used within non integral constant expressions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74700 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/semantics.c')
-rw-r--r-- | gcc/cp/semantics.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 574c9b0ebbb..a33a540c676 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2392,12 +2392,30 @@ finish_id_expression (tree id_expression, } /* If the name resolved to a template parameter, there is no - need to look it up again later. Similarly, we resolve - enumeration constants to their underlying values. */ - if (TREE_CODE (decl) == CONST_DECL) + need to look it up again later. */ + if ((TREE_CODE (decl) == CONST_DECL && DECL_TEMPLATE_PARM_P (decl)) + || TREE_CODE (decl) == TEMPLATE_PARM_INDEX) { *idk = CP_ID_KIND_NONE; - if (DECL_TEMPLATE_PARM_P (decl) || !processing_template_decl) + if (TREE_CODE (decl) == TEMPLATE_PARM_INDEX) + decl = TEMPLATE_PARM_DECL (decl); + if (constant_expression_p + && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (decl))) + { + if (!allow_non_constant_expression_p) + error ("template parameter `%D' of type `%T' is not allowed in " + "an integral constant expression because it is not of " + "integral or enumeration type", decl, TREE_TYPE (decl)); + *non_constant_expression_p = true; + } + return DECL_INITIAL (decl); + } + /* Similarly, we resolve enumeration constants to their + underlying values. */ + else if (TREE_CODE (decl) == CONST_DECL) + { + *idk = CP_ID_KIND_NONE; + if (!processing_template_decl) return DECL_INITIAL (decl); return decl; } @@ -2516,21 +2534,17 @@ finish_id_expression (tree id_expression, } /* Only certain kinds of names are allowed in constant - expression. Enumerators have already been handled above. */ + expression. Enumerators and template parameters + have already been handled above. */ if (constant_expression_p) { - /* Non-type template parameters of integral or enumeration - type are OK. */ - if (TREE_CODE (decl) == TEMPLATE_PARM_INDEX - && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (decl))) - ; - /* Const variables or static data members of integral or - enumeration types initialized with constant expressions - are OK. */ - else if (TREE_CODE (decl) == VAR_DECL - && CP_TYPE_CONST_P (TREE_TYPE (decl)) - && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (decl)) - && DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)) + /* Const variables or static data members of integral or + enumeration types initialized with constant expressions + are OK. */ + if (TREE_CODE (decl) == VAR_DECL + && CP_TYPE_CONST_P (TREE_TYPE (decl)) + && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (decl)) + && DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)) ; else { |