X-Git-Url: https://gcc.gnu.org/git/?a=blobdiff_plain;f=gcc%2Fcp%2Ftree.c;h=bf542af547ff2047eef11e354262e2c535c85674;hb=98c1c668807d74ad4dfab8c0413499b31f638258;hp=a0605306d911d1096d9e65e7cdc277941d356647;hpb=37c46b43dba86b48bb19d9f7ed231385e02c1abd;p=gcc.git diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index a0605306d911..bf542af547ff 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -32,6 +32,17 @@ Boston, MA 02111-1307, USA. */ #include #endif +extern void compiler_error (); + +static tree get_identifier_list PROTO((tree)); +static tree bot_manip PROTO((tree)); +static tree perm_manip PROTO((tree)); +static tree build_cplus_array_type_1 PROTO((tree, tree)); +static void list_hash_add PROTO((int, tree)); +static int list_hash PROTO((tree, tree, tree)); +static tree list_hash_lookup PROTO((int, int, int, int, tree, tree, + tree)); + #define CEIL(x,y) (((x) + (y) - 1) / (y)) /* Return nonzero if REF is an lvalue valid for this language. @@ -227,10 +238,8 @@ build_cplus_new (type, init) rval = build (NEW_EXPR, type, TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), slot); TREE_SIDE_EFFECTS (rval) = 1; - TREE_ADDRESSABLE (rval) = 1; rval = build (TARGET_EXPR, type, slot, rval, NULL_TREE, NULL_TREE); TREE_SIDE_EFFECTS (rval) = 1; - TREE_ADDRESSABLE (rval) = 1; return rval; } @@ -832,20 +841,18 @@ layout_basetypes (rec, binfos) BINFO_VPTR_FIELD (base_binfo) = decl; vbase_decls = decl; - if (warn_nonvdtor && TYPE_HAS_DESTRUCTOR (basetype) - && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1)) == NULL_TREE) - { - warning_with_decl (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1), - "destructor `%s' non-virtual"); - warning ("in inheritance relationship `%s: virtual %s'", - TYPE_NAME_STRING (rec), - TYPE_NAME_STRING (basetype)); - } got_it: /* The space this decl occupies has already been accounted for. */ continue; } + /* Effective C++ rule 14. We only need to check TYPE_VIRTUAL_P + here because the case of virtual functions but non-virtual + dtor is handled in finish_struct_1. */ + if (warn_ecpp && ! TYPE_VIRTUAL_P (basetype) + && TYPE_HAS_DESTRUCTOR (basetype)) + cp_warning ("base class `%#T' has a non-virtual destructor", basetype); + if (const_size == 0) offset = integer_zero_node; else @@ -854,22 +861,6 @@ layout_basetypes (rec, binfos) const_size = CEIL (const_size, TYPE_ALIGN (basetype)) * TYPE_ALIGN (basetype); offset = size_int ((const_size + BITS_PER_UNIT - 1) / BITS_PER_UNIT); - -#if 0 - /* bpk: Disabled this check until someone is willing to - claim it as theirs and explain exactly what circumstances - warrant the warning. */ - if (warn_nonvdtor && TYPE_HAS_DESTRUCTOR (basetype) - && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1)) == NULL_TREE) - { - warning_with_decl (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1), - "destructor `%s' non-virtual"); - warning ("in inheritance relationship `%s:%s %s'", - TYPE_NAME_STRING (rec), - TREE_VIA_VIRTUAL (base_binfo) ? " virtual" : "", - TYPE_NAME_STRING (basetype)); - } -#endif } BINFO_OFFSET (base_binfo) = offset; if (CLASSTYPE_VSIZE (basetype)) @@ -1311,25 +1302,6 @@ is_aggr_type_2 (t1, t2) return 0; return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2); } - -/* Give message using types TYPE1 and TYPE2 as arguments. - PFN is the function which will print the message; - S is the format string for PFN to use. */ - -void -message_2_types (pfn, s, type1, type2) - void (*pfn) (); - char *s; - tree type1, type2; -{ - tree name1 = TYPE_NAME (type1); - tree name2 = TYPE_NAME (type2); - if (TREE_CODE (name1) == TYPE_DECL) - name1 = DECL_NAME (name1); - if (TREE_CODE (name2) == TYPE_DECL) - name2 = DECL_NAME (name2); - (*pfn) (s, IDENTIFIER_POINTER (name1), IDENTIFIER_POINTER (name2)); -} #define PRINT_RING_SIZE 4 @@ -1426,7 +1398,7 @@ build_exception_variant (type, raises) tree mapcar (t, func) tree t; - tree (*func)(); + tree (*func) PROTO((tree)); { tree tmp; @@ -1529,7 +1501,6 @@ mapcar (t, func) case PREINCREMENT_EXPR: case POSTDECREMENT_EXPR: case POSTINCREMENT_EXPR: - case CALL_EXPR: case ARRAY_REF: case SCOPE_REF: t = copy_node (t); @@ -1537,6 +1508,21 @@ mapcar (t, func) TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func); return t; + case CALL_EXPR: + t = copy_node (t); + TREE_TYPE (t) = mapcar (TREE_TYPE (t), func); + TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); + TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func); + + /* tree.def says that operand two is RTL, but + build_call_declarator puts trees in there. */ + if (TREE_OPERAND (t, 2) + && TREE_CODE (TREE_OPERAND (t, 2)) == TREE_LIST) + TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func); + else + TREE_OPERAND (t, 2) = NULL_TREE; + return t; + case CONVERT_EXPR: case ADDR_EXPR: case INDIRECT_REF: @@ -2019,7 +2005,8 @@ cp_tree_equal (t1, t2) return 0; case TEMPLATE_CONST_PARM: - return TEMPLATE_CONST_IDX (t1) == TEMPLATE_CONST_IDX (t2); + return TEMPLATE_CONST_IDX (t1) == TEMPLATE_CONST_IDX (t2) + && TEMPLATE_CONST_LEVEL (t1) == TEMPLATE_CONST_LEVEL (t2); case SIZEOF_EXPR: if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))