https://gcc.gnu.org/g:c94b688a83fc84015c6fab8ab0ff142051598fc8

commit r17-5772-gc94b688a83fc84015c6fab8ab0ff142051598fc8
Author: Stefan Schulze Frielinghaus <[email protected]>
Date:   Sat Oct 31 10:26:54 2026 +0100

    tree-pretty-print: Handle NULLPTR_TYPE in dump_generic_node
    
    Since there is no front end available at link time, lto1 prints types by
    means of the generic tree pretty printer.  So far NULLPTR_TYPE was not
    handled which means we fell back to do_niy().  For example, printing
    
      note: type '<<< Unknown tree: nullptr_type >>>' should match type 'int'
    
    instead of mentioning nullptr_t.  Fixed by handling NULLPTR_TYPE
    similarly as other _TYPE cases.
    
    There is still some inconsistency left because the C++ FE prints the
    type sometimes with a suffix like `'T' {aka 'std::nullptr_t'}` when `T`
    is a typedef.  Therefore, messages between an LTO and non-LTO build may
    still differ a bit.
    
    gcc/ChangeLog:
    
            * tree-pretty-print.cc (dump_generic_node): Handle NULLPTR_TYPE.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/lto/nullptr-1_0.c: New test.
            * gcc.dg/lto/nullptr-1_1.c: New test.
            * g++.dg/lto/nullptr-1_0.C: New test.
            * g++.dg/lto/nullptr-1_1.C: New test.
            * g++.dg/lto/nullptr-2_0.C: New test.
            * g++.dg/lto/nullptr-2_1.C: New test.

Diff:
---
 gcc/testsuite/g++.dg/lto/nullptr-1_0.C | 14 ++++++++++++++
 gcc/testsuite/g++.dg/lto/nullptr-1_1.C |  7 +++++++
 gcc/testsuite/g++.dg/lto/nullptr-2_0.C | 16 ++++++++++++++++
 gcc/testsuite/g++.dg/lto/nullptr-2_1.C |  7 +++++++
 gcc/testsuite/gcc.dg/lto/nullptr-1_0.c | 16 ++++++++++++++++
 gcc/testsuite/gcc.dg/lto/nullptr-1_1.c |  7 +++++++
 gcc/tree-pretty-print.cc               |  3 +++
 7 files changed, 70 insertions(+)

diff --git a/gcc/testsuite/g++.dg/lto/nullptr-1_0.C 
b/gcc/testsuite/g++.dg/lto/nullptr-1_0.C
new file mode 100644
index 000000000000..b59417861e04
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/nullptr-1_0.C
@@ -0,0 +1,14 @@
+// { dg-lto-do link }
+// { dg-require-effective-target c++11 }
+
+// Check that the type decltype(nullptr) is pretty printed when LTO is involved
+
+decltype (nullptr) x; // { dg-lto-message "type 'decltype\\(nullptr\\)' should 
match type 'int'" }
+
+int get (void);
+
+int
+main ()
+{
+  return get ();
+}
diff --git a/gcc/testsuite/g++.dg/lto/nullptr-1_1.C 
b/gcc/testsuite/g++.dg/lto/nullptr-1_1.C
new file mode 100644
index 000000000000..c97765db58ac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/nullptr-1_1.C
@@ -0,0 +1,7 @@
+extern int x; // { dg-lto-warning "type of 'x' does not match original 
declaration" }
+
+int
+get (void)
+{
+  return x;
+}
diff --git a/gcc/testsuite/g++.dg/lto/nullptr-2_0.C 
b/gcc/testsuite/g++.dg/lto/nullptr-2_0.C
new file mode 100644
index 000000000000..7420ba243414
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/nullptr-2_0.C
@@ -0,0 +1,16 @@
+// { dg-lto-do link }
+// { dg-require-effective-target c++11 }
+
+// Check that the type std::nullptr_t is pretty printed when LTO is involved
+
+#include <cstddef>
+
+std::nullptr_t x; // { dg-lto-message "type 'nullptr_t' should match type 
'int'" }
+
+int get (void);
+
+int
+main ()
+{
+  return get ();
+}
diff --git a/gcc/testsuite/g++.dg/lto/nullptr-2_1.C 
b/gcc/testsuite/g++.dg/lto/nullptr-2_1.C
new file mode 100644
index 000000000000..c97765db58ac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/nullptr-2_1.C
@@ -0,0 +1,7 @@
+extern int x; // { dg-lto-warning "type of 'x' does not match original 
declaration" }
+
+int
+get (void)
+{
+  return x;
+}
diff --git a/gcc/testsuite/gcc.dg/lto/nullptr-1_0.c 
b/gcc/testsuite/gcc.dg/lto/nullptr-1_0.c
new file mode 100644
index 000000000000..f8b626ea9941
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/nullptr-1_0.c
@@ -0,0 +1,16 @@
+/* { dg-lto-do link } */
+/* { dg-lto-additional-options "-std=c23" } */
+
+/* Check that the type nullptr_t is pretty printed when LTO is involved.  */
+
+#include <stddef.h>
+
+nullptr_t x; /* { dg-lto-message "type 'nullptr_t' should match type 'int'" } 
*/
+
+extern int get (void);
+
+int
+main (void)
+{
+  return get ();
+}
diff --git a/gcc/testsuite/gcc.dg/lto/nullptr-1_1.c 
b/gcc/testsuite/gcc.dg/lto/nullptr-1_1.c
new file mode 100644
index 000000000000..f8fa508f717a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/nullptr-1_1.c
@@ -0,0 +1,7 @@
+extern int x; /* { dg-lto-warning "type of 'x' does not match original 
declaration" } */
+
+int
+get (void)
+{
+  return x;
+}
diff --git a/gcc/tree-pretty-print.cc b/gcc/tree-pretty-print.cc
index 34fc70807832..9655870cfc88 100644
--- a/gcc/tree-pretty-print.cc
+++ b/gcc/tree-pretty-print.cc
@@ -2347,6 +2347,7 @@ dump_generic_node (pretty_printer *pp, tree node, int 
spc, dump_flags_t flags,
     case BOOLEAN_TYPE:
     case BITINT_TYPE:
     case OPAQUE_TYPE:
+    case NULLPTR_TYPE:
       {
        unsigned int quals = TYPE_QUALS (node);
        enum tree_code_class tclass;
@@ -2483,6 +2484,8 @@ dump_generic_node (pretty_printer *pp, tree node, int 
spc, dump_flags_t flags,
              }
            else if (TREE_CODE (node) == VOID_TYPE)
              pp_string (pp, "void");
+           else if (TREE_CODE (node) == NULLPTR_TYPE)
+             pp_string (pp, "nullptr_t");
            else
               pp_string (pp, "<unnamed type>");
          }

Reply via email to