From: Jakub Jelinek Date: Fri, 20 Dec 2019 16:56:30 +0000 (+0100) Subject: backport: re PR c/90677 (gcc-9.1.0 fails to build __gcc_diag__ souce: error: 'cgraph_... X-Git-Tag: releases/gcc-9.3.0~301 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=275bc23e71bc5e8f04d909a75071d0937b2fa5ba;p=thirdparty%2Fgcc.git backport: re PR c/90677 (gcc-9.1.0 fails to build __gcc_diag__ souce: error: 'cgraph_node' is not defined as a type) Backported from mainline 2019-11-22 Jakub Jelinek PR c/90677 * c-common.h (identifier_global_tag): Declare. * c-format.c (get_pointer_to_named_type): Renamed to ... (get_named_type): ... this. Use identifier_global_tag instead of identifier_global_value, handle the return value being a TYPE_P. (init_dynamic_diag_info): Adjust get_pointer_to_named_type callers to call get_named_type instead. Formatting fixes. * c-decl.c (identifier_global_tag): Define. * cp-objcp-common.c (identifier_global_tag): Define. * c-c++-common/pr90677.c: New test. From-SVN: r279650 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index e7f0127dcf26..47b03901a574 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,16 @@ +2019-12-20 Jakub Jelinek + + Backported from mainline + 2019-11-22 Jakub Jelinek + + PR c/90677 + * c-common.h (identifier_global_tag): Declare. + * c-format.c (get_pointer_to_named_type): Renamed to ... + (get_named_type): ... this. Use identifier_global_tag instead of + identifier_global_value, handle the return value being a TYPE_P. + (init_dynamic_diag_info): Adjust get_pointer_to_named_type callers + to call get_named_type instead. Formatting fixes. + 2019-11-13 Eric Botcazou * c-ada-spec.c (get_underlying_decl): Do not look through typedefs. diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index e9ef16aff29e..68376426721b 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -800,6 +800,7 @@ extern void c_register_addr_space (const char *str, addr_space_t as); extern bool in_late_binary_op; extern const char *c_addr_space_name (addr_space_t as); extern tree identifier_global_value (tree); +extern tree identifier_global_tag (tree); extern tree c_linkage_bindings (tree); extern void record_builtin_type (enum rid, const char *, tree); extern tree build_void_list_node (void); diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c index a7f76c1c01d0..f706793a4791 100644 --- a/gcc/c-family/c-format.c +++ b/gcc/c-family/c-format.c @@ -3909,31 +3909,32 @@ init_dynamic_gfc_info (void) } } -/* Lookup the type named NAME and return a pointer-to-NAME type if found. - Otherwise, return void_type_node if NAME has not been used yet, or NULL_TREE if - NAME is not a type (issuing an error). */ +/* Lookup the type named NAME and return a NAME type if found. + Otherwise, return void_type_node if NAME has not been used yet, + or NULL_TREE if NAME is not a type (issuing an error). */ static tree -get_pointer_to_named_type (const char *name) +get_named_type (const char *name) { - tree result; - if ((result = maybe_get_identifier (name))) + if (tree result = maybe_get_identifier (name)) { - result = identifier_global_value (result); + result = identifier_global_tag (result); if (result) { - if (TREE_CODE (result) != TYPE_DECL) + if (TYPE_P (result)) + ; + else if (TREE_CODE (result) == TYPE_DECL) + result = TREE_TYPE (result); + else { error ("%qs is not defined as a type", name); result = NULL_TREE; } - else - result = TREE_TYPE (result); } + return result; } else - result = void_type_node; - return result; + return void_type_node; } /* Determine the types of "tree" and "location_t" in the code being @@ -3963,23 +3964,24 @@ init_dynamic_diag_info (void) an extra type level. */ if ((local_tree_type_node = maybe_get_identifier ("tree"))) { - local_tree_type_node = identifier_global_value (local_tree_type_node); + local_tree_type_node + = identifier_global_value (local_tree_type_node); if (local_tree_type_node) { if (TREE_CODE (local_tree_type_node) != TYPE_DECL) { error ("% is not defined as a type"); - local_tree_type_node = 0; + local_tree_type_node = NULL_TREE; } else if (TREE_CODE (TREE_TYPE (local_tree_type_node)) != POINTER_TYPE) { error ("% is not defined as a pointer type"); - local_tree_type_node = 0; + local_tree_type_node = NULL_TREE; } else - local_tree_type_node = - TREE_TYPE (TREE_TYPE (local_tree_type_node)); + local_tree_type_node + = TREE_TYPE (TREE_TYPE (local_tree_type_node)); } } else @@ -3989,12 +3991,12 @@ init_dynamic_diag_info (void) /* Similar to the above but for gimple*. */ if (!local_gimple_ptr_node || local_gimple_ptr_node == void_type_node) - local_gimple_ptr_node = get_pointer_to_named_type ("gimple"); + local_gimple_ptr_node = get_named_type ("gimple"); /* Similar to the above but for cgraph_node*. */ if (!local_cgraph_node_ptr_node || local_cgraph_node_ptr_node == void_type_node) - local_cgraph_node_ptr_node = get_pointer_to_named_type ("cgraph_node"); + local_cgraph_node_ptr_node = get_named_type ("cgraph_node"); static tree hwi; diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 1295ca2c2a57..67f52ddd5627 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,11 @@ +2019-12-20 Jakub Jelinek + + Backported from mainline + 2019-11-22 Jakub Jelinek + + PR c/90677 + * c-decl.c (identifier_global_tag): Define. + 2019-12-02 Sandra Loosemore Fix bugs relating to flexibly-sized objects in nios2 backend. diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index c423a0c41d25..c632e4afd24f 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -9941,6 +9941,20 @@ identifier_global_value (tree t) return NULL_TREE; } +/* Return the global value of tag T as a symbol. */ + +tree +identifier_global_tag (tree t) +{ + struct c_binding *b; + + for (b = I_TAG_BINDING (t); b; b = b->shadowed) + if (B_IN_FILE_SCOPE (b) || B_IN_EXTERNAL_SCOPE (b)) + return b->decl; + + return NULL_TREE; +} + /* In C, the only C-linkage public declaration is at file scope. */ tree diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f11c453d208a..26d109c6d758 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,11 @@ 2019-12-20 Jakub Jelinek Backported from mainline + 2019-11-22 Jakub Jelinek + + PR c/90677 + * cp-objcp-common.c (identifier_global_tag): Define. + 2019-11-21 Jakub Jelinek Jason Merrill diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index 47651040008d..a1c976e33a1c 100644 --- a/gcc/cp/cp-objcp-common.c +++ b/gcc/cp/cp-objcp-common.c @@ -352,6 +352,15 @@ identifier_global_value (tree name) return get_global_binding (name); } +/* Similarly, but return struct/class/union NAME instead. */ + +tree +identifier_global_tag (tree name) +{ + return lookup_qualified_name (global_namespace, name, /*prefer_type*/2, + /*complain*/false); +} + /* Register c++-specific dumps. */ void diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0c3b578dda03..c1d3e99b58a3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2019-12-20 Jakub Jelinek Backported from mainline + 2019-11-22 Jakub Jelinek + + PR c/90677 + * c-c++-common/pr90677.c: New test. + 2019-11-21 Jakub Jelinek PR c++/90842 diff --git a/gcc/testsuite/c-c++-common/pr90677.c b/gcc/testsuite/c-c++-common/pr90677.c new file mode 100644 index 000000000000..897fbc6e13e4 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr90677.c @@ -0,0 +1,11 @@ +/* PR c/90677 */ +/* { dg-do compile } */ +/* { dg-options "-W -Wall" } */ + +struct cgraph_node; +union tree_node; +typedef union tree_node *tree; +union gimple_statement_d; +typedef union gimple_statement_d *gimple; +struct cgraph_node *cgraph_node (tree); +void foo (int, const char *, ...) __attribute__((__format__(__gcc_diag__, 2, 3)));