From: Nathan Sidwell Date: Tue, 14 Jul 2020 12:57:57 +0000 (-0700) Subject: c++: Comments & formatting X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;ds=sidebyside;h=31dbaab57fef485412a0369a222b9c252ad2713b;p=gcc.git c++: Comments & formatting I found some bad formatting and misleading or incomplete comments during my spelunking around the c++FE. May as well clean up trunk and record what I noted. gcc/cp/ * cp-tree.h: Correct some tree lang flag comments, reformat some structure definitions. Note some structure sizes. Clarify some comments. (yyungetc): Delete. Not been a thing for some time. * class.c (copy_fndecl_with_name): Comment. (check_bases_and_members): Unnecessary {}. (layout_class_type): Comment. * cp-tree.def (UNBOUND_CLASS_TEMPLATE): Adjust comment. * decl.c: Fix some formatting & whitespace issues. (function_requirements_equivalent_p): Note why substitutions are needed. * decl2.c (no_linkage_error): Note that heroics about 'typedef struct { ... };' are no longer needed. * method.c: Whitespace. * name-lookup.c: Whitespace. (add_decl_to_level): Reformat a line. (print_binding_stack): Mark as DEBUG_FUNCTION. (has_using_namespace_std_directive_p): Delete comment. * pt.c: Whitespace * ptree.c: Whitespace. * rtti.c: Whitespace & comment. * tree.c: Comment. * typeck.c (structural_comptypes): Add comment. --- diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 14380c7a08c..c49055d384e 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -4708,6 +4708,10 @@ check_methods (tree t) } } +/* FN is constructor, destructor or operator function. Clone the + declaration to create a NAME'd variant. NEED_VTT_PARM_P and + OMIT_INHERITED_PARMS_P are relevant if it's a cdtor. */ + static tree copy_fndecl_with_name (tree fn, tree name, tree_code code, bool need_vtt_parm_p, bool omit_inherited_parms_p) @@ -6091,10 +6095,8 @@ check_bases_and_members (tree t) } if (LAMBDA_TYPE_P (t)) - { - /* "This class type is not an aggregate." */ - CLASSTYPE_NON_AGGREGATE (t) = 1; - } + /* "This class type is not an aggregate." */ + CLASSTYPE_NON_AGGREGATE (t) = 1; /* Compute the 'literal type' property before we do anything with non-static member functions. */ @@ -6717,6 +6719,8 @@ layout_class_type (tree t, tree *virtuals_p) indicates the total number of bits used. Therefore, rli_size_so_far, rather than rli_size_unit_so_far, is used to compute TYPE_SIZE_UNIT. */ + + /* Set the size and alignment for the new type. */ tree eoc = end_of_class (t, /*include_virtuals_p=*/0); TYPE_SIZE_UNIT (base_t) = size_binop (MAX_EXPR, diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def index 99851eb780f..31be2cf41a3 100644 --- a/gcc/cp/cp-tree.def +++ b/gcc/cp/cp-tree.def @@ -194,7 +194,9 @@ DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm", /* For template template argument of the form `T::template C'. TYPE_CONTEXT is `T', the template parameter dependent object. - TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template. */ + TYPE_NAME is a TEMPLATE_DECL, whose DECL_TEMPLATE_PARMS are any + template parms of the instantiation. That decl's DECL_NAME is the + IDENTIFIER_NODE for `C', the member class template. */ DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0) /* A using declaration. USING_DECL_SCOPE contains the specified diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 2aa8ebe64c0..a599f3bad1c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1,4 +1,4 @@ -/* Definitions for C++ parsing and type checking. +/* Definitions for -*- C++ -*- parsing and type checking. Copyright (C) 1987-2020 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) @@ -391,7 +391,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; CLEANUP_P (in TRY_BLOCK) AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR) PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF, SCOPE_REF) - PAREN_STRING_LITERAL (in STRING_CST) + PAREN_STRING_LITERAL_P (in STRING_CST) CP_DECL_THREAD_LOCAL_P (in VAR_DECL) KOENIG_LOOKUP_P (in CALL_EXPR) STATEMENT_LIST_NO_SCOPE (in STATEMENT_LIST). @@ -486,7 +486,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; CALL_EXPR_REVERSE_ARGS (in CALL_EXPR, AGGR_INIT_EXPR) CONSTRUCTOR_PLACEHOLDER_BOUNDARY (in CONSTRUCTOR) 6: TYPE_MARKED_P (in _TYPE) - DECL_NON_TRIVIALLY_INITIALIZED_P (in VAR_DECL) + DECL_NONTRIVIALLY_INITIALIZED_P (in VAR_DECL) RANGE_FOR_IVDEP (in RANGE_FOR_STMT) CALL_EXPR_OPERATOR_SYNTAX (in CALL_EXPR, AGGR_INIT_EXPR) CONSTRUCTOR_IS_DESIGNATED_INIT (in CONSTRUCTOR) @@ -515,7 +515,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; DECL_VLA_CAPTURE_P (in FIELD_DECL) DECL_ARRAY_PARAMETER_P (in PARM_DECL) LABEL_DECL_CONTINUE (in LABEL_DECL) - 2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL). + 2: DECL_THIS_EXTERN (in VAR_DECL, FUNCTION_DECL or PARM_DECL) DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL) DECL_CONSTRAINT_VAR_P (in a PARM_DECL) TEMPLATE_DECL_COMPLEX_ALIAS_P (in TEMPLATE_DECL) @@ -527,7 +527,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; DECL_SELF_REFERENCE_P (in a TYPE_DECL) DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL) 5: DECL_INTERFACE_KNOWN. - 6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL). + 6: DECL_THIS_STATIC (in VAR_DECL, FUNCTION_DECL or PARM_DECL) DECL_FIELD_IS_BASE (in FIELD_DECL) TYPE_DECL_ALIAS_P (in TYPE_DECL) 7: DECL_THUNK_P (in a member FUNCTION_DECL) @@ -783,8 +783,7 @@ struct GTY(()) tree_overload { /* Iterator for a 1 dimensional overload. Permits iterating over the outer level of a 2-d overload when explicitly enabled. */ -class ovl_iterator -{ +class ovl_iterator { tree ovl; const bool allow_inner; /* Only used when checking. */ @@ -872,8 +871,7 @@ class ovl_iterator /* Iterator over a (potentially) 2 dimensional overload, which is produced by name lookup. */ -class lkp_iterator : public ovl_iterator -{ +class lkp_iterator : public ovl_iterator { typedef ovl_iterator parent; tree outer; @@ -905,8 +903,7 @@ class lkp_iterator : public ovl_iterator /* hash traits for declarations. Hashes potential overload sets via DECL_NAME. */ -struct named_decl_hash : ggc_remove -{ +struct named_decl_hash : ggc_remove { typedef tree value_type; /* A DECL or OVERLOAD */ typedef tree compare_type; /* An identifier. */ @@ -1356,8 +1353,8 @@ struct GTY (()) tree_trait_expr { (IDENTIFIER_NODE_CHECK(NODE)->base.protected_flag) /* Based off of TYPE_UNNAMED_P. */ -#define LAMBDA_TYPE_P(NODE) \ - (TREE_CODE (NODE) == RECORD_TYPE \ +#define LAMBDA_TYPE_P(NODE) \ + (TREE_CODE (NODE) == RECORD_TYPE \ && TYPE_LINKAGE_IDENTIFIER (NODE) \ && IDENTIFIER_LAMBDA_P (TYPE_LINKAGE_IDENTIFIER (NODE))) @@ -2674,7 +2671,7 @@ struct GTY(()) lang_decl_base { /* DECL_LANG_SPECIFIC for the above codes. */ struct GTY(()) lang_decl_min { - struct lang_decl_base base; + struct lang_decl_base base; /* 32-bits. */ /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is THUNK_ALIAS. @@ -2737,8 +2734,7 @@ struct GTY(()) lang_decl_fn { union lang_decl_u5 { - /* In a non-thunk FUNCTION_DECL or TEMPLATE_DECL, this is - DECL_CLONED_FUNCTION. */ + /* In a non-thunk FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */ tree GTY ((tag ("0"))) cloned_function; /* In a FUNCTION_DECL for which THUNK_P holds this is the @@ -2757,10 +2753,10 @@ struct GTY(()) lang_decl_fn { /* DECL_LANG_SPECIFIC for namespaces. */ struct GTY(()) lang_decl_ns { - struct lang_decl_base base; + struct lang_decl_base base; /* 32 bits. */ cp_binding_level *level; - /* Inline children. These need to be va_gc, because of PCH. */ + /* Inline children. Needs to be va_gc, because of PCH. */ vec *inlinees; /* Hash table of bound decls. It'd be nice to have this inline, but @@ -2772,7 +2768,7 @@ struct GTY(()) lang_decl_ns { /* DECL_LANG_SPECIFIC for parameters. */ struct GTY(()) lang_decl_parm { - struct lang_decl_base base; + struct lang_decl_base base; /* 32 bits. */ int level; int index; }; @@ -3436,7 +3432,10 @@ struct GTY(()) lang_decl { an instantiation of a template -- but, from the point of view of the language, each instantiation of S results in a wholly unrelated global function f. In this case, DECL_TEMPLATE_INFO for S::f - will be non-NULL, but DECL_USE_TEMPLATE will be zero. */ + will be non-NULL, but DECL_USE_TEMPLATE will be zero. + + In a friend declaration, TI_TEMPLATE can be an overload set, or + identifier. */ #define DECL_TEMPLATE_INFO(NODE) \ (DECL_LANG_SPECIFIC (TEMPLATE_INFO_DECL_CHECK (NODE)) \ ->u.min.template_info) @@ -4669,6 +4668,7 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) template parameters at each level. Each element in the vector is a TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a non-type parameter), or a TYPE_DECL (if the parameter is a type + parameter) or a TEMPLATE_DECL (if the parameter is a template parameter). The TREE_PURPOSE is the default value, if any. The TEMPLATE_PARM_INDEX for the parameter is available as the DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a @@ -5356,8 +5356,9 @@ extern GTY(()) tree integer_two_node; function, two inside the body of a function in a local class, etc.) */ extern int function_depth; -/* Nonzero if we are inside eq_specializations, which affects comparison of - PARM_DECLs in cp_tree_equal. */ +/* Nonzero if we are inside eq_specializations, which affects + comparison of PARM_DECLs in cp_tree_equal and alias specializations + in structrual_comptypes. */ extern int comparing_specializations; /* In parser.c. */ @@ -5812,28 +5813,26 @@ const unsigned int STF_STRIP_DEPENDENT = 1U << 1; extern void init_reswords (void); /* Various flags for the overloaded operator information. */ -enum ovl_op_flags - { - OVL_OP_FLAG_NONE = 0, /* Don't care. */ - OVL_OP_FLAG_UNARY = 1, /* Is unary. */ - OVL_OP_FLAG_BINARY = 2, /* Is binary. */ - OVL_OP_FLAG_AMBIARY = 3, /* May be unary or binary. */ - OVL_OP_FLAG_ALLOC = 4, /* operator new or delete. */ - OVL_OP_FLAG_DELETE = 1, /* operator delete. */ - OVL_OP_FLAG_VEC = 2 /* vector new or delete. */ - }; +enum ovl_op_flags { + OVL_OP_FLAG_NONE = 0, /* Don't care. */ + OVL_OP_FLAG_UNARY = 1, /* Is unary. */ + OVL_OP_FLAG_BINARY = 2, /* Is binary. */ + OVL_OP_FLAG_AMBIARY = 3, /* May be unary or binary. */ + OVL_OP_FLAG_ALLOC = 4, /* operator new or delete. */ + OVL_OP_FLAG_DELETE = 1, /* operator delete. */ + OVL_OP_FLAG_VEC = 2 /* vector new or delete. */ +}; /* Compressed operator codes. Order is determined by operators.def and does not match that of tree_codes. */ -enum ovl_op_code - { - OVL_OP_ERROR_MARK, - OVL_OP_NOP_EXPR, +enum ovl_op_code { + OVL_OP_ERROR_MARK, + OVL_OP_NOP_EXPR, #define DEF_OPERATOR(NAME, CODE, MANGLING, FLAGS) OVL_OP_##CODE, #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING) /* NOTHING */ #include "operators.def" - OVL_OP_MAX - }; + OVL_OP_MAX +}; struct GTY(()) ovl_op_info_t { /* The IDENTIFIER_NODE for the operator. */ @@ -6771,8 +6770,6 @@ extern bool maybe_reject_flexarray_init (tree, tree); /* in lex.c */ extern void cxx_dup_lang_specific_decl (tree); -extern void yyungetc (int, int); - extern tree unqualified_name_lookup_error (tree, location_t = UNKNOWN_LOCATION); extern tree unqualified_fn_lookup_error (cp_expr); @@ -7729,7 +7726,7 @@ extern tree mangle_tls_wrapper_fn (tree); extern bool decl_tls_wrapper_p (tree); extern tree mangle_ref_init_variable (tree); extern tree mangle_template_parm_object (tree); -extern char * get_mangled_vtable_map_var_name (tree); +extern char *get_mangled_vtable_map_var_name (tree); extern bool mangle_return_type_p (tree); extern tree mangle_decomp (tree, vec &); @@ -7983,7 +7980,7 @@ extern tree coro_validate_builtin_call (tree, extern bool morph_fn_to_coro (tree, tree *, tree *); /* Inline bodies. */ - + inline tree ovl_first (tree node) { diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 60a09e9497a..5a262436cd3 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -942,8 +942,11 @@ function_requirements_equivalent_p (tree newfn, tree oldfn) tree reqs2 = get_trailing_function_requirements (oldfn); if ((reqs1 != NULL_TREE) != (reqs2 != NULL_TREE)) return false; + + /* Substitution is needed when friends are involved. */ reqs1 = maybe_substitute_reqs_for (reqs1, newfn); reqs2 = maybe_substitute_reqs_for (reqs2, oldfn); + return cp_tree_equal (reqs1, reqs2); } @@ -2527,7 +2530,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) /* Merge parameter attributes. */ tree oldarg, newarg; - for (oldarg = DECL_ARGUMENTS(olddecl), newarg = DECL_ARGUMENTS(newdecl); + for (oldarg = DECL_ARGUMENTS(olddecl), newarg = DECL_ARGUMENTS(newdecl); oldarg && newarg; oldarg = DECL_CHAIN(oldarg), newarg = DECL_CHAIN(newarg)) { @@ -2737,6 +2740,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) TREE_USED (newdecl) = 1; else if (TREE_USED (newdecl)) TREE_USED (olddecl) = 1; + if (VAR_P (newdecl)) { if (DECL_READ_P (olddecl)) @@ -2744,6 +2748,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) else if (DECL_READ_P (newdecl)) DECL_READ_P (olddecl) = 1; } + if (DECL_PRESERVE_P (olddecl)) DECL_PRESERVE_P (newdecl) = 1; else if (DECL_PRESERVE_P (newdecl)) @@ -4683,9 +4688,9 @@ cp_make_fname_decl (location_t loc, tree id, int type_dep) return decl; } -/* Install DECL as a builtin function at current (global) scope. - Return the new decl (if we found an existing version). Also - installs it into ::std, if it's not '_*'. */ +/* Install DECL as a builtin function at current global scope. Return + the new decl (if we found an existing version). Also installs it + into ::std, if it's not '_*'. */ tree cxx_builtin_function (tree decl) @@ -13423,6 +13428,7 @@ grokdeclarator (const cp_declarator *declarator, in-class defaulted functions, but that breaks grokfndecl. So set it here. */ funcdef_flag = true; + if (template_class_depth (current_class_type) == 0) { decl = check_explicit_specialization diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index ddc2023a75b..5bada506a2d 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2215,6 +2215,7 @@ decl_needed_p (tree decl) emitted; they may be referred to from other object files. */ if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_REALLY_EXTERN (decl)) return true; + /* Functions marked "dllexport" must be emitted so that they are visible to other DLLs. */ if (flag_keep_inline_dllexport @@ -2725,8 +2726,7 @@ determine_visibility (tree decl) determine_visibility_from_class (decl, class_type); if (decl_anon_ns_mem_p (decl)) - /* Names in an anonymous namespace get internal linkage. - This might change once we implement export. */ + /* Names in an anonymous namespace get internal linkage. */ constrain_visibility (decl, VISIBILITY_ANON, false); else if (TREE_CODE (decl) != TYPE_DECL) { @@ -4492,11 +4492,13 @@ no_linkage_error (tree decl) && TREE_NO_WARNING (decl)))) /* In C++11 it's ok if the decl is defined. */ return; + tree t = no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false); if (t == NULL_TREE) /* The type that got us on no_linkage_decls must have gotten a name for linkage purposes. */; else if (CLASS_TYPE_P (t) && TYPE_BEING_DEFINED (t)) + // FIXME: This is now invalid, as a DR to c++98 /* The type might end up having a typedef name for linkage purposes. */ vec_safe_push (no_linkage_decls, decl); else if (TYPE_UNNAMED_P (t)) diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 8fd7052d205..1058fd05a7d 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -563,13 +563,16 @@ ctor_omit_inherited_parms (tree fn) if (!DECL_BASE_CONSTRUCTOR_P (fn) || !CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn))) return false; + if (FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (fn)) == void_list_node) /* No user-declared parameters to omit. */ return false; + tree binfo = inherited_ctor_binfo (fn); for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo)) if (BINFO_VIRTUAL_P (binfo)) return true; + return false; } diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 159c98a67cd..9f30d907a09 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -124,13 +124,11 @@ add_decl_to_level (cp_binding_level *b, tree decl) TREE_CHAIN (decl) = b->names; b->names = decl; - /* If appropriate, add decl to separate list of statics. We - include extern variables because they might turn out to be - static later. It's OK for this list to contain a few false - positives. */ + /* If appropriate, add decl to separate list of statics. We include + extern variables because they might turn out to be static later. + It's OK for this list to contain a few false positives. */ if (b->kind == sk_namespace - && ((VAR_P (decl) - && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) + && ((VAR_P (decl) && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) || (TREE_CODE (decl) == FUNCTION_DECL && (!TREE_PUBLIC (decl) || decl_anon_ns_mem_p (decl) @@ -727,6 +725,7 @@ name_lookup::search_unqualified (tree scope, cp_binding_level *level) break; } + /* Restore to incoming length. */ vec_safe_truncate (queue, length); return found; @@ -1670,7 +1669,7 @@ member_vec_dedup (vec *member_vec) no existing MEMBER_VEC and fewer than 8 fields, do nothing. We know there must be at least 1 field -- the self-reference TYPE_DECL, except for anon aggregates, which will have at least - one field. */ + one field anyway. */ void set_class_bindings (tree klass, unsigned extra) @@ -3692,7 +3691,6 @@ debug (cp_binding_level *ptr) fprintf (stderr, "\n"); } - static void print_other_binding_stack (cp_binding_level *stack) { @@ -3704,7 +3702,7 @@ print_other_binding_stack (cp_binding_level *stack) } } -void +DEBUG_FUNCTION void print_binding_stack (void) { cp_binding_level *b; @@ -5273,7 +5271,6 @@ using_directives_contain_std_p (vec *usings) static bool has_using_namespace_std_directive_p () { - /* Look at local using-directives. */ for (cp_binding_level *level = current_binding_level; level; level = level->level_chain) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 61f22733858..4e1c77a6bd7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5986,7 +5986,6 @@ push_template_decl_real (tree decl, bool is_friend) gcc_checking_assert (DECL_TEMPLATE_RESULT (tmpl) == decl); - if (new_template_p) { /* Push template declarations for global functions and types. diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c index ab18eecd0e6..7d329049549 100644 --- a/gcc/cp/ptree.c +++ b/gcc/cp/ptree.c @@ -41,6 +41,7 @@ cxx_print_decl (FILE *file, tree node, int indent) if (!CODE_CONTAINS_STRUCT (TREE_CODE (node), TS_DECL_COMMON) || !DECL_LANG_SPECIFIC (node)) return; + if (TREE_CODE (node) == FUNCTION_DECL) { int flags = TFF_DECL_SPECIFIERS|TFF_RETURN_TYPE @@ -218,8 +219,8 @@ cxx_print_xnode (FILE *file, tree node, int indent) print_node (file, "optype", BASELINK_OPTYPE (node), indent + 4); break; case OVERLOAD: - print_node (file, "function", OVL_FUNCTION (node), indent+4); - print_node (file, "next", OVL_CHAIN (node), indent+4); + print_node (file, "function", OVL_FUNCTION (node), indent + 4); + print_node (file, "next", OVL_CHAIN (node), indent + 4); break; case TEMPLATE_PARM_INDEX: print_node (file, "decl", TEMPLATE_PARM_DECL (node), indent+4); diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index f20941c413b..d43248cba7c 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -62,7 +62,7 @@ along with GCC; see the file COPYING3. If not see /* Auxiliary data we hold for each type_info derived object we need. */ struct GTY (()) tinfo_s { - tree type; /* The RECORD_TYPE for this type_info object */ + tree type; /* The (const-qualified) RECORD_TYPE for this type_info object */ tree vtable; /* The VAR_DECL of the vtable. Only filled at end of translation. */ @@ -458,6 +458,7 @@ get_tinfo_decl (tree type) DECL_IGNORED_P (d) = 1; TREE_READONLY (d) = 1; TREE_STATIC (d) = 1; + /* Mark the variable as undefined -- but remember that we can define it later if we need to do so. */ DECL_EXTERNAL (d) = 1; diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 1fcba55313a..a830c90a78f 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2296,7 +2296,7 @@ ovl_skip_hidden (tree ovl) return ovl; } -/* NODE is an OVL_HIDDEN_P node which is now revealed. */ +/* NODE is an OVL_HIDDEN_P node that is now revealed. */ tree ovl_iterator::reveal_node (tree overload, tree node) diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 7e84f11579b..589e014f855 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1384,6 +1384,7 @@ structural_comptypes (tree t1, tree t2, int strict) case METHOD_TYPE: case FUNCTION_TYPE: + /* Exception specs and memfn_rquals were checked above. */ if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))) return false; if (!compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)))