https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36887

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Lewis Hyatt <lhy...@gcc.gnu.org>:

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

commit r14-4874-gcb05acdcea298b62e7fb00dcc153f5d506d085fe
Author: Lewis Hyatt <lhy...@gmail.com>
Date:   Thu Sep 7 17:02:47 2023 -0400

    libcpp: Improve the diagnostic for poisoned identifiers [PR36887]

    The PR requests an enhancement to the diagnostic issued for the use of a
    poisoned identifier. Currently, we show the location of the usage, but not
    the location which requested the poisoning, which would be helpful for the
    user if the decision to poison an identifier was made externally, such as
    in a library header.

    In order to output this information, we need to remember a location_t for
    each identifier that has been poisoned, and that data needs to be preserved
    as well in a PCH. One option would be to add a field to struct
cpp_hashnode,
    but there is no convenient place to add it without increasing the size of
    the struct for all identifiers. Given this facility will be needed rarely,
    it seemed better to add a second hash map, which is handled PCH-wise the
    same as the current one in gcc/stringpool.cc. This hash map associates a
new
    struct cpp_hashnode_extra with each identifier that needs one. Currently
    that struct only contains the new location_t, but it could be extended in
    the future if there is other ancillary data that may be convenient to put
    there for other purposes.

    libcpp/ChangeLog:

            PR preprocessor/36887
            * directives.cc (do_pragma_poison): Store in the extra hash map the
            location from which an identifier has been poisoned.
            * lex.cc (identifier_diagnostics_on_lex): When issuing a diagnostic
            for the use of a poisoned identifier, also add a note indicating
the
            location from which it was poisoned.
            * identifiers.cc (alloc_node): Convert to template function.
            (_cpp_init_hashtable): Handle the new extra hash map.
            (_cpp_destroy_hashtable): Likewise.
            * include/cpplib.h (struct cpp_hashnode_extra): New struct.
            (cpp_create_reader): Update prototype to...
            * init.cc (cpp_create_reader): ...accept an argument for the extra
            hash table and pass it to _cpp_init_hashtable.
            * include/symtab.h (ht_lookup): New overload for convenience.
            * internal.h (struct cpp_reader): Add EXTRA_HASH_TABLE member.
            (_cpp_init_hashtable): Adjust prototype.

    gcc/c-family/ChangeLog:

            PR preprocessor/36887
            * c-opts.cc (c_common_init_options): Pass new extra hash map
            argument to cpp_create_reader().

    gcc/ChangeLog:

            PR preprocessor/36887
            * toplev.h (ident_hash_extra): Declare...
            * stringpool.cc (ident_hash_extra): ...this new global variable.
            (init_stringpool): Handle ident_hash_extra as well as ident_hash.
            (ggc_mark_stringpool): Likewise.
            (ggc_purge_stringpool): Likewise.
            (struct string_pool_data_extra): New struct.
            (spd2): New GC root variable.
            (gt_pch_save_stringpool): Use spd2 to handle ident_hash_extra,
            analogous to how spd is used to handle ident_hash.
            (gt_pch_restore_stringpool): Likewise.

    gcc/testsuite/ChangeLog:

            PR preprocessor/36887
            * c-c++-common/cpp/diagnostic-poison.c: New test.
            * g++.dg/pch/pr36887.C: New test.
            * g++.dg/pch/pr36887.Hs: New test.
  • [Bug preprocessor/36887] Please... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to