> On 11 Jul 2024, at 04:35, David Malcolm <dmalc...@redhat.com> wrote:
>
> On Wed, 2024-07-10 at 09:43 +0000, Daniel Bertalan wrote:
>> 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.
>
> Thanks for the patch; the analyzer parts look good to me.
I’ve now pushed this patch on Daniel’s behalf, I did test also on x86_64-linux.
thanks
Iain
>
> Dave
>
>>
>> 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.
>> ---
>> 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 fe943ac61c9e..51304b0795b6 100644
>> --- a/gcc/analyzer/diagnostic-manager.cc
>> +++ b/gcc/analyzer/diagnostic-manager.cc
>> @@ -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 *,
>> diff --git a/gcc/analyzer/infinite-loop.cc b/gcc/analyzer/infinite-
>> loop.cc
>> index 8ba8e70acffc..6ac0a5b373d8 100644
>> --- a/gcc/analyzer/infinite-loop.cc
>> +++ b/gcc/analyzer/infinite-loop.cc
>> @@ -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 ();
>>
>> diff --git a/gcc/analyzer/infinite-recursion.cc
>> b/gcc/analyzer/infinite-recursion.cc
>> index ef8ae90ab08e..885f9a8a9417 100644
>> --- a/gcc/analyzer/infinite-recursion.cc
>> +++ b/gcc/analyzer/infinite-recursion.cc
>> @@ -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
>> diff --git a/gcc/analyzer/varargs.cc b/gcc/analyzer/varargs.cc
>> index c197883673d6..734323e6f789 100644
>> --- a/gcc/analyzer/varargs.cc
>> +++ b/gcc/analyzer/varargs.cc
>> @@ -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
>> diff --git a/gcc/rust/metadata/rust-imports.cc
>> b/gcc/rust/metadata/rust-imports.cc
>> index 17451fbcb9ba..7da245587ae8 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 bfc940ec9915..cfb53ab4eeef 100644
>> --- a/gcc/value-pointer-equiv.cc
>> +++ b/gcc/value-pointer-equiv.cc
>> @@ -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 ()
>