annotate gcc/gcc-rich-location.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Declarations relating to class gcc_rich_location
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2014-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
9 version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
14 for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #ifndef GCC_RICH_LOCATION_H
kono
parents:
diff changeset
21 #define GCC_RICH_LOCATION_H
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 /* A gcc_rich_location is libcpp's rich_location with additional
kono
parents:
diff changeset
24 helper methods for working with gcc's types. */
kono
parents:
diff changeset
25 class gcc_rich_location : public rich_location
kono
parents:
diff changeset
26 {
kono
parents:
diff changeset
27 public:
kono
parents:
diff changeset
28 /* Constructors. */
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 /* Constructing from a location. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
31 gcc_rich_location (location_t loc, const range_label *label = NULL)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
32 : rich_location (line_table, loc, label)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
33 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
34 }
111
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 /* Methods for adding ranges via gcc entities. */
kono
parents:
diff changeset
37 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
38 add_expr (tree expr, range_label *label);
111
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
41 maybe_add_expr (tree t, range_label *label);
111
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 void add_fixit_misspelled_id (location_t misspelled_token_loc,
kono
parents:
diff changeset
44 tree hint_id);
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 /* If LOC is within the spans of lines that will already be printed for
kono
parents:
diff changeset
47 this gcc_rich_location, then add it as a secondary location
kono
parents:
diff changeset
48 and return true.
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 Otherwise return false.
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 This allows for a diagnostic to compactly print secondary locations
kono
parents:
diff changeset
53 in one diagnostic when these are near enough the primary locations for
kono
parents:
diff changeset
54 diagnostics-show-locus.c to cope with them, and to fall back to
kono
parents:
diff changeset
55 printing them via a note otherwise e.g.:
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 gcc_rich_location richloc (primary_loc);
kono
parents:
diff changeset
58 bool added secondary = richloc.add_location_if_nearby (secondary_loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
59 error_at (&richloc, "main message");
111
kono
parents:
diff changeset
60 if (!added secondary)
kono
parents:
diff changeset
61 inform (secondary_loc, "message for secondary");
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 Implemented in diagnostic-show-locus.c. */
kono
parents:
diff changeset
64
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65 bool add_location_if_nearby (location_t loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66 bool restrict_to_current_line_spans = true,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67 const range_label *label = NULL);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
68
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
69 /* Add a fix-it hint suggesting the insertion of CONTENT before
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
70 INSERTION_POINT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
71
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
72 Attempt to handle formatting: if INSERTION_POINT is the first thing on
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
73 its line, and INDENT is sufficiently sane, then add CONTENT on its own
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
74 line, using the indentation of INDENT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
75 Otherwise, add CONTENT directly before INSERTION_POINT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77 For example, adding "CONTENT;" with the closing brace as the insertion
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
78 point and using "INDENT;" for indentation:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 if ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 INDENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 would lead to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 if ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 INDENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 CONTENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
91 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
93 but adding it to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
94
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
95 if () {INDENT;}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
96
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
97 would lead to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
99 if () {INDENT;CONTENT;}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
100 */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
101 void add_fixit_insert_formatted (const char *content,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
102 location_t insertion_point,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 location_t indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 /* Concrete subclass of libcpp's range_label.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107 Simple implementation using a string literal. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
108
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 class text_range_label : public range_label
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
110 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
111 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
112 text_range_label (const char *text) : m_text (text) {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
113
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 label_text get_text (unsigned /*range_idx*/) const FINAL OVERRIDE
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
116 return label_text::borrow (m_text);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 private:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 const char *m_text;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 /* Concrete subclass of libcpp's range_label for use in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 diagnostics involving mismatched types.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126 Each frontend that uses this should supply its own implementation.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128 Generate a label describing LABELLED_TYPE. The frontend may use
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 OTHER_TYPE where appropriate for highlighting the differences between
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 the two types (analogous to C++'s use of %H and %I with
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 template types).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 Either or both of LABELLED_TYPE and OTHER_TYPE may be NULL_TREE.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 If LABELLED_TYPE is NULL_TREE, then there is no label.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136 For example, this rich_location could use two instances of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 range_label_for_type_mismatch:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
139 printf ("arg0: %i arg1: %s arg2: %i",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
140 ^~
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
141 |
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
142 const char *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
143 100, 101, 102);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 ~~~
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 |
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 int
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 (a) the label for "%s" with LABELLED_TYPE for "const char*" and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149 (b) the label for "101" with LABELLED TYPE for "int"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 where each one uses the other's type as OTHER_TYPE. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
151
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152 class range_label_for_type_mismatch : public range_label
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
153 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
154 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
155 range_label_for_type_mismatch (tree labelled_type, tree other_type)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156 : m_labelled_type (labelled_type), m_other_type (other_type)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
157 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
158 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
159
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
160 label_text get_text (unsigned range_idx) const OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162 protected:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 tree m_labelled_type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
164 tree m_other_type;
111
kono
parents:
diff changeset
165 };
kono
parents:
diff changeset
166
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
167 /* Subclass of range_label for labelling the type of EXPR when reporting
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
168 a type mismatch between EXPR and OTHER_EXPR.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
169 Either or both of EXPR and OTHER_EXPR could be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
170
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
171 class maybe_range_label_for_tree_type_mismatch : public range_label
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
172 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
173 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
174 maybe_range_label_for_tree_type_mismatch (tree expr, tree other_expr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
175 : m_expr (expr), m_other_expr (other_expr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
176 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
177 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
178
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
179 label_text get_text (unsigned range_idx) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
180
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
182 tree m_expr;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
183 tree m_other_expr;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
184 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
185
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
186 class op_location_t;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
187
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
188 /* A subclass of rich_location for showing problems with binary operations.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
189
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
190 If enough location information is available, the ctor will make a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
191 3-location rich_location of the form:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
192
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
193 arg_0 op arg_1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
194 ~~~~~ ^~ ~~~~~
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
195 | |
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
196 | arg1 type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
197 arg0 type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
198
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
199 labelling the types of the arguments if SHOW_TYPES is true.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
200
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201 Otherwise, it will fall back to a 1-location rich_location using the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
202 compound location within LOC:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 arg_0 op arg_1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
205 ~~~~~~^~~~~~~~
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
206
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
207 for which we can't label the types. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
208
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
209 class binary_op_rich_location : public gcc_rich_location
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
210 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
211 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
212 binary_op_rich_location (const op_location_t &loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
213 tree arg0, tree arg1,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
214 bool show_types);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
215
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
216 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
217 static bool use_operator_loc_p (const op_location_t &loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
218 tree arg0, tree arg1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
219
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
220 maybe_range_label_for_tree_type_mismatch m_label_for_arg0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
221 maybe_range_label_for_tree_type_mismatch m_label_for_arg1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
222 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
223
111
kono
parents:
diff changeset
224 #endif /* GCC_RICH_LOCATION_H */