Hi!

My PR90677 fix actually made building older GCCs with newer ones worse.
The problem is that identifier_global_value used earlier returned either the
type decl on success or NULL_TREE on failure and the caller in that case
just defers handling it until later, and that is also what the C
identifier_global_tag implementation does, but C++ uses
lookup_qualified_name which returns error_mark_node if not found, rather
than NULL_TREE and the c-format.c caller is unprepared to handle that and
diagnoses error.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
additionally tested by building GCC 8 with unmodified trunk (failed with
In file included from ./config.h:8,
                 from ../../gcc/gimple-streamer-in.c:22:
../../gcc/../include/ansidecl.h:169:64: error: ‘cgraph_node’ is not defined as 
a type
  169 | #  define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m)))
      |                                                                ^
...
) and finally building GCC 8 with patched trunk, which succeeded.
Ok for trunk/9.3?

2019-12-31  Jakub Jelinek  <ja...@redhat.com>

        PR c/90677
        * cp-objcp-common.c (identifier_global_tag): Return NULL_TREE if name
        has not been found, rather than error_mark_node.

        * c-c++-common/pr90677-2.c: New test.

--- gcc/cp/cp-objcp-common.c.jj 2019-11-22 22:44:02.124600331 +0100
+++ gcc/cp/cp-objcp-common.c    2019-12-30 18:29:01.386576418 +0100
@@ -354,8 +354,11 @@ identifier_global_value (tree name)
 tree
 identifier_global_tag (tree name)
 {
-  return lookup_qualified_name (global_namespace, name, /*prefer_type*/2,
-                               /*complain*/false);
+  tree ret = lookup_qualified_name (global_namespace, name, /*prefer_type*/2,
+                                   /*complain*/false);
+  if (ret == error_mark_node)
+    return NULL_TREE;
+  return ret;
 }
 
 /* Returns true if NAME refers to a built-in function or function-like
--- gcc/testsuite/c-c++-common/pr90677-2.c.jj   2019-12-30 18:30:50.318911231 
+0100
+++ gcc/testsuite/c-c++-common/pr90677-2.c      2019-12-30 18:30:36.303125485 
+0100
@@ -0,0 +1,8 @@
+/* PR c/90677 */
+/* { dg-do compile } */
+/* { dg-options "-W -Wall" } */
+
+extern void foo (int, int, const char *, ...)                                  
                                                                    
+  __attribute__ ((__format__ (__gcc_tdiag__, 3, 4)));                          
                                                                    
+struct cgraph_node;                                                            
                                                                    
+extern void bar (struct cgraph_node *);                                        
                                                                    

        Jakub

Reply via email to