From 8452b1d3c1b7928b09215cf63a1aeb0d9ad255ac Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 3 Nov 1998 17:37:51 +0000 Subject: [PATCH] class.c (instantiate_type): Be more helpful. * class.c (instantiate_type): Be more helpful. * decl2.c (import_export_decl): Call import_export_class. * cp-tree.h (EMPTY_CONSTRUCTOR_P): Check !TREE_HAS_CONSTRUCTOR. * decl2.c (build_expr_from_tree): Propagate TREE_HAS_CONSTRUCTOR. * pt.c (tsubst_copy): Likewise. From-SVN: r23511 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/class.c | 12 ++++++++++-- gcc/cp/cp-tree.h | 5 +++-- gcc/cp/decl2.c | 6 ++++++ gcc/cp/pt.c | 19 ++++++++++++------- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9c421f663ea..bccf932653d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +1998-11-02 Jason Merrill + + * class.c (instantiate_type): Be more helpful. + + * decl2.c (import_export_decl): Call import_export_class. + + * cp-tree.h (EMPTY_CONSTRUCTOR_P): Check !TREE_HAS_CONSTRUCTOR. + * decl2.c (build_expr_from_tree): Propagate TREE_HAS_CONSTRUCTOR. + * pt.c (tsubst_copy): Likewise. + 1998-11-02 Mark Mitchell * init.c (expand_vec_init): Fix off-by-one error. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 1fd492f5fbe..41ca26557f4 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5040,8 +5040,16 @@ instantiate_type (lhstype, rhs, complain) my_friendly_assert (TREE_CODE (function) == FUNCTION_DECL, 185); if (! DECL_STATIC_FUNCTION_P (function)) - cp_error ("reference to `%D' can only be used in a call", - function); + { + tree t = TREE_TYPE (TREE_OPERAND (rhs, 0)); + if (TYPE_MAIN_VARIANT (t) == current_class_type) + t = constructor_name (t); + + cp_error ("object-dependent reference to `%D' can only be used in a call", + function); + cp_error (" to form a pointer to member function, say `&%T::%D'", + t, DECL_NAME (function)); + } mark_used (function); return function; diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index aee859a7008..3f246536e01 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1482,8 +1482,9 @@ extern int flag_new_for_scope; has been duly initialized in its constructor. */ #define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4(NODE)) -#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \ - && CONSTRUCTOR_ELTS (NODE) == NULL_TREE) +#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \ + && CONSTRUCTOR_ELTS (NODE) == NULL_TREE \ + && ! TREE_HAS_CONSTRUCTOR (NODE)) #if 0 /* Indicates that a NON_LVALUE_EXPR came from a C++ reference. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 7b0ba6d7117..cad60783bcf 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2785,6 +2785,7 @@ import_export_decl (decl) else if (DECL_FUNCTION_MEMBER_P (decl)) { tree ctype = DECL_CLASS_CONTEXT (decl); + import_export_class (ctype); if (CLASSTYPE_INTERFACE_KNOWN (ctype) && (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl))) { @@ -2803,6 +2804,10 @@ import_export_decl (decl) else if (DECL_ARTIFICIAL (decl) && DECL_MUTABLE_P (decl)) { tree ctype = TREE_TYPE (DECL_NAME (decl)); + + if (IS_AGGR_TYPE (ctype)) + import_export_class (ctype); + if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype) && TYPE_VIRTUAL_P (ctype) /* If the type is a cv-qualified variant of a type, then we @@ -3852,6 +3857,7 @@ build_expr_from_tree (t) r = build_nt (CONSTRUCTOR, NULL_TREE, build_expr_from_tree (CONSTRUCTOR_ELTS (t))); + TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t); if (TREE_TYPE (t)) return digest_init (TREE_TYPE (t), r, 0); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d4bdf82b40f..b25929e1c2e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5917,6 +5917,7 @@ tsubst_copy (t, args, in_decl) tree in_decl; { enum tree_code code; + tree r; if (t == NULL_TREE || t == error_mark_node) return t; @@ -6000,7 +6001,7 @@ tsubst_copy (t, args, in_decl) if (id != TREE_OPERAND (t, 0)) { - tree r = build_nt (LOOKUP_EXPR, id); + r = build_nt (LOOKUP_EXPR, id); LOOKUP_EXPR_GLOBAL (r) = LOOKUP_EXPR_GLOBAL (t); t = r; } @@ -6119,7 +6120,7 @@ tsubst_copy (t, args, in_decl) case COND_EXPR: case MODOP_EXPR: { - tree r = build_nt + r = build_nt (code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl), tsubst_copy (TREE_OPERAND (t, 1), args, in_decl), tsubst_copy (TREE_OPERAND (t, 2), args, in_decl)); @@ -6142,7 +6143,7 @@ tsubst_copy (t, args, in_decl) case NEW_EXPR: { - tree r = build_nt + r = build_nt (code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl), tsubst_copy (TREE_OPERAND (t, 1), args, in_decl), tsubst_copy (TREE_OPERAND (t, 2), args, in_decl)); @@ -6152,7 +6153,7 @@ tsubst_copy (t, args, in_decl) case DELETE_EXPR: { - tree r = build_nt + r = build_nt (code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl), tsubst_copy (TREE_OPERAND (t, 1), args, in_decl)); DELETE_EXPR_USE_GLOBAL (r) = DELETE_EXPR_USE_GLOBAL (t); @@ -6223,9 +6224,13 @@ tsubst_copy (t, args, in_decl) return t; case CONSTRUCTOR: - return build - (CONSTRUCTOR, tsubst (TREE_TYPE (t), args, in_decl), NULL_TREE, - tsubst_copy (CONSTRUCTOR_ELTS (t), args, in_decl)); + { + r = build + (CONSTRUCTOR, tsubst (TREE_TYPE (t), args, in_decl), NULL_TREE, + tsubst_copy (CONSTRUCTOR_ELTS (t), args, in_decl)); + TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t); + return r; + } default: return t; -- 2.30.2