Skip to content
Snippets Groups Projects
  1. Aug 28, 2024
  2. Aug 26, 2024
    • Alexander Monakov's avatar
      libcpp: deduplicate definition of padding size · a8260ebe
      Alexander Monakov authored
      Tie together the two functions that ensure tail padding with
      search_line_ssse3 via CPP_BUFFER_PADDING macro.
      
      libcpp/ChangeLog:
      
      	* internal.h (CPP_BUFFER_PADDING): New macro; use it ...
      	* charset.cc (_cpp_convert_input): ...here, and ...
      	* files.cc (read_file_guts): ...here, and ...
      	* lex.cc (search_line_ssse3): here.
      a8260ebe
  3. Aug 24, 2024
  4. Aug 23, 2024
  5. Aug 22, 2024
  6. Aug 21, 2024
  7. Aug 20, 2024
    • Jakub Jelinek's avatar
      libcpp: Adjust lang_defaults · 447c32c5
      Jakub Jelinek authored
      The table over the years turned to be very wide, 147 columns
      and any addition would add a couple of new ones.
      We need a 28x23 bit matrix right now.
      
      This patch changes the formatting, so that we need just 2 columns
      per new feature and so we have some room for expansion.
      In addition, the patch changes it to bitfields, which reduces
      .rodata by 532 bytes (so 5.75x reduction of the variable) and
      on x86_64-linux grows the cpp_set_lang function by 26 bytes (8.4%
      growth).
      
      2024-08-20  Jakub Jelinek  <jakub@redhat.com>
      
      	* init.cc (struct lang_flags): Change all members from char
      	typed fields to unsigned bit-fields.
      	(lang_defaults): Change formatting of the initializer so that it
      	fits to 68 columns rather than 147.
      447c32c5
    • Alexander Monakov's avatar
      libcpp: replace SSE4.2 helper with an SSSE3 one · 20a5b482
      Alexander Monakov authored
      Since the characters we are searching for (CR, LF, '\', '?') all have
      distinct ASCII codes mod 16, PSHUFB can help match them all at once.
      
      Directly use the new helper if __SSSE3__ is defined. It makes the other
      helpers unused, so mark them inline to prevent warnings.
      
      Rewrite and simplify init_vectorized_lexer.
      
      libcpp/ChangeLog:
      
      	* config.in: Regenerate.
      	* configure: Regenerate.
      	* configure.ac: Check for SSSE3 instead of SSE4.2.
      	* files.cc (read_file_guts): Bump padding to 64 if HAVE_SSSE3.
      	* lex.cc (search_line_acc_char): Mark inline, not "unused".
      	(search_line_sse2): Mark inline.
      	(search_line_sse42): Replace with...
      	(search_line_ssse3): ... this new function.  Adjust the use...
      	(init_vectorized_lexer): ... here.  Simplify.
      20a5b482
  8. Aug 07, 2024
  9. Aug 06, 2024
    • Andi Kleen's avatar
      Remove MMX code path in lexer · eac63be1
      Andi Kleen authored
      Host systems with only MMX and no SSE2 should be really rare now.
      Let's remove the MMX code path to keep the number of custom
      implementations the same.
      
      The SSE2 code path is also somewhat dubious now (nearly everything
      should have SSE4 4.2 which is >15 years old now), but the SSE2
      code path is used as fallback for others and also apparently
      Solaris uses it due to tool chain deficiencies.
      
      libcpp/ChangeLog:
      
      	* lex.cc (search_line_mmx): Remove function.
      	(init_vectorized_lexer): Remove search_line_mmx.
      eac63be1
  10. Jul 26, 2024
  11. Jul 25, 2024
    • Jakub Jelinek's avatar
      c++: Implement C++26 P2558R2 - Add @, $, and ` to the basic character set [PR110343] · 29341f21
      Jakub Jelinek authored
      The following patch implements the easy parts of the paper.
      When @$` are added to the basic character set, it means that
      R"@$`()@$`" should now be valid (here I've noticed most of the
      raw string tests were tested solely with -std=c++11 or -std=gnu++11
      and I've tried to change that), and on the other side even if
      by extension $ is allowed in identifiers, \u0024 or \U00000024
      or \u{24} should not be, similarly how \u0041 is not allowed.
      
      The paper in 3.1 claims though that
       #include <stdio.h>
      
       #define STR(x) #x
      
      int main()
      {
        printf("%s", STR(\u0060)); // U+0060 is ` GRAVE ACCENT
      }
      should have been accepted before this paper (and rejected after it),
      but g++ rejects it.
      
      I've tried to understand it, but am confused on what is the right
      behavior and why.
      
      Consider
       #define STR(x) #x
      const char *a = "\u00b7";
      const char *b = STR(\u00b7);
      const char *c = "\u0041";
      const char *d = STR(\u0041);
      const char *e = STR(a\u00b7);
      const char *f = STR(a\u0041);
      const char *g = STR(a \u00b7);
      const char *h = STR(a \u0041);
      const char *i = "\u066d";
      const char *j = STR(\u066d);
      const char *k = "\u0040";
      const char *l = STR(\u0040);
      const char *m = STR(a\u066d);
      const char *n = STR(a\u0040);
      const char *o = STR(a \u066d);
      const char *p = STR(a \u0040);
      
      Neither clang nor gcc emit any diagnostics on the a, c, i and k
      initializers, those are certainly valid (c is invalid in C23 though).  g++
      emits with -pedantic-errors errors on all the others, while clang++ on the
      ones with STR involving \u0041, \u0040 and a\u0066d.  The chosen values are
      \u0040 '@' as something being changed by this paper, \u0041 'A' as basic
      character set char valid in identifiers before/after, \u00b7 as an example
      of character which is pedantically valid in identifiers if not at the start
      and \u066d s something pedantically not valid in identifiers.
      
      Now, https://eel.is/c++draft/lex.charset#6 says that UCN used outside of a
      string/character literal which corresponds to basic character set character
      (or control character) is ill-formed, that would make d, f, h cases invalid
      for C++ and l, n, p cases invalid for C++26.
      
      https://eel.is/c++draft/lex.name states which characters can appear at the
      start of the identifier and which can appear after the start.  And
      https://eel.is/c++draft/lex.pptoken states that preprocessing-token is
      either identifier, or tons of other things, or "each non-whitespace
      character that cannot be one of the above"
      
      Then https://eel.is/c++draft/lex.pptoken#1 says that this last category is
      invalid if the preprocessing token is being converted into token.
      
      And https://eel.is/c++draft/lex.pptoken#2 includes "If any character not in
      the basic character set matches the last category, the program is
      ill-formed."
      
      Now, e.g.  for the C++23 STR(\u0040) case, \u0040 is there not in the basic
      character set, so valid outside of the literals (not the case anymore in
      C++26), but it isn't nondigit and doesn't have XID_Start property, so it
      isn't IMHO an identifier and so must be the "each non-whitespace character
      that cannot be one of the above" case.  Why doesn't the above mentioned
      https://eel.is/c++draft/lex.pptoken#2 sentence make that invalid?  Ignoring
      that, I'd say it would be then stringized and that feels like it is what
      clang++ is doing.  Now, e.g.  for the STR(a\u066d) case, I wonder why that
      isn't lexed as a identifier followed by \u066d "each non-whitespace
      character that cannot be one of the above" token and stringified similarly,
      clang++ rejects that.
      
      What GCC libcpp seems to be doing is that if that forms_identifier_p calls
      _cpp_valid_utf8 or _cpp_valid_ucn with an argument which tells it is first
      or second+ in identifier, and e.g.  _cpp_valid_ucn then for UCNs valid in
      string literals calls
        else if (identifier_pos)
          {
            int validity = ucn_valid_in_identifier (pfile, result, nst);
      
            if (validity == 0)
              cpp_error (pfile, CPP_DL_ERROR,
                         "universal character %.*s is not valid in an identifier",
                         (int) (str - base), base);
            else if (validity == 2 && identifier_pos == 1)
              cpp_error (pfile, CPP_DL_ERROR,
         "universal character %.*s is not valid at the start of an identifier",
                         (int) (str - base), base);
          }
      so basically all those invalid in identifiers cases emit an error and
      pretend to be valid in identifiers, rather than what e.g.  _cpp_valid_utf8
      does for C but not for C++ and only for the chars completely invalid in
      identifiers rather than just valid in identifiers but not at the start:
                /* In C++, this is an error for invalid character in an identifier
                   because logically, the UTF-8 was converted to a UCN during
                   translation phase 1 (even though we don't physically do it that
                   way).  In C, this byte rather becomes grammatically a separate
                   token.  */
      
                if (CPP_OPTION (pfile, cplusplus))
                  cpp_error (pfile, CPP_DL_ERROR,
                             "extended character %.*s is not valid in an identifier",
                             (int) (*pstr - base), base);
                else
                  {
                    *pstr = base;
                    return false;
                  }
      The comment doesn't really match what is done in recent C++ versions because
      there UCNs are translated to characters and not the other way around.
      
      2024-07-25  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/110343
      libcpp/
      	* lex.cc: C++26 P2558R2 - Add @, $, and ` to the basic character set.
      	(lex_raw_string): For C++26 allow $@` characters in prefix.
      	* charset.cc (_cpp_valid_ucn): For C++26 reject \u0024 in identifiers.
      gcc/testsuite/
      	* c-c++-common/raw-string-1.c: Use { c || c++11 } effective target,
      	remove c++ specific dg-options.
      	* c-c++-common/raw-string-2.c: Likewise.
      	* c-c++-common/raw-string-4.c: Likewise.
      	* c-c++-common/raw-string-5.c: Likewise.  Expect some diagnostics
      	only for non-c++26, for c++26 expect different.
      	* c-c++-common/raw-string-6.c: Use { c || c++11 } effective target,
      	remove c++ specific dg-options.
      	* c-c++-common/raw-string-11.c: Likewise.
      	* c-c++-common/raw-string-13.c: Likewise.
      	* c-c++-common/raw-string-14.c: Likewise.
      	* c-c++-common/raw-string-15.c: Use { c || c++11 } effective target,
      	change c++ specific dg-options to just -Wtrigraphs.
      	* c-c++-common/raw-string-16.c: Likewise.
      	* c-c++-common/raw-string-17.c: Use { c || c++11 } effective target,
      	remove c++ specific dg-options.
      	* c-c++-common/raw-string-18.c: Use { c || c++11 } effective target,
      	remove -std=c++11 from c++ specific dg-options.
      	* c-c++-common/raw-string-19.c: Likewise.
      	* g++.dg/cpp26/raw-string1.C: New test.
      	* g++.dg/cpp26/raw-string2.C: New test.
      29341f21
    • GCC Administrator's avatar
      Daily bump. · 25256af1
      GCC Administrator authored
      25256af1
  12. Jul 24, 2024
    • David Malcolm's avatar
      diagnostics: SARIF output: potentially add escaped renderings of source (§3.3.4) · 148066bd
      David Malcolm authored
      
      This patch adds support to our SARIF output for cases where
      rich_loc.escape_on_output_p () is true, such as for -Wbidi-chars.
      
      In such cases, the pertinent SARIF "location" object gains a property
      bag with property "gcc/escapeNonAscii": true, and the "artifactContent"
      within the location's physical location's snippet" gains a "rendered"
      property (§3.3.4) that escapes non-ASCII text in the snippet, such as:
      
      "rendered": {"text":
      
      where "text" has a string value such as (for a "trojan source" attack):
      
        "9 |     /*<U+202E> } <U+2066>if (isAdmin)<U+2069> <U+2066> begin admins only */\n"
        "  |       ~~~~~~~~                                ~~~~~~~~                    ^\n"
        "  |       |                                       |                           |\n"
        "  |       |                                       |                           end of bidirectional context\n"
        "  |       U+202E (RIGHT-TO-LEFT OVERRIDE)         U+2066 (LEFT-TO-RIGHT ISOLATE)\n"
      
      where the escaping is affected by -fdiagnostics-escape-format=; with
      -fdiagnostics-escape-format=bytes, the rendered text of the above is:
      
        "9 |     /*<e2><80><ae> } <e2><81><a6>if (isAdmin)<e2><81><a9> <e2><81><a6> begin admins only */\n"
        "  |       ~~~~~~~~~~~~                                        ~~~~~~~~~~~~                    ^\n"
        "  |       |                                                   |                               |\n"
        "  |       U+202E (RIGHT-TO-LEFT OVERRIDE)                     U+2066 (LEFT-TO-RIGHT ISOLATE)  end of bidirectional context\n"
      
      The patch also refactors/adds enough selftest machinery to be able to
      test the snippet generation from within the selftest framework, rather
      than just within DejaGnu (where the regex-based testing isn't
      sophisticated enough to verify such properties as the above).
      
      gcc/ChangeLog:
      	* Makefile.in (OBJS-libcommon): Add selftest-json.o.
      	* diagnostic-format-sarif.cc: Include "selftest.h",
      	"selftest-diagnostic.h", "selftest-diagnostic-show-locus.h",
      	"selftest-json.h", and "text-range-label.h".
      	(class content_renderer): New.
      	(sarif_builder::m_rules_arr): Convert to std::unique_ptr.
      	(sarif_builder::make_location_object): Add class
      	escape_nonascii_renderer.  If rich_loc.escape_on_output_p (),
      	pass a nonnull escape_nonascii_renderer to
      	maybe_make_physical_location_object as its snippet_renderer, and
      	add a property bag property "gcc/escapeNonAscii" to the SARIF
      	location object.  For other overloads of make_location_object,
      	pass nullptr for the snippet_renderer.
      	(sarif_builder::maybe_make_region_object_for_context): Add
      	"snippet_renderer" param and pass it to
      	maybe_make_artifact_content_object.
      	(sarif_builder::make_tool_object): Drop "const".
      	(sarif_builder::make_driver_tool_component_object): Likewise.
      	Use typesafe unique_ptr variant of object::set for setting "rules"
      	property on driver_obj.
      	(sarif_builder::maybe_make_artifact_content_object): Add param "r"
      	and use it to potentially set the "rendered" property (§3.3.4).
      	(selftest::test_make_location_object): New.
      	(selftest::diagnostic_format_sarif_cc_tests): New.
      	* diagnostic-show-locus.cc: Include "text-range-label.h" and
      	"selftest-diagnostic-show-locus.h".
      	(selftests::diagnostic_show_locus_fixture::diagnostic_show_locus_fixture):
      	New.
      	(selftests::test_layout_x_offset_display_utf8): Use
      	diagnostic_show_locus_fixture to simplify and consolidate setup
      	code.
      	(selftests::test_diagnostic_show_locus_one_liner): Likewise.
      	(selftests::test_one_liner_colorized_utf8): Likewise.
      	(selftests::test_diagnostic_show_locus_one_liner_utf8): Likewise.
      	* gcc-rich-location.h (class text_range_label): Move to new file
      	text-range-label.h.
      	* selftest-diagnostic-show-locus.h: New file, based on material in
      	diagnostic-show-locus.cc.
      	* selftest-json.cc: New file.
      	* selftest-json.h: New file.
      	* selftest-run-tests.cc (selftest::run_tests): Call
      	selftest::diagnostic_format_sarif_cc_tests.
      	* selftest.h (selftest::diagnostic_format_sarif_cc_tests): New decl.
      
      gcc/testsuite/ChangeLog:
      	* c-c++-common/diagnostic-format-sarif-file-Wbidi-chars.c: Verify
      	that we have a property bag with property "gcc/escapeNonAscii": true.
      	Verify that we have a "rendered" property for a snippet.
      	* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c: Include
      	"text-range-label.h".
      
      gcc/ChangeLog:
      	* text-range-label.h: New file, taking class text_range_label from
      	gcc-rich-location.h.
      
      libcpp/ChangeLog:
      	* include/rich-location.h
      	(semi_embedded_vec::semi_embedded_vec): Add copy ctor.
      	(rich_location::rich_location): Remove "= delete" from decl of
      	copy ctor.  Add deleted decl of move ctor.
      	(rich_location::operator=): Remove "= delete" from decl of
      	copy assignment.  Add deleted decl of move assignment.
      	(fixit_hint::fixit_hint): Add copy ctor decl.  Add deleted decl of
      	move.
      	(fixit_hint::operator=): Add copy assignment decl.  Add deleted
      	decl of move assignment.
      	* line-map.cc (rich_location::rich_location): New copy ctor.
      	(fixit_hint::fixit_hint): New copy ctor.
      
      Signed-off-by: default avatarDavid Malcolm <dmalcolm@redhat.com>
      148066bd
  13. Jul 14, 2024
  14. Jul 13, 2024
    • David Malcolm's avatar
      diagnostics: add highlight-a vs highlight-b in colorization and pp_markup · 7d73c01c
      David Malcolm authored
      
      Since r6-4582-g8a64515099e645 (which added class rich_location), ranges
      of quoted source code have been colorized using the following rules:
      - the primary range used the same color of the kind of the diagnostic
      i.e. "error" vs "warning" etc (defaulting to bold red and bold magenta
      respectively)
      - secondary ranges alternate between "range1" and "range2" (defaulting
      to green and blue respectively)
      
      This works for cases with large numbers of highlighted ranges, but is
      suboptimal for common cases.
      
      The following patch adds a pair of color names: "highlight-a" and
      "highlight-b", and uses them whenever it makes sense to highlight and
      contrast two different things in the source code (e.g. a type mismatch).
      These are used by diagnostic-show-locus.cc for highlighting quoted
      source.  In addition the patch adds colorization to fragments within the
      corresponding diagnostic messages themselves, using consistent
      colorization between the message and the quoted source code for the two
      different things being contrasted.
      
      For example, consider:
      
      demo.c: In function ‘test_bad_format_string_args’:
      ../../src/demo.c:25:18: warning: format ‘%i’ expects argument of
        type ‘int’, but argument 2 has type ‘const char *’ [-Wformat=]
         25 |   printf("hello %i", msg);
            |                 ~^   ~~~
            |                  |   |
            |                  int const char *
            |                 %s
      
      Previously, the types within the message in quotes would be in bold but
      not colorized, and the labelled ranges of quoted source code would use
      bold magenta for the "int" and non-bold green for the "const char *".
      
      With this patch:
      - the "%i" and "int" in the message and the "int" in the quoted source
        are all colored bold green
      - the "const char *" in the message and in the quoted source are both
        colored bold blue
      so that the consistent use of contrasting color draws the reader's eyes
      to the relationships between the diagnostic message and the source.
      
      I've tried this with gnome-terminal with many themes, including a
      variety of light versus dark backgrounds, solarized versus non-solarized
      themes, etc, and it was readable in all.
      
      My initial version of the patch used the existing %r and %R facilities
      within pretty-print.cc for the messages, but this turned out to be very
      uncomfortable, leading to error-prone format strings such as:
      
        error_at (richloc,
                  "invalid operands to binary %s (have %<%r%T%R%> and %<%r%T%R%>)",
                  opname,
                  "highlight-a", type0,
                  "highlight-b", type1);
      
      To avoid requiring monstrosities such as the above, the patch adds a new
      "%e" format code to pretty-print.cc, which expects a pp_element *, where
      pp_element is a new abstract base class (actually a pp_markup::element),
      along with various useful subclasses.  This lets the above be written
      as:
      
        pp_markup::element_quoted_type element_0 (type0, highlight_colors::lhs);
        pp_markup::element_quoted_type element_1 (type1, highlight_colors::rhs);
        error_at (richloc,
                  "invalid operands to binary %s (have %e and %e)",
                  opname, &element_0, &element_1);
      
      which I feel is maintainable and clear to translators; the use of %e and
      pp_element * captures the type-unsafe part of the variadic call, and the
      subclasses allow for type-safety (so e.g. an element_quoted_type expects
      a type and a highlighting color).  This approach allows for some nice
      simplifications within c-format.cc.
      
      The patch also extends -Wformat to "teach" it about the new %e and
      pp_element *.  Doing so requires c-format.cc to be able to determine
      if a T * is a pp_element * (i.e. if T is a subclass).  To do so I added
      a new comp_types callback for comparing types, where the C++ frontend
      supplies a suitable implementation (and %e will always be wrong for C).
      
      I've manually tested this on many diagnostics with both C and C++ and it
      seems a subtle but significant improvement in readability.
      
      I've added a new option -fno-diagnostics-show-highlight-colors in case
      people prefer the old behavior.
      
      gcc/c-family/ChangeLog:
      	* c-common.cc: Include "tree-pretty-print-markup.h".
      	(binary_op_error): Use pp_markup::element_quoted_type and %e.
      	(check_function_arguments): Add "comp_types" param and pass it to
      	check_function_format.
      	* c-common.h (check_function_arguments): Add "comp_types" param.
      	(check_function_format): Likewise.
      	* c-format.cc: Include "tree-pretty-print-markup.h".
      	(local_pp_element_ptr_node): New.
      	(PP_FORMAT_CHAR_TABLE): Add entry for %e.
      	(struct format_check_context): Add "m_comp_types" field.
      	(check_function_format): Add "comp_types" param and pass it to
      	check_format_info.
      	(check_format_info): Likewise, passing it to format_ctx's ctor.
      	(check_format_arg): Extract m_comp_types from format_ctx and
      	pass it to check_format_info_main.
      	(check_format_info_main): Add "comp_types" param and pass it to
      	arg_parser's ctor.
      	(class argument_parser): Add "m_comp_types" field.
      	(argument_parser::check_argument_type): Pass m_comp_types to
      	check_format_types.
      	(handle_subclass_of_pp_element_p): New.
      	(check_format_types): Add "comp_types" param, and use it to
      	call handle_subclass_of_pp_element_p.
      	(class element_format_substring): New.
      	(class element_expected_type_with_indirection): New.
      	(format_type_warning): Use element_expected_type_with_indirection
      	to unify the if (wanted_type_name) branches, reducing from four
      	emit_warning calls to two.  Simplify these further using %e.
      	Doing so also gives suitable colorization of the text within the
      	diagnostics.
      	(init_dynamic_diag_info): Initialize local_pp_element_ptr_node.
      	(selftest::test_type_mismatch_range_labels): Add nullptr for new
      	param of gcc_rich_location label overload.
      	* c-format.h (T_PP_ELEMENT_PTR): New.
      	* c-type-mismatch.cc: Include "diagnostic-highlight-colors.h".
      	(binary_op_rich_location::binary_op_rich_location): Use
      	highlight_colors::lhs and highlight_colors::rhs for the ranges.
      	* c-type-mismatch.h (class binary_op_rich_location): Add comment
      	about highlight_colors.
      
      gcc/c/ChangeLog:
      	* c-objc-common.cc: Include "tree-pretty-print-markup.h".
      	(print_type): Add optional "highlight_color" param and use it
      	to show highlight colors in "aka" text.
      	(pp_markup::element_quoted_type::print_type): New.
      	* c-typeck.cc: Include "tree-pretty-print-markup.h".
      	(comp_parm_types): New.
      	(build_function_call_vec): Pass it to check_function_arguments.
      	(inform_for_arg): Use %e and highlight colors to contrast actual
      	versus expected.
      	(convert_for_assignment): Use highlight_colors::actual for the
      	rhs_label.
      	(build_binary_op): Use highlight_colors::lhs and highlight_colors::rhs
      	for the ranges.
      
      gcc/ChangeLog:
      	* common.opt (fdiagnostics-show-highlight-colors): New option.
      	* common.opt.urls: Regenerate.
      	* coretypes.h (pp_markup::element): New forward decl.
      	(pp_element): New typedef.
      	* diagnostic-color.cc (gcc_color_defaults): Add "highlight-a"
      	and "highlight-b".
      	* diagnostic-format-json.cc (diagnostic_output_format_init_json):
      	Disable highlight colors.
      	* diagnostic-format-sarif.cc (diagnostic_output_format_init_sarif):
      	Likewise.
      	* diagnostic-highlight-colors.h: New file.
      	* diagnostic-path.cc (struct event_range): Pass nullptr for
      	highlight color of m_rich_loc.
      	* diagnostic-show-locus.cc (colorizer::set_range): Handle ranges
      	with m_highlight_color.
      	(colorizer::STATE_NAMED_COLOR): New.
      	(colorizer::m_richloc): New field.
      	(colorizer::colorizer): Add richloc param for initializing
      	m_richloc.
      	(colorizer::set_named_color): New.
      	(colorizer::begin_state): Add case STATE_NAMED_COLOR.
      	(layout::layout): Pass richloc to m_colorizer's ctor.
      	(selftest::test_one_liner_labels): Pass nullptr for new param of
      	gcc_rich_location ctor for labels.
      	(selftest::test_one_liner_labels_utf8): Likewise.
      	* diagnostic.h (diagnostic_context::set_show_highlight_colors):
      	New.
      	* doc/invoke.texi: Add option -fdiagnostics-show-highlight-colors
      	and highlight-a and highlight-b color caps.
      	* doc/ux.texi
      	(Use color consistently when highlighting mismatches): New
      	subsection.
      	* gcc-rich-location.cc (gcc_rich_location::add_expr): Add
      	"highlight_color" param.
      	(gcc_rich_location::maybe_add_expr): Likewise.
      	* gcc-rich-location.h (gcc_rich_location::gcc_rich_location):
      	Split out into a pair of ctors, where if a range_label is supplied
      	the caller must also supply a highlight color.
      	(gcc_rich_location::add_expr): Add "highlight_color" param.
      	(gcc_rich_location::maybe_add_expr): Likewise.
      	* gcc.cc (driver_handle_option): Handle
      	OPT_fdiagnostics_show_highlight_colors.
      	* lto-wrapper.cc (merge_and_complain): Likewise.
      	(append_compiler_options): Likewise.
      	(append_diag_options): Likewise.
      	(run_gcc): Likewise.
      	* opts-common.cc (decode_cmdline_options_to_array): Add comment
      	about -fno-diagnostics-show-highlight-colors.
      	* opts-global.cc (init_options_once): Preserve
      	pp_show_highlight_colors in case the global_dc's printer is
      	recreated.
      	* opts.cc (common_handle_option): Handle
      	OPT_fdiagnostics_show_highlight_colors.
      	(gen_command_line_string): Likewise.
      	* pretty-print-markup.h: New file.
      	* pretty-print.cc: Include "pretty-print-markup.h" and
      	"diagnostic-highlight-colors.h".
      	(pretty_printer::format): Handle %e.
      	(pretty_printer::pretty_printer): Handle new field
      	m_show_highlight_colors.
      	(pp_string_n): New.
      	(pp_markup::context::begin_quote): New.
      	(pp_markup::context::end_quote): New.
      	(pp_markup::context::begin_color): New.
      	(pp_markup::context::end_color): New.
      	(highlight_colors::expected): New.
      	(highlight_colors::actual): New.
      	(highlight_colors::lhs): New.
      	(highlight_colors::rhs): New.
      	(class selftest::test_element): New.
      	(selftest::test_pp_format): Add tests of %e.
      	(selftest::test_urlification): Likewise.
      	* pretty-print.h (pp_markup::context): New forward decl.
      	(class chunk_info): Add friend class pp_markup::context.
      	(class pretty_printer): Add friend pp_show_highlight_colors.
      	(pretty_printer::m_show_highlight_colors): New field.
      	(pp_show_highlight_colors): New inline function.
      	(pp_string_n): New decl.
      	* substring-locations.cc: Include "diagnostic-highlight-colors.h".
      	(format_string_diagnostic_t::highlight_color_format_string): New.
      	(format_string_diagnostic_t::highlight_color_param): New.
      	(format_string_diagnostic_t::emit_warning_n_va): Use highlight
      	colors.
      	* substring-locations.h
      	(format_string_diagnostic_t::highlight_color_format_string): New.
      	(format_string_diagnostic_t::highlight_color_param): New.
      	* toplev.cc (general_init): Initialize global_dc's
      	show_highlight_colors.
      	* tree-pretty-print-markup.h: New file.
      
      gcc/cp/ChangeLog:
      	* call.cc: Include "tree-pretty-print-markup.h".
      	(implicit_conversion_error): Use highlight_colors::percent_h for
      	the labelled range.
      	(op_error_string): Split out into...
      	(concat_op_error_string): ...this.
      	(binop_error_string): New.
      	(op_error): Use %e, binop_error_string, highlight_colors::lhs,
      	and highlight_colors::rhs.
      	(maybe_inform_about_fndecl_for_bogus_argument_init): Add
      	"highlight_color" param; use it for the richloc.
      	(convert_like_internal): Use highlight_colors::percent_h for the
      	labelled_range, and highlight_colors::percent_i for the call to
      	maybe_inform_about_fndecl_for_bogus_argument_init.
      	(build_over_call): Pass cp_comp_parm_types for new "comp_types"
      	param of check_function_arguments.
      	(complain_about_bad_argument): Use highlight_colors::percent_h for
      	the labelled_range, and highlight_colors::percent_i for the call
      	to maybe_inform_about_fndecl_for_bogus_argument_init.
      	* cp-tree.h (maybe_inform_about_fndecl_for_bogus_argument_init):
      	Add optional highlight_color param.
      	(cp_comp_parm_types): New decl.
      	(highlight_colors::const percent_h): New decl.
      	(highlight_colors::const percent_i): New decl.
      	* error.cc: Include "tree-pretty-print-markup.h".
      	(highlight_colors::const percent_h): New defn.
      	(highlight_colors::const percent_i): New defn.
      	(type_to_string): Add param "highlight_color" and use it.
      	(print_nonequal_arg): Likewise.
      	(print_template_differences): Add params "highlight_color_a" and
      	"highlight_color_b".
      	(type_to_string_with_compare): Add params "this_highlight_color"
      	and "peer_highlight_color".
      	(print_template_tree_comparison): Add params "highlight_color_a"
      	and "highlight_color_b".
      	(cxx_format_postprocessor::handle):
      	Use highlight_colors::percent_h and highlight_colors::percent_i.
      	(pp_markup::element_quoted_type::print_type): New.
      	(range_label_for_type_mismatch::get_text): Pass nullptr for new
      	params of type_to_string_with_compare.
      	* typeck.cc (cp_comp_parm_types): New.
      	(cp_build_function_call_vec): Pass it to check_function_arguments.
      	(convert_for_assignment): Use highlight_colors::percent_h for the
      	labelled_range.
      
      gcc/testsuite/ChangeLog:
      	* g++.dg/diagnostic/bad-binary-ops-highlight-colors.C: New test.
      	* g++.dg/diagnostic/bad-binary-ops-no-highlight-colors.C: New test.
      	* g++.dg/plugin/plugin.exp (plugin_test_list): Add
      	show-template-tree-color-no-highlight-colors.C to
      	show_template_tree_color_plugin.c.
      	* g++.dg/plugin/show-template-tree-color-labels.C: Update expected
      	output to reflect use of highlight-a and highlight-b to contrast
      	mismatches.
      	* g++.dg/plugin/show-template-tree-color-no-elide-type.C:
      	Likewise.
      	* g++.dg/plugin/show-template-tree-color-no-highlight-colors.C:
      	New test.
      	* g++.dg/plugin/show-template-tree-color.C: Update expected output
      	to reflect use of highlight-a and highlight-b to contrast
      	mismatches.
      	* g++.dg/warn/Wformat-gcc_diag-1.C: New test.
      	* g++.dg/warn/Wformat-gcc_diag-2.C: New test.
      	* g++.dg/warn/Wformat-gcc_diag-3.C: New test.
      	* gcc.dg/bad-binary-ops-highlight-colors.c: New test.
      	* gcc.dg/format/colors.c: New test.
      	* gcc.dg/plugin/diagnostic_plugin_show_trees.c (show_tree): Pass
      	nullptr for new param of gcc_rich_location::add_expr.
      
      libcpp/ChangeLog:
      	* include/rich-location.h (location_range::m_highlight_color): New
      	field.
      	(rich_location::rich_location): Add optional label_highlight_color
      	param.
      	(rich_location::set_highlight_color): New decl.
      	(rich_location::add_range): Add optional label_highlight_color
      	param.
      	(rich_location::set_range): Likewise.
      	* line-map.cc (rich_location::rich_location): Add
      	"label_highlight_color" param and pass it to add_range.
      	(rich_location::set_highlight_color): New.
      	(rich_location::add_range): Add "label_highlight_color" param.
      	(rich_location::set_range): Add "highlight_color" param.
      
      Signed-off-by: default avatarDavid Malcolm <dmalcolm@redhat.com>
      7d73c01c
  15. Jun 22, 2024
  16. Jun 21, 2024
    • David Malcolm's avatar
      diagnostics: fixes to SARIF output [PR109360] · 9f4fdc3a
      David Malcolm authored
      
      When adding validation of .sarif files against the schema
      (PR testsuite/109360) I discovered various issues where we were
      generating invalid .sarif files.
      
      Specifically, in
        c-c++-common/diagnostic-format-sarif-file-bad-utf8-pr109098-1.c
      the relatedLocations for the "note" diagnostics were missing column
      numbers, leading to validation failure due to non-unique elements,
      such as multiple:
      	"message": {"text": "invalid UTF-8 character <bf>"}},
      on line 25 with no column information.
      
      Root cause is that for some diagnostics in libcpp we have a location_t
      representing the line as a whole, setting a column_override on the
      rich_location (since the line hasn't been fully read yet).  We were
      handling this column override for plain text output, but not for .sarif
      output.
      
      Similarly, in diagnostic-format-sarif-file-pr111700.c there is a warning
      emitted on "line 0" of the file, whereas SARIF requires line numbers to
      be positive.
      
      We also use column == 0 internally to mean "the line as a whole",
      whereas SARIF required column numbers to be positive.
      
      This patch fixes these various issues.
      
      gcc/ChangeLog:
      	PR testsuite/109360
      	* diagnostic-format-sarif.cc
      	(sarif_builder::make_location_object): Pass any column override
      	from rich_loc to maybe_make_physical_location_object.
      	(sarif_builder::maybe_make_physical_location_object): Add
      	"column_override" param and pass it to maybe_make_region_object.
      	(sarif_builder::maybe_make_region_object): Add "column_override"
      	param and use it when the location has 0 for a column.  Don't
      	add "startLine", "startColumn", "endLine", or "endColumn" if
      	the values aren't positive.
      	(sarif_builder::maybe_make_region_object_for_context): Don't
      	add "startLine" or "endLine" if the values aren't positive.
      
      libcpp/ChangeLog:
      	PR testsuite/109360
      	* include/rich-location.h (rich_location::get_column_override):
      	New accessor.
      
      Signed-off-by: default avatarDavid Malcolm <dmalcolm@redhat.com>
      9f4fdc3a
  17. Jun 12, 2024
  18. Jun 11, 2024
    • Joseph Myers's avatar
      c: Add -std=c2y, -std=gnu2y, -Wc23-c2y-compat, C2Y _Generic with type operand · 0cf68222
      Joseph Myers authored
      The first new C2Y feature, _Generic where the controlling operand is a
      type name rather than an expression (as defined in N3260), was voted
      into C2Y today.  (In particular, this form of _Generic allows
      distinguishing qualified and unqualified versions of a type.)  This
      feature also includes allowing the generic associations to specify
      incomplete and function types.
      
      Add this feature to GCC, along with the -std=c2y, -std=gnu2y and
      -Wc23-c2y-compat options to control when and how it is diagnosed.  As
      usual, the feature is allowed by default in older standards modes,
      subject to diagnosis with -pedantic, -pedantic-errors or
      -Wc23-c2y-compat.
      
      Bootstrapped with no regressions on x86_64-pc-linux-gnu.
      
      gcc/
      	* doc/cpp.texi (__STDC_VERSION__): Document C2Y handling.
      	* doc/invoke.texi (-Wc23-c2y-compat, -std=c2y, -std=gnu2y):
      	Document options.
      	(-std=gnu23): Update documentation.
      	* doc/standards.texi (C Language): Document C2Y.  Update C23
      	description.
      	* config/rl78/rl78.cc (rl78_option_override): Handle "GNU C2Y"
      	language name.
      	* dwarf2out.cc (highest_c_language, gen_compile_unit_die):
      	Likewise.
      
      gcc/c-family/
      	* c-common.cc (flag_isoc2y): New.
      	(flag_isoc99, flag_isoc11, flag_isoc23): Update comments.
      	* c-common.h (flag_isoc2y): New.
      	(clk_c, flag_isoc23): Update comments.
      	* c-opts.cc (set_std_c2y): New.
      	(c_common_handle_option): Handle OPT_std_c2y and OPT_std_gnu2y.
      	(set_std_c89, set_std_c99, set_std_c11, set_std_c17, set_std_c23):
      	Set flag_isoc2y.
      	(set_std_c23): Update comment.
      	* c.opt (Wc23-c2y-compat, std=c2y, std=gnu2y): New.
      	* c.opt.urls: Regenerate.
      
      gcc/c/
      	* c-errors.cc (pedwarn_c23): New.
      	* c-parser.cc (disable_extension_diagnostics)
      	(restore_extension_diagnostics): Save and restore
      	warn_c23_c2y_compat.
      	(c_parser_generic_selection): Handle type name as controlling
      	operand.  Allow incomplete and function types subject to
      	pedwarn_c23 calls.
      	* c-tree.h (pedwarn_c23): New.
      
      gcc/testsuite/
      	* gcc.dg/c23-generic-1.c, gcc.dg/c23-generic-2.c,
      	gcc.dg/c23-generic-3.c, gcc.dg/c23-generic-4.c,
      	gcc.dg/c2y-generic-1.c, gcc.dg/c2y-generic-2.c,
      	gcc.dg/c2y-generic-3.c, gcc.dg/gnu2y-generic-1.c: New tests.
      	* gcc.dg/c23-tag-6.c: Use -pedantic-errors.
      
      libcpp/
      	* include/cpplib.h (CLK_GNUC2Y, CLK_STDC2Y): New.
      	* init.cc (lang_defaults): Add GNUC2Y and STDC2Y entries.
      	(cpp_init_builtins): Define __STDC_VERSION__ to 202500L for GNUC2Y
      	and STDC2Y.
      0cf68222
  19. Jun 08, 2024
  20. Jun 07, 2024
    • Jason Merrill's avatar
      c++: -include and header unit translation · a29f481b
      Jason Merrill authored
       Within a source file, #include is translated to import if a suitable header
       unit is available, but this wasn't working with -include.  This turned out
       to be because we suppressed the translation before the beginning of the
       main file.  After removing that, I had to tweak libcpp file handling to
       accommodate the way it moves from an -include to the main file.
      
      gcc/ChangeLog:
      
      	* doc/invoke.texi (C++ Modules): Mention -include.
      
      gcc/cp/ChangeLog:
      
      	* module.cc (maybe_translate_include): Allow before the main file.
      
      libcpp/ChangeLog:
      
      	* files.cc (_cpp_stack_file): LC_ENTER for -include header unit.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/modules/dashinclude-1_b.C: New test.
      	* g++.dg/modules/dashinclude-1_a.H: New test.
      a29f481b
  21. May 30, 2024
  22. May 29, 2024
    • Jason Merrill's avatar
      c++: add module extensions · ff41abdc
      Jason Merrill authored
      There is a trend in the broader C++ community to use a different extension
      for module interface units, even though (in GCC) they are compiled in the
      same way as other source files.  Let's recognize these extensions as C++.
      
      .ixx is the MSVC standard, while the .c*m are supported by Clang.  libc++
      standard headers use .cppm, as their other source files use .cpp.
      Perhaps libstdc++ might use .ccm for parallel consistency?
      
      One issue with .c++m is that libcpp/mkdeps.cc has been using it for the
      phony dependencies to express module dependencies, so I'm changing mkdeps to
      something less likely to be an actual file, ".c++-module".
      
      gcc/cp/ChangeLog:
      
      	* lang-specs.h: Add module interface extensions.
      
      gcc/ChangeLog:
      
      	* doc/invoke.texi: Update module extension docs.
      
      libcpp/ChangeLog:
      
      	* mkdeps.cc (make_write): Change .c++m to .c++-module.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/modules/dep-1_a.C
      	* g++.dg/modules/dep-1_b.C
      	* g++.dg/modules/dep-2.C: Change .c++m to .c++-module.
      ff41abdc
    • GCC Administrator's avatar
      Daily bump. · 2b841697
      GCC Administrator authored
      2b841697
  23. May 28, 2024
  24. May 27, 2024
  25. May 26, 2024
  26. May 19, 2024
  27. May 17, 2024
    • David Malcolm's avatar
      diagnostics, analyzer: add CFG edge visualization to path-printing · 770657d0
      David Malcolm authored
      
      This patch adds some ability for links between labelled ranges when
      quoting the user's source code, and uses this to add links between
      events when printing diagnostic_paths, chopping them up further into
      event ranges that can be printed together.
      It adds links to the various "from..." - "...to" events in the
      analyzer.
      
      For example, previously we emitted this for
      c-c++-common/analyzer/infinite-loop-linked-list.c's
      while_loop_missing_next':
      
      infinite-loop-linked-list.c:30:10: warning: infinite loop [CWE-835] [-Wanalyzer-infinite-loop]
         30 |   while (n)
            |          ^
        'while_loop_missing_next': events 1-5
         30 |   while (n)
            |          ^
            |          |
            |          (1) infinite loop here
            |          (2) when 'n' is non-NULL: always following 'true' branch...
            |          (5) ...to here
         31 |     {
         32 |       sum += n->val;
            |       ~~~~~~~~~~~~~
            |           |   |
            |           |   (3) ...to here
            |           (4) looping back...
      
      whereas with the patch we now emit:
      
      infinite-loop-linked-list.c:30:10: warning: infinite loop [CWE-835] [-Wanalyzer-infinite-loop]
         30 |   while (n)
            |          ^
        'while_loop_missing_next': events 1-3
         30 |   while (n)
            |          ^
            |          |
            |          (1) infinite loop here
            |          (2) when 'n' is non-NULL: always following 'true' branch... ->-+
            |                                                                         |
            |                                                                         |
            |+------------------------------------------------------------------------+
         31 ||    {
         32 ||      sum += n->val;
            ||             ~~~~~~
            ||              |
            |+------------->(3) ...to here
        'while_loop_missing_next': event 4
         32 |       sum += n->val;
            |       ~~~~^~~~~~~~~
            |           |
            |           (4) looping back... ->-+
            |                                  |
        'while_loop_missing_next': event 5
            |                                  |
            |+---------------------------------+
         30 ||  while (n)
            ||         ^
            ||         |
            |+-------->(5) ...to here
      
      which I believe is easier to understand.
      
      The patch also implements the use of unicode characters and colorization
      for the lines (not shown in the above example).
      
      There is a new option -fno-diagnostics-show-event-links for getting
      back the old behavior (added to -fdiagnostics-plain-output).
      
      gcc/analyzer/ChangeLog:
      	* checker-event.h (checker_event::connect_to_next_event_p):
      	Implement new diagnostic_event::connect_to_next_event_p vfunc.
      	(start_cfg_edge_event::connect_to_next_event_p): Likewise.
      	(start_consolidated_cfg_edges_event::connect_to_next_event_p):
      	Likewise.
      	* infinite-loop.cc (class looping_back_event): New subclass.
      	(infinite_loop_diagnostic::add_final_event): Use it.
      
      gcc/ChangeLog:
      	* common.opt (fdiagnostics-show-event-links): New option.
      	* diagnostic-label-effects.h: New file.
      	* diagnostic-path.h (diagnostic_event::connect_to_next_event_p):
      	New pure virtual function.
      	(simple_diagnostic_event::connect_to_next_event_p): Implement it.
      	(simple_diagnostic_event::connect_to_next_event): New.
      	(simple_diagnostic_event::m_connected_to_next_event): New field.
      	(simple_diagnostic_path::connect_to_next_event): New decl.
      	* diagnostic-show-locus.cc: Include "text-art/theme.h" and
      	"diagnostic-label-effects.h".
      	(colorizer::set_cfg_edge): New.
      	(layout::m_fallback_theme): New field.
      	(layout::m_theme): New field.
      	(layout::m_effect_info): New field.
      	(layout::m_link_lhs_state): New enum and field.
      	(layout::m_link_rhs_column): New field.
      	(layout_range::has_in_edge): New.
      	(layout_range::has_out_edge): New.
      	(layout::layout): Add "effect_info" optional param.  Initialize
      	m_theme, m_link_lhs_state, and m_link_rhs_column.
      	(layout::maybe_add_location_range): Remove stray "FIXME" from
      	leading comment.
      	(layout::print_source_line): Replace space after margin with a
      	call to print_leftmost_column.
      	(layout::print_leftmost_column): New.
      	(layout::start_annotation_line): Make non-const.  Gain
      	responsibility for printing the leftmost column after the margin.
      	(layout::print_annotation_line): Drop pp_space, as this is now
      	added by start_annotation_line.
      	(line_label::line_label): Add "has_in_edge" and "has_out_edge"
      	params and initialize...
      	(line_label::m_has_in_edge): New field.
      	(line_label::m_has_out_edge): New field.
      	(layout::print_any_labels): Pass edge information to line_label
      	ctor.  Keep track of in-edges and out-edges, adding visualizations
      	of these links between labels.
      	(layout::print_leading_fixits):  Drop pp_character, as this is now
      	added by start_annotation_line.
      	(layout::print_trailing_fixits): Fix off-by-one errors in column
      	calculation.
      	(layout::move_to_column): Add comment about debugging.
      	(layout::show_ruler): Make non-const.  Drop pp_space calls, as
      	this is now added by start_annotation_line.
      	(layout::print_line): Call print_any_right_to_left_edge_lines.
      	(layout::print_any_right_to_left_edge_lines): New.
      	(layout::update_any_effects): New.
      	(gcc_rich_location::add_location_if_nearby): Initialize
      	loc_range.m_label.
      	(diagnostic_context::maybe_show_locus): Add "effects" param and
      	pass it to diagnostic_context::show_locus.
      	(diagnostic_context::show_locus): Add "effects" param, passing it
      	to layout's ctor.  Call update_any_effects on the layout after
      	printing the lines.
      	(selftest::test_layout_x_offset_display_utf8): Update expected
      	result for eliminated trailing newline.
      	(selftest::test_layout_x_offset_display_utf8): Likewise.
      	(selftest::test_layout_x_offset_display_tab): Likewise.
      	* diagnostic.cc (diagnostic_context::initialize): Initialize
      	m_source_printing.show_event_links_p.
      	(simple_diagnostic_path::connect_to_next_event): New.
      	(simple_diagnostic_event::simple_diagnostic_event): Initialize
      	m_connected_to_next_event.
      	* diagnostic.h (class diagnostic_source_effect_info): New forward
      	decl.
      	(diagnostic_source_printing_options::show_event_links_p): New
      	field.
      	(diagnostic_context::maybe_show_locus): Add optional "effect_info"
      	param.
      	(diagnostic_context::show_locus): Add "effect_info" param.
      	(diagnostic_show_locus): Add optional "effect_info" param.
      	* doc/invoke.texi: Add -fno-diagnostics-show-event-links.
      	* lto-wrapper.cc (merge_and_complain): Add
      	OPT_fdiagnostics_show_event_links to switch.
      	(append_compiler_options): Likewise.
      	(append_diag_options): Likewise.
      	* opts-common.cc (decode_cmdline_options_to_array): Add
      	"-fno-diagnostics-show-event-links" to -fdiagnostics-plain-output.
      	* opts.cc (common_handle_option): Add case for
      	OPT_fdiagnostics_show_event_links.
      	* text-art/theme.cc (ascii_theme::get_cppchar): Handle
      	cell_kind::CFG_*.
      	(unicode_theme::get_cppchar): Likewise.
      	* text-art/theme.h (theme::cell_kind): Add CFG_*.
      	* toplev.cc (general_init): Initialize
      	global_dc->m_source_printing.show_event_links_p.
      	* tree-diagnostic-path.cc: Define INCLUDE_ALGORITHM,
      	INCLUDE_MEMORY, and INCLUDE_STRING.  Include
      	"diagnostic-label-effects.h".
      	(path_label::path_label): Initialize m_effects.
      	(path_label::get_effects): New.
      	(class path_label::path_label_effects): New.
      	(path_label::m_effects): New field.
      	(class per_thread_summary): Add "friend struct event_range;".
      	(per_thread_summary::per_thread_summary): Initialize m_last_event.
      	(per_thread_summary::m_last_event): New field.
      	(struct event_range::per_source_line_info): New.
      	(event_range::event_range): Make "t" non-const.  Add
      	"show_event_links" param and use it to initialize
      	m_show_event_links.  Add info for initial event.
      	(event_range::get_per_source_line_info): New.
      	(event_range::maybe_add_event): Verify compatibility of the new
      	label and existing labels with respect to the link-printing code.
      	Update per-source-line info when an event is added.
      	(event_range::print): Add"effect_info" param and pass to
      	diagnostic_show_locus.
      	(event_range::m_per_thread_summary): Make non-const.
      	(event_range::m_source_line_info_map): New field.
      	(event_range::m_show_event_links): New field.
      	(path_summary::path_summary): Add "show_event_links" optional
      	param, passing it to event_range ctor calls. Update
      	pts.m_last_event.
      	(thread_event_printer::print_swimlane_for_event_range): Add
      	"effect_info" param and pass it to range->print.
      	(print_path_summary_as_text): Keep track of the column for any
      	out-edges at the end of printing each event_range and use as
      	the leading in-edge for the next event_range.
      	(default_tree_diagnostic_path_printer): Pass in show_event_links_p
      	to path_summary ctor.
      	(selftest::path_events_have_column_data_p): New.
      	(class selftest::control_flow_test): New.
      	(selftest::test_control_flow_1): New.
      	(selftest::test_control_flow_2): New.
      	(selftest::test_control_flow_3): New.
      	(selftest::assert_cfg_edge_path_streq): New.
      	(ASSERT_CFG_EDGE_PATH_STREQ): New macro.
      	(selftest::test_control_flow_4): New.
      	(selftest::test_control_flow_5): New.
      	(selftest::test_control_flow_6): New.
      	(selftest::control_flow_tests): New.
      	(selftest::tree_diagnostic_path_cc_tests): Disable colorization on
      	global_dc's printer.  Convert event_pp to a std::unique_ptr. Call
      	control_flow_tests via for_each_line_table_case.
      	(gen_command_line_string): Likewise.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/analyzer/event-links-ascii.c: New test.
      	* gcc.dg/analyzer/event-links-color.c: New test.
      	* gcc.dg/analyzer/event-links-disabled.c: New test.
      	* gcc.dg/analyzer/event-links-unicode.c: New test.
      
      libcpp/ChangeLog:
      	* include/rich-location.h (class label_effects): New forward decl.
      	(range_label::get_effects): New vfunc.
      
      Signed-off-by: default avatarDavid Malcolm <dmalcolm@redhat.com>
      770657d0
  28. May 01, 2024
  29. Apr 30, 2024
    • Jakub Jelinek's avatar
      libcpp: Adjust __STDC_VERSION__ for C23 · a2452a68
      Jakub Jelinek authored
      While the C23 standard isn't officially release yet,
      in 2011 we've changed __STDC_VERSION__ value for C11 already
      in the month in which the new __STDC_VERSION__ value has been
      finalized, so we want to change this now or wait
      until we implement all the C23 features?
      
      Note, seems Clang up to 17 also used 202000L for -std=c2x but
      Clang 18+ uses 202311L as specified in the latest C23 drafts.
      
      2024-04-30  Jakub Jelinek  <jakub@redhat.com>
      
      	* init.cc (cpp_init_builtins): Change __STDC_VERSION__
      	for C23 from 202000L to 202311L.
      
      	* doc/cpp.texi (__STDC_VERSION__): Document 202311L value
      	for -std=c23/-std=gnu23.
      a2452a68
  30. Apr 18, 2024
  31. Apr 17, 2024
  32. Mar 15, 2024
  33. Mar 14, 2024
    • Lewis Hyatt's avatar
      libcpp: Fix macro expansion for argument of __has_include [PR110558] · 942497ad
      Lewis Hyatt authored
      When the file name for a #include directive is the result of stringifying a
      macro argument, libcpp needs to take some care to get the whitespace
      correct; in particular stringify_arg() needs to see a CPP_PADDING token
      between macro tokens so that it can figure out when to output space between
      tokens. The CPP_PADDING tokens are not normally generated when handling a
      preprocessor directive, but for #include-like directives, libcpp sets the
      state variable pfile->state.directive_wants_padding to TRUE so that the
      CPP_PADDING tokens will be output, and then everything works fine for
      computed includes.
      
      As the PR points out, things do not work fine for __has_include. Fix that by
      setting the state variable the same as is done for #include.
      
      libcpp/ChangeLog:
      
      	PR preprocessor/110558
      	* macro.cc (builtin_has_include): Set
      	pfile->state.directive_wants_padding prior to lexing the
      	file name, in case it comes from macro expansion.
      
      gcc/testsuite/ChangeLog:
      
      	PR preprocessor/110558
      	* c-c++-common/cpp/has-include-2.c: New test.
      	* c-c++-common/cpp/has-include-2.h: New test.
      942497ad
    • Lewis Hyatt's avatar
      libcpp: Fix __has_include_next ICE in the last directory of the path [PR80755] · 6c166e55
      Lewis Hyatt authored
      In libcpp/files.cc, the function _cpp_has_header(), which implements
      __has_include and __has_include_next, does not check for a NULL return value
      from search_path_head(), leading to an ICE tripping an assert when
      _cpp_find_file() tries to use it. Fix it by checking for that case and
      silently returning false instead.
      
      As suggested by the PR author, it is easiest to make a testcase by using
      the -idirafter option. To enable that, also modify the dg-additional-options
      testsuite procedure to make the global $srcdir available, since -idirafter
      requires the full path.
      
      libcpp/ChangeLog:
      
      	PR preprocessor/80755
      	* files.cc (search_path_head): Add SUPPRESS_DIAGNOSTIC argument
      	defaulting to false.
      	(_cpp_has_header): Silently return false if the search path has been
      	exhausted, rather than issuing a diagnostic and then hitting an
      	assert.
      
      gcc/testsuite/ChangeLog:
      
      	* lib/gcc-defs.exp (dg-additional-options): Make $srcdir usable in a
      	dg-additional-options directive.
      	* c-c++-common/cpp/has-include-next-2-dir/has-include-next-2.h: New test.
      	* c-c++-common/cpp/has-include-next-2.c: New test.
      6c166e55
  34. Feb 23, 2024
  35. Feb 22, 2024
    • Jakub Jelinek's avatar
      c: Handle scoped attributes in __has*attribute and scoped attribute parsing... · 37127ed9
      Jakub Jelinek authored
      c: Handle scoped attributes in __has*attribute and scoped attribute parsing changes in -std=c11 etc. modes [PR114007]
      
      We aren't able to parse __has_attribute (vendor::attr) (and __has_c_attribute
      and __has_cpp_attribute) in strict C < C23 modes.  While in -std=gnu* modes
      or in -std=c23 there is CPP_SCOPE token, in -std=c* (except for -std=c23)
      there are is just a pair of CPP_COLON tokens.
      The c-lex.cc hunk adds support for that.
      
      That leads to a question if we should return 1 or 0 from
      __has_attribute (gnu::unused) or not, because while
      [[gnu::unused]] is parsed fine in -std=gnu*/-std=c23 modes (sure, with
      pedwarn for < C23), we do not parse it at all in -std=c* (except for
      -std=c23), we only parse [[__extension__ gnu::unused]] there.  While
      the __extension__ in there helps to avoid the pedwarn, I think it is
      better to be consistent between GNU and strict C < C23 modes and
      parse [[gnu::unused]] too; on the other side, I think parsing
      [[__extension__ gnu : : unused]] is too weird and undesirable.
      
      So, the following patch adds a flag during preprocessing at the point
      where we normally create CPP_SCOPE tokens out of 2 consecutive colons
      on the first CPP_COLON to mark the consecutive case (as we are tight
      on the bits, I've reused the PURE_ZERO flag, which is used just by the
      C++ FE and only ever set (both C and C++) on CPP_NUMBER tokens, this
      new flag has the same value and is only ever used on CPP_COLON tokens)
      and instead of checking loose_scope_p argument (i.e. whether it is
      [[__extension__ ...]] or not), it just parses CPP_SCOPE or CPP_COLON
      with CLONE_SCOPE flag followed by another CPP_COLON the same.
      The latter will never appear in >= C23 or -std=gnu* modes, though
      guarding its use say with flag_iso && !flag_isoc23 && doesn't really
      work because the __extension__ case temporarily clears flag_iso flag.
      
      This makes the -std=c11 etc. behavior more similar to -std=gnu11 or
      -std=c23, the only difference I'm aware of are the
       #define JOIN2(A, B) A##B
       [[vendor JOIN2(:,:) attr]]
       [[__extension__ vendor JOIN2(:,:) attr]]
      cases, which are accepted in the latter modes, but results in error
      in -std=c11; but the error is during preprocessing that :: doesn't
      form a valid preprocessing token, which is true, so just don't do that if
      you try to have __STRICT_ANSI__ && __STDC_VERSION__ <= 201710L
      compatibility.
      
      2024-02-22  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c/114007
      gcc/
      	* doc/extend.texi: (__extension__): Remove comments about scope
      	tokens vs. two colons.
      gcc/c-family/
      	* c-lex.cc (c_common_has_attribute): Parse 2 CPP_COLONs with
      	the first one with COLON_SCOPE flag the same as CPP_SCOPE.
      gcc/c/
      	* c-parser.cc (c_parser_std_attribute): Remove loose_scope_p argument.
      	Instead of checking it, parse 2 CPP_COLONs with the first one with
      	COLON_SCOPE flag the same as CPP_SCOPE.
      	(c_parser_std_attribute_list): Remove loose_scope_p argument, don't
      	pass it to c_parser_std_attribute.
      	(c_parser_std_attribute_specifier): Adjust c_parser_std_attribute_list
      	caller.
      gcc/testsuite/
      	* gcc.dg/c23-attr-syntax-6.c: Adjust testcase for :: being valid
      	even in -std=c11 even without __extension__ and : : etc. not being
      	valid anymore even with __extension__.
      	* gcc.dg/c23-attr-syntax-7.c: Likewise.
      	* gcc.dg/c23-attr-syntax-8.c: New test.
      libcpp/
      	* include/cpplib.h (COLON_SCOPE): Define to PURE_ZERO.
      	* lex.cc (_cpp_lex_direct): When lexing CPP_COLON with another
      	colon after it, if !CPP_OPTION (pfile, scope) set COLON_SCOPE
      	flag on the first CPP_COLON token.
      37127ed9
Loading