]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix Xcode 16 build break with NULL != nullptr
authorDaniel Bertalan <dani@danielbertalan.dev>
Tue, 9 Jul 2024 21:34:46 +0000 (23:34 +0200)
committerIain Sandoe <iains@gcc.gnu.org>
Fri, 12 Jul 2024 15:56:06 +0000 (16:56 +0100)
As of Xcode 16 beta 2 with the macOS 15 SDK, each re-inclusion of the
stddef.h header causes the NULL macro in C++ to be re-defined to an
integral constant (__null). This makes the workaround in d59a576b8
("Redefine NULL to nullptr") ineffective, as other headers that are
typically included after system.h (such as obstack.h) do include
stddef.h too.

This can be seen by running the sample below through `clang++ -E`

    #include <stddef.h>
    #define NULL nullptr
    #include <stddef.h>
    NULL

The relevant libc++ change is here:
https://github.com/llvm/llvm-project/commit/2950283dddab03c183c1be2d7de9d4999cc86131

Filed as FB14261859 to Apple and added a comment about it on LLVM PR
86843.

This fixes the cases in --enable-languages=c,c++,objc,obj-c++,rust build
where NULL being an integral constant instead of a null pointer literal
(therefore no longer implicitly converting to a pointer when used as a
template function's argument) caused issues.

    gcc/value-pointer-equiv.cc:65:43: error: no viable conversion from `pair<typename __unwrap_ref_decay<long>::type, typename __unwrap_ref_decay<long>::type>' to 'const pair<tree, tree>'

    65 |   const std::pair <tree, tree> m_marker = std::make_pair (NULL, NULL);
       |                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~

As noted in the previous commit though, the proper solution would be to
phase out the usages of NULL in GCC's C++ source code.

gcc/analyzer/ChangeLog:

* diagnostic-manager.cc (saved_diagnostic::saved_diagnostic):
Change NULL to nullptr.
(struct null_assignment_sm_context): Likewise.
* infinite-loop.cc: Likewise.
* infinite-recursion.cc: Likewise.
* varargs.cc (va_list_state_machine::on_leak): Likewise.

gcc/rust/ChangeLog:

* metadata/rust-imports.cc (Import::try_package_in_directory):
Change NULL to nullptr.

gcc/ChangeLog:

* value-pointer-equiv.cc: Change NULL to nullptr.

Signed-off-by: Daniel Bertalan <dani@danielbertalan.dev>
gcc/analyzer/diagnostic-manager.cc
gcc/analyzer/infinite-loop.cc
gcc/analyzer/infinite-recursion.cc
gcc/analyzer/varargs.cc
gcc/rust/metadata/rust-imports.cc
gcc/value-pointer-equiv.cc

index fe943ac61c9e38f9156d549900668cdec3808dbc..51304b0795b66cd1cf0043b58767386fe56bfa92 100644 (file)
@@ -679,12 +679,12 @@ saved_diagnostic::saved_diagnostic (const state_machine *sm,
   m_stmt (ploc.m_stmt),
   /* stmt_finder could be on-stack; we want our own copy that can
      outlive that.  */
-  m_stmt_finder (ploc.m_finder ? ploc.m_finder->clone () : NULL),
+  m_stmt_finder (ploc.m_finder ? ploc.m_finder->clone () : nullptr),
   m_loc (ploc.m_loc),
   m_var (var), m_sval (sval), m_state (state),
-  m_d (std::move (d)), m_trailing_eedge (NULL),
+  m_d (std::move (d)), m_trailing_eedge (nullptr),
   m_idx (idx),
-  m_best_epath (NULL), m_problem (NULL),
+  m_best_epath (nullptr), m_problem (nullptr),
   m_notes ()
 {
   /* We must have an enode in order to be able to look for paths
@@ -1800,10 +1800,10 @@ public:
                                        stmt,
                                        stack_depth,
                                        sm,
-                                       NULL,
+                                       nullptr,
                                        src_sm_val,
                                        dst_sm_val,
-                                       NULL,
+                                       nullptr,
                                        dst_state,
                                        src_node));
     return false;
@@ -1993,9 +1993,9 @@ struct null_assignment_sm_context : public sm_context
                                        m_sm,
                                        var_new_sval,
                                        from, to,
-                                       NULL,
+                                       nullptr,
                                        *m_new_state,
-                                       NULL));
+                                       nullptr));
   }
 
   void set_next_state (const gimple *stmt,
@@ -2019,9 +2019,9 @@ struct null_assignment_sm_context : public sm_context
                                        m_sm,
                                        sval,
                                        from, to,
-                                       NULL,
+                                       nullptr,
                                        *m_new_state,
-                                       NULL));
+                                       nullptr));
   }
 
   void warn (const supernode *, const gimple *,
index 8ba8e70acffcc16b4b169b3d2d64edd0f0f9d9ca..6ac0a5b373d8943b343c2a5b3aa69077a74a629a 100644 (file)
@@ -240,7 +240,7 @@ public:
                        enode->get_function ()->decl,
                        enode->get_stack_depth ()),
        enode,
-       NULL, NULL, NULL));
+       nullptr, nullptr, nullptr));
 
     logger *logger = emission_path->get_logger ();
 
index ef8ae90ab08edf0b893ad5d1b8de5eeec6df61e6..885f9a8a94173e7e699ac4c80518730096c0b9f1 100644 (file)
@@ -196,7 +196,7 @@ public:
                        m_callee_fndecl,
                        m_new_entry_enode->get_stack_depth ()),
        enode,
-       NULL, NULL, NULL));
+       nullptr, nullptr, nullptr));
   }
 
   /* Reject paths in which conjured svalues have affected control flow
index c197883673d60bc73b1e8d354a95799cf9ce0b50..734323e6f78975c921e88e10aff77d876472c3bd 100644 (file)
@@ -631,7 +631,7 @@ va_list_state_machine::on_va_end (sm_context &sm_ctxt,
 std::unique_ptr<pending_diagnostic>
 va_list_state_machine::on_leak (tree var) const
 {
-  return make_unique<va_list_leak> (*this, NULL, var);
+  return make_unique<va_list_leak> (*this, nullptr, var);
 }
 
 } // anonymous namespace
index 17451fbcb9baf0a3c56ed7a2ab439852e3491087..7da245587ae86397db6d22799e7e2b0022d23abe 100644 (file)
@@ -179,7 +179,7 @@ Import::try_package_in_directory (const std::string &filename,
                   "%s exists but does not contain any Rust export data",
                   found_filename.c_str ());
 
-  return std::make_pair (NULL, macros);
+  return std::make_pair (nullptr, macros);
 }
 
 // Given import "*PFILENAME", where *PFILENAME does not exist, try
index bfc940ec9915a0b36c98002a50d6b5e8f151990d..cfb53ab4eeef9b423413f3170f71838822ee2dbe 100644 (file)
@@ -62,7 +62,7 @@ public:
 private:
   auto_vec<std::pair <tree, tree>> m_stack;
   auto_vec<tree> m_replacements;
-  const std::pair <tree, tree> m_marker = std::make_pair (NULL, NULL);
+  const std::pair <tree, tree> m_marker = std::make_pair (NULL_TREE, NULL_TREE);
 };
 
 ssa_equiv_stack::ssa_equiv_stack ()