aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin v. Löwis <loewis@informatik.hu-berlin.de>1999-11-05 23:11:58 +0000
committerMartin v. Löwis <loewis@gcc.gnu.org>1999-11-05 23:11:58 +0000
commit7c355bca10d745fdac57df6a07e1c92fbe3ed8af (patch)
tree3a2d5b2d2ea6a81be81deb66093129b9d26e96db /gcc
parent32c8d1bc1f573799d31e4d443e7deb09f1b3e6c5 (diff)
downloadgcc-7c355bca10d745fdac57df6a07e1c92fbe3ed8af.zip
gcc-7c355bca10d745fdac57df6a07e1c92fbe3ed8af.tar.gz
gcc-7c355bca10d745fdac57df6a07e1c92fbe3ed8af.tar.bz2
cp-tree.h (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK): New macro.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/cp-tree.h20
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/cp/decl2.c6
-rw-r--r--gcc/cp/semantics.c6
5 files changed, 36 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1882c28..0cc115e 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 6f8f1b7..47bb32b 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 80aec15..226f6ae 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 82264e4..5624767 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 54dd7e1..3eb955e 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;