Commit bdaf8be1 by Jakub Jelinek Committed by Jakub Jelinek

re PR c/90677 (gcc-9.1.0 fails to build __gcc_diag__ souce: error: 'cgraph_node'…

re PR c/90677 (gcc-9.1.0 fails to build __gcc_diag__ souce: error: 'cgraph_node' is not defined as a type)

	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/
	* c-decl.c (identifier_global_tag): Define.
cp/
	* cp-objcp-common.c (identifier_global_tag): Define.
testsuite/
	* c-c++-common/pr90677.c: New test.

From-SVN: r278634
parent df418f1d
2019-11-22 Jakub Jelinek <jakub@redhat.com> 2019-11-22 Jakub Jelinek <jakub@redhat.com>
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.
Implement P1920R1, Missing feature-test macros 2017-2019. Implement P1920R1, Missing feature-test macros 2017-2019.
* c-cppbuiltin.c (c_cpp_builtins): Bump __cpp_init_captures * c-cppbuiltin.c (c_cpp_builtins): Bump __cpp_init_captures
and __cpp_generic_lambdas for -std=c++2a. Define and __cpp_generic_lambdas for -std=c++2a. Define
......
...@@ -811,6 +811,7 @@ extern void c_register_addr_space (const char *str, addr_space_t as); ...@@ -811,6 +811,7 @@ extern void c_register_addr_space (const char *str, addr_space_t as);
extern bool in_late_binary_op; extern bool in_late_binary_op;
extern const char *c_addr_space_name (addr_space_t as); extern const char *c_addr_space_name (addr_space_t as);
extern tree identifier_global_value (tree); extern tree identifier_global_value (tree);
extern tree identifier_global_tag (tree);
extern bool names_builtin_p (const char *); extern bool names_builtin_p (const char *);
extern tree c_linkage_bindings (tree); extern tree c_linkage_bindings (tree);
extern void record_builtin_type (enum rid, const char *, tree); extern void record_builtin_type (enum rid, const char *, tree);
......
...@@ -4899,31 +4899,32 @@ init_dynamic_gfc_info (void) ...@@ -4899,31 +4899,32 @@ init_dynamic_gfc_info (void)
} }
} }
/* Lookup the type named NAME and return a pointer-to-NAME type if found. /* 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 Otherwise, return void_type_node if NAME has not been used yet,
NAME is not a type (issuing an error). */ or NULL_TREE if NAME is not a type (issuing an error). */
static tree static tree
get_pointer_to_named_type (const char *name) get_named_type (const char *name)
{ {
tree result; if (tree result = maybe_get_identifier (name))
if ((result = maybe_get_identifier (name)))
{ {
result = identifier_global_value (result); result = identifier_global_tag (result);
if (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); error ("%qs is not defined as a type", name);
result = NULL_TREE; result = NULL_TREE;
} }
else
result = TREE_TYPE (result);
} }
return result;
} }
else else
result = void_type_node; return void_type_node;
return result;
} }
/* Determine the types of "tree" and "location_t" in the code being /* Determine the types of "tree" and "location_t" in the code being
...@@ -4953,23 +4954,24 @@ init_dynamic_diag_info (void) ...@@ -4953,23 +4954,24 @@ init_dynamic_diag_info (void)
an extra type level. */ an extra type level. */
if ((local_tree_type_node = maybe_get_identifier ("tree"))) 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 (local_tree_type_node)
{ {
if (TREE_CODE (local_tree_type_node) != TYPE_DECL) if (TREE_CODE (local_tree_type_node) != TYPE_DECL)
{ {
error ("%<tree%> is not defined as a type"); error ("%<tree%> 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)) else if (TREE_CODE (TREE_TYPE (local_tree_type_node))
!= POINTER_TYPE) != POINTER_TYPE)
{ {
error ("%<tree%> is not defined as a pointer type"); error ("%<tree%> is not defined as a pointer type");
local_tree_type_node = 0; local_tree_type_node = NULL_TREE;
} }
else else
local_tree_type_node = local_tree_type_node
TREE_TYPE (TREE_TYPE (local_tree_type_node)); = TREE_TYPE (TREE_TYPE (local_tree_type_node));
} }
} }
else else
...@@ -4979,12 +4981,12 @@ init_dynamic_diag_info (void) ...@@ -4979,12 +4981,12 @@ init_dynamic_diag_info (void)
/* Similar to the above but for gimple*. */ /* Similar to the above but for gimple*. */
if (!local_gimple_ptr_node if (!local_gimple_ptr_node
|| local_gimple_ptr_node == void_type_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*. */ /* Similar to the above but for cgraph_node*. */
if (!local_cgraph_node_ptr_node if (!local_cgraph_node_ptr_node
|| local_cgraph_node_ptr_node == void_type_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; static tree hwi;
......
2019-11-22 Jakub Jelinek <jakub@redhat.com>
PR c/90677
* c-decl.c (identifier_global_tag): Define.
2019-11-20 Richard Biener <rguenther@suse.de> 2019-11-20 Richard Biener <rguenther@suse.de>
PR c/92088 PR c/92088
......
...@@ -10168,6 +10168,20 @@ identifier_global_value (tree t) ...@@ -10168,6 +10168,20 @@ identifier_global_value (tree t)
return NULL_TREE; 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;
}
/* Returns true if NAME refers to a built-in function or function-like /* Returns true if NAME refers to a built-in function or function-like
operator. */ operator. */
......
2019-11-22 Jakub Jelinek <jakub@redhat.com> 2019-11-22 Jakub Jelinek <jakub@redhat.com>
PR c/90677
* cp-objcp-common.c (identifier_global_tag): Define.
PR c++/92458 PR c++/92458
* init.c (nsdmi_inst): Change type to * init.c (nsdmi_inst): Change type to
decl_tree_cache_map * from tree_cache_map *. decl_tree_cache_map * from tree_cache_map *.
......
...@@ -349,6 +349,15 @@ identifier_global_value (tree name) ...@@ -349,6 +349,15 @@ identifier_global_value (tree name)
return get_global_binding (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);
}
/* Returns true if NAME refers to a built-in function or function-like /* Returns true if NAME refers to a built-in function or function-like
operator. */ operator. */
......
2019-11-22 Jakub Jelinek <jakub@redhat.com> 2019-11-22 Jakub Jelinek <jakub@redhat.com>
PR c/90677
* c-c++-common/pr90677.c: New test.
PR c++/92458 PR c++/92458
* g++.dg/pch/pr92458.C: New test. * g++.dg/pch/pr92458.C: New test.
* g++.dg/pch/pr92458.Hs: New test. * g++.dg/pch/pr92458.Hs: New test.
......
/* 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)));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment