From 187eec8a2f7ae79e0a087988a5323eccdb312775 Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Tue, 9 Jul 2024 23:34:46 +0200 Subject: [PATCH] Fix Xcode 16 build break with NULL != nullptr 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 #define NULL nullptr #include 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::type, typename __unwrap_ref_decay::type>' to 'const pair' 65 | const std::pair 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 (cherry picked from commit 08776bef53835ff6318ecfeade8f6c6896ffd81f) --- gcc/analyzer/diagnostic-manager.cc | 18 +++++++++--------- gcc/analyzer/infinite-loop.cc | 2 +- gcc/analyzer/infinite-recursion.cc | 2 +- gcc/analyzer/varargs.cc | 2 +- gcc/rust/metadata/rust-imports.cc | 2 +- gcc/value-pointer-equiv.cc | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/gcc/analyzer/diagnostic-manager.cc b/gcc/analyzer/diagnostic-manager.cc index 08d92f9780e..8002d0757da 100644 --- a/gcc/analyzer/diagnostic-manager.cc +++ b/gcc/analyzer/diagnostic-manager.cc @@ -678,12 +678,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 @@ -1790,10 +1790,10 @@ public: stmt, stack_depth, sm, - NULL, + nullptr, src_sm_val, dst_sm_val, - NULL, + nullptr, dst_state, src_node)); return false; @@ -1983,9 +1983,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, @@ -2009,9 +2009,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 *, diff --git a/gcc/analyzer/infinite-loop.cc b/gcc/analyzer/infinite-loop.cc index e277a8384a0..9a98d5b156e 100644 --- a/gcc/analyzer/infinite-loop.cc +++ b/gcc/analyzer/infinite-loop.cc @@ -225,7 +225,7 @@ public: enode->get_function ()->decl, enode->get_stack_depth ()), enode, - NULL, NULL, NULL)); + nullptr, nullptr, nullptr)); logger *logger = emission_path->get_logger (); diff --git a/gcc/analyzer/infinite-recursion.cc b/gcc/analyzer/infinite-recursion.cc index 65f136ddad6..2e0c4ef7325 100644 --- a/gcc/analyzer/infinite-recursion.cc +++ b/gcc/analyzer/infinite-recursion.cc @@ -195,7 +195,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 diff --git a/gcc/analyzer/varargs.cc b/gcc/analyzer/varargs.cc index 3348121a0ef..f24e35fb491 100644 --- a/gcc/analyzer/varargs.cc +++ b/gcc/analyzer/varargs.cc @@ -630,7 +630,7 @@ va_list_state_machine::on_va_end (sm_context *sm_ctxt, std::unique_ptr va_list_state_machine::on_leak (tree var) const { - return make_unique (*this, NULL, var); + return make_unique (*this, nullptr, var); } } // anonymous namespace diff --git a/gcc/rust/metadata/rust-imports.cc b/gcc/rust/metadata/rust-imports.cc index 17451fbcb9b..7da245587ae 100644 --- a/gcc/rust/metadata/rust-imports.cc +++ b/gcc/rust/metadata/rust-imports.cc @@ -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 diff --git a/gcc/value-pointer-equiv.cc b/gcc/value-pointer-equiv.cc index bfc940ec991..cfb53ab4eee 100644 --- a/gcc/value-pointer-equiv.cc +++ b/gcc/value-pointer-equiv.cc @@ -62,7 +62,7 @@ public: private: auto_vec> m_stack; auto_vec m_replacements; - const std::pair m_marker = std::make_pair (NULL, NULL); + const std::pair m_marker = std::make_pair (NULL_TREE, NULL_TREE); }; ssa_equiv_stack::ssa_equiv_stack ()