diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1882c28a5e4b..0cc115e64367 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 6f8f1b7dbc00..47bb32bbc6b6 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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) \ diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 80aec15def56..226f6ae2deb1 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 82264e4052f4..5624767b51dc 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 54dd7e11f48d..3eb955e9a3a9 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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;