semantics.c (finish_id_expression): Refactor the code to handle template parameters...
authorGiovanni Bajo <giovannibajo@gcc.gnu.org>
Tue, 16 Dec 2003 15:54:28 +0000 (15:54 +0000)
committerGiovanni Bajo <giovannibajo@gcc.gnu.org>
Tue, 16 Dec 2003 15:54:28 +0000 (15:54 +0000)
* 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.

From-SVN: r74700

gcc/cp/ChangeLog
gcc/cp/semantics.c

index 573604fe3b4c75291935355eb21eb350205a796e..4a19573adf63c3fd36fc81222cdc2c2f01fb6272 100644 (file)
@@ -1,3 +1,9 @@
+2003-12-16  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
+
+       * 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.
+\r
 2003-12-16  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/13387
index 574c9b0ebbbe8835520fb28eafe50d34ec3f535c..a33a540c676e83a7a7d17f380cff686d3d94ef83 100644 (file)
@@ -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
            {