123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- /* Declarations relating to class gcc_rich_location
- Copyright (C) 2014-2019 Free Software Foundation, Inc.
- This file is part of GCC.
- GCC is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 3, or (at your option) any later
- version.
- GCC is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>. */
- #ifndef GCC_RICH_LOCATION_H
- #define GCC_RICH_LOCATION_H
- /* A gcc_rich_location is libcpp's rich_location with additional
- helper methods for working with gcc's types. */
- class gcc_rich_location : public rich_location
- {
- public:
- /* Constructors. */
- /* Constructing from a location. */
- gcc_rich_location (location_t loc, const range_label *label = NULL)
- : rich_location (line_table, loc, label)
- {
- }
- /* Methods for adding ranges via gcc entities. */
- void
- add_expr (tree expr, range_label *label);
- void
- maybe_add_expr (tree t, range_label *label);
- void add_fixit_misspelled_id (location_t misspelled_token_loc,
- tree hint_id);
- /* If LOC is within the spans of lines that will already be printed for
- this gcc_rich_location, then add it as a secondary location
- and return true.
- Otherwise return false.
- This allows for a diagnostic to compactly print secondary locations
- in one diagnostic when these are near enough the primary locations for
- diagnostics-show-locus.c to cope with them, and to fall back to
- printing them via a note otherwise e.g.:
- gcc_rich_location richloc (primary_loc);
- bool added secondary = richloc.add_location_if_nearby (secondary_loc);
- error_at (&richloc, "main message");
- if (!added secondary)
- inform (secondary_loc, "message for secondary");
- Implemented in diagnostic-show-locus.c. */
- bool add_location_if_nearby (location_t loc);
- /* Add a fix-it hint suggesting the insertion of CONTENT before
- INSERTION_POINT.
- Attempt to handle formatting: if INSERTION_POINT is the first thing on
- its line, and INDENT is sufficiently sane, then add CONTENT on its own
- line, using the indentation of INDENT.
- Otherwise, add CONTENT directly before INSERTION_POINT.
- For example, adding "CONTENT;" with the closing brace as the insertion
- point and using "INDENT;" for indentation:
- if ()
- {
- INDENT;
- }
- would lead to:
- if ()
- {
- INDENT;
- CONTENT;
- }
- but adding it to:
- if () {INDENT;}
- would lead to:
- if () {INDENT;CONTENT;}
- */
- void add_fixit_insert_formatted (const char *content,
- location_t insertion_point,
- location_t indent);
- };
- /* Concrete subclass of libcpp's range_label.
- Simple implementation using a string literal. */
- class text_range_label : public range_label
- {
- public:
- text_range_label (const char *text) : m_text (text) {}
- label_text get_text (unsigned /*range_idx*/) const FINAL OVERRIDE
- {
- return label_text (const_cast <char *> (m_text), false);
- }
- private:
- const char *m_text;
- };
- /* Concrete subclass of libcpp's range_label for use in
- diagnostics involving mismatched types.
- Each frontend that uses this should supply its own implementation.
- Generate a label describing LABELLED_TYPE. The frontend may use
- OTHER_TYPE where appropriate for highlighting the differences between
- the two types (analogous to C++'s use of %H and %I with
- template types).
- Either or both of LABELLED_TYPE and OTHER_TYPE may be NULL_TREE.
- If LABELLED_TYPE is NULL_TREE, then there is no label.
- For example, this rich_location could use two instances of
- range_label_for_type_mismatch:
- printf ("arg0: %i arg1: %s arg2: %i",
- ^~
- |
- const char *
- 100, 101, 102);
- ~~~
- |
- int
- (a) the label for "%s" with LABELLED_TYPE for "const char*" and
- (b) the label for "101" with LABELLED TYPE for "int"
- where each one uses the other's type as OTHER_TYPE. */
- class range_label_for_type_mismatch : public range_label
- {
- public:
- range_label_for_type_mismatch (tree labelled_type, tree other_type)
- : m_labelled_type (labelled_type), m_other_type (other_type)
- {
- }
- label_text get_text (unsigned range_idx) const OVERRIDE;
- protected:
- tree m_labelled_type;
- tree m_other_type;
- };
- /* Subclass of range_label for labelling the type of EXPR when reporting
- a type mismatch between EXPR and OTHER_EXPR.
- Either or both of EXPR and OTHER_EXPR could be NULL. */
- class maybe_range_label_for_tree_type_mismatch : public range_label
- {
- public:
- maybe_range_label_for_tree_type_mismatch (tree expr, tree other_expr)
- : m_expr (expr), m_other_expr (other_expr)
- {
- }
- label_text get_text (unsigned range_idx) const FINAL OVERRIDE;
- private:
- tree m_expr;
- tree m_other_expr;
- };
- struct op_location_t;
- /* A subclass of rich_location for showing problems with binary operations.
- If enough location information is available, the ctor will make a
- 3-location rich_location of the form:
- arg_0 op arg_1
- ~~~~~ ^~ ~~~~~
- | |
- | arg1 type
- arg0 type
- labelling the types of the arguments if SHOW_TYPES is true.
- Otherwise, it will fall back to a 1-location rich_location using the
- compound location within LOC:
- arg_0 op arg_1
- ~~~~~~^~~~~~~~
- for which we can't label the types. */
- class binary_op_rich_location : public gcc_rich_location
- {
- public:
- binary_op_rich_location (const op_location_t &loc,
- tree arg0, tree arg1,
- bool show_types);
- private:
- static bool use_operator_loc_p (const op_location_t &loc,
- tree arg0, tree arg1);
- maybe_range_label_for_tree_type_mismatch m_label_for_arg0;
- maybe_range_label_for_tree_type_mismatch m_label_for_arg1;
- };
- #endif /* GCC_RICH_LOCATION_H */
|