cp-tree.h (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK): New macro.
authorMartin v. Löwis <loewis@informatik.hu-berlin.de>
Fri, 5 Nov 1999 23:11:58 +0000 (23:11 +0000)
committerMartin v. Löwis <loewis@gcc.gnu.org>
Fri, 5 Nov 1999 23:11:58 +0000 (23:11 +0000)
* cp-tree.h (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK): New macro.
(DECL_TEMPLATE_INFO): Use it.
* decl.c (warn_extern_redeclared_static): Do nothing for
TEMPLATE_DECLs.
* decl2.c (mark_used): Explicitly check for function or variable.
* semantics.c (finish_unary_op_expr): Check whether result is also
an INTEGER_CST.

From-SVN: r30426

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/semantics.c

index 1882c28a5e4b5718d48aa77c0d11c887a3529489..0cc115e643671297f69c17d7a8fa2a11a40a005b 100644 (file)
@@ -1,3 +1,13 @@
+1999-11-05  Martin v. Löwis  <loewis@informatik.hu-berlin.de>
+
+       * cp-tree.h (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK): New macro.
+       (DECL_TEMPLATE_INFO): Use it.
+       * decl.c (warn_extern_redeclared_static): Do nothing for
+       TEMPLATE_DECLs.
+       * decl2.c (mark_used): Explicitly check for function or variable.
+       * semantics.c (finish_unary_op_expr): Check whether result is also
+       an INTEGER_CST.
+
 1999-11-05  Mark Mitchell  <mark@codesourcery.com>
 
        * Makefile.in (typeck2.o): Depend on output.h.
index 6f8f1b7dbc008f5f658f1ee4906d0e6b4928e90c..47bb32bbc6b60886ae0a6e224e1e7839bcf75f09 100644 (file)
@@ -134,6 +134,17 @@ Boston, MA 02111-1307, USA.  */
                         __LINE__, __PRETTY_FUNCTION__);        \
     __t; })
 
+#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE)            \
+({  const tree __t = NODE;                                     \
+    enum tree_code __c = TREE_CODE(__t);                       \
+    if (__c != VAR_DECL                                        \
+       && __c != FUNCTION_DECL                                 \
+       && __c != TYPE_DECL                                     \
+       && __c != TEMPLATE_DECL)                                \
+      tree_check_failed (__t, VAR_DECL, __FILE__,              \
+                        __LINE__, __PRETTY_FUNCTION__);        \
+    __t; })
+
 #define RECORD_OR_UNION_TYPE_CHECK(NODE)                       \
 ({  const tree __t = NODE;                                     \
     enum tree_code __c = TREE_CODE(__t);                       \
@@ -145,6 +156,7 @@ Boston, MA 02111-1307, USA.  */
 #else /* not ENABLE_CHECKING, or not gcc */
 
 #define VAR_OR_FUNCTION_DECL_CHECK(NODE)       NODE
+#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE)    NODE
 #define RECORD_OR_UNION_TYPE_CHECK(NODE)       NODE
 
 #endif
@@ -1601,7 +1613,8 @@ struct lang_decl_flags
   tree context;
 
   union {
-    /* In a FUNCTION_DECL or a VAR_DECL, this is DECL_TEMPLATE_INFO.  */
+    /* In a FUNCTION_DECL, VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this
+       is DECL_TEMPLATE_INFO.  */
     tree template_info;
 
     /* In a NAMESPACE_DECL, this is NAMESPACE_LEVEL.  */
@@ -1838,9 +1851,10 @@ struct lang_decl
 #define DECL_SAVED_INLINE(DECL) \
   (DECL_LANG_SPECIFIC(DECL)->decl_flags.saved_inline)
 
-/* For a VAR_DECL or FUNCTION_DECL: template-specific information.  */
+/* For a VAR_DECL, FUNCTION_DECL, TYPE_DECL or TEMPLATE_DECL:
+   template-specific information.  */
 #define DECL_TEMPLATE_INFO(NODE) \
-  (DECL_LANG_SPECIFIC(VAR_OR_FUNCTION_DECL_CHECK (NODE))->decl_flags.u.template_info)
+  (DECL_LANG_SPECIFIC(VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE))->decl_flags.u.template_info)
 
 /* Template information for a RECORD_TYPE or UNION_TYPE.  */
 #define CLASSTYPE_TEMPLATE_INFO(NODE) \
index 80aec15def56d44969dd24efbf905c28c3239cb2..226f6ae2deb11ed88d988e01b07553de38f9c90b 100644 (file)
@@ -2900,7 +2900,8 @@ warn_extern_redeclared_static (newdecl, olddecl)
 
   tree name;
 
-  if (TREE_CODE (newdecl) == TYPE_DECL)
+  if (TREE_CODE (newdecl) == TYPE_DECL 
+      || TREE_CODE (newdecl) == TEMPLATE_DECL)
     return;
   
   /* Don't get confused by static member functions; that's a different
index 82264e4052f42118581f8c81da3ce4a4bd6741c0..5624767b51dcc9661078673c7a25031e133739b9 100644 (file)
@@ -5152,11 +5152,9 @@ mark_used (decl)
 
   /* If this is a function or variable that is an instance of some
      template, we now know that we will need to actually do the
-     instantiation.  A TEMPLATE_DECL may also have DECL_TEMPLATE_INFO,
-     if it's a partial instantiation, but there's no need to
-     instantiate such a thing.  We check that DECL is not an explicit
+     instantiation. We check that DECL is not an explicit
      instantiation because that is not checked in instantiate_decl.  */
-  if (TREE_CODE (decl) != TEMPLATE_DECL
+  if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
       && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
       && !DECL_EXPLICIT_INSTANTIATION (decl))
     instantiate_decl (decl);
index 54dd7e11f48d6bf21335d6db388731fc540562c6..3eb955e9a3a900404a34b4347193c341ad9f7032 100644 (file)
@@ -1597,7 +1597,11 @@ finish_unary_op_expr (code, expr)
      tree expr;
 {
   tree result = build_x_unary_op (code, expr);
-  if (code == NEGATE_EXPR && TREE_CODE (expr) == INTEGER_CST)
+  /* Inside a template, build_x_unary_op does not fold the
+     expression. So check whether the result is folded before
+     setting TREE_NEGATED_INT.  */
+  if (code == NEGATE_EXPR && TREE_CODE (expr) == INTEGER_CST
+      && TREE_CODE (result) == INTEGER_CST)
     TREE_NEGATED_INT (result) = 1;
   overflow_warning (result);
   return result;