annotate gcc/gcc-rich-location.c @ 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 /* Implementation of gcc_rich_location class
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 #include "config.h"
kono
parents:
diff changeset
21 #include "system.h"
kono
parents:
diff changeset
22 #include "coretypes.h"
kono
parents:
diff changeset
23 #include "tm.h"
kono
parents:
diff changeset
24 #include "rtl.h"
kono
parents:
diff changeset
25 #include "hash-set.h"
kono
parents:
diff changeset
26 #include "vec.h"
kono
parents:
diff changeset
27 #include "input.h"
kono
parents:
diff changeset
28 #include "alias.h"
kono
parents:
diff changeset
29 #include "symtab.h"
kono
parents:
diff changeset
30 #include "inchash.h"
kono
parents:
diff changeset
31 #include "tree-core.h"
kono
parents:
diff changeset
32 #include "tree.h"
kono
parents:
diff changeset
33 #include "diagnostic-core.h"
kono
parents:
diff changeset
34 #include "gcc-rich-location.h"
kono
parents:
diff changeset
35 #include "print-tree.h"
kono
parents:
diff changeset
36 #include "pretty-print.h"
kono
parents:
diff changeset
37 #include "intl.h"
kono
parents:
diff changeset
38 #include "cpplib.h"
kono
parents:
diff changeset
39 #include "diagnostic.h"
kono
parents:
diff changeset
40
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
41 /* Add a range to the rich_location, covering expression EXPR,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
42 using LABEL if non-NULL. */
111
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
45 gcc_rich_location::add_expr (tree expr, range_label *label)
111
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 gcc_assert (expr);
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 if (CAN_HAVE_RANGE_P (expr))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
50 add_range (EXPR_LOCATION (expr), SHOW_RANGE_WITHOUT_CARET, label);
111
kono
parents:
diff changeset
51 }
kono
parents:
diff changeset
52
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
53 /* If T is an expression, add a range for it to the rich_location,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
54 using LABEL if non-NULL. */
111
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
57 gcc_rich_location::maybe_add_expr (tree t, range_label *label)
111
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 if (EXPR_P (t))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
60 add_expr (t, label);
111
kono
parents:
diff changeset
61 }
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* Add a fixit hint suggesting replacing the range at MISSPELLED_TOKEN_LOC
kono
parents:
diff changeset
64 with the identifier HINT_ID. */
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 void
kono
parents:
diff changeset
67 gcc_rich_location::add_fixit_misspelled_id (location_t misspelled_token_loc,
kono
parents:
diff changeset
68 tree hint_id)
kono
parents:
diff changeset
69 {
kono
parents:
diff changeset
70 gcc_assert (TREE_CODE (hint_id) == IDENTIFIER_NODE);
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 add_fixit_replace (misspelled_token_loc, IDENTIFIER_POINTER (hint_id));
kono
parents:
diff changeset
73 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
74
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
75 /* Return true if there is nothing on LOC's line before LOC. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
78 blank_line_before_p (location_t loc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 expanded_location exploc = expand_location (loc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 char_span line = location_get_source_line (exploc.file, exploc.line);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 if (!line)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 if (line.length () < (size_t)exploc.column)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 /* Columns are 1-based. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 for (int column = 1; column < exploc.column; ++column)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88 if (!ISSPACE (line[column - 1]))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 return true;
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 /* Subroutine of gcc_rich_location::add_fixit_insert_formatted.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
94 Return true if we should add the content on its own line,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
95 false otherwise.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
96 If true is returned then *OUT_START_OF_LINE is written to. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
97
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
99 use_new_line (location_t insertion_point, location_t indent,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
100 location_t *out_start_of_line)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
101 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
102 if (indent == UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 const line_map *indent_map = linemap_lookup (line_table, indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 if (linemap_macro_expansion_map_p (indent_map))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
108 if (!blank_line_before_p (insertion_point))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
110
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
111 /* Locate the start of the line containing INSERTION_POINT. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
112 const line_map *insertion_point_map
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
113 = linemap_lookup (line_table, insertion_point);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 if (linemap_macro_expansion_map_p (insertion_point_map))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 const line_map_ordinary *ordmap
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 = linemap_check_ordinary (insertion_point_map);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118 expanded_location exploc_insertion_point = expand_location (insertion_point);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 location_t start_of_line
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 = linemap_position_for_line_and_column (line_table, ordmap,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 exploc_insertion_point.line, 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122 *out_start_of_line = start_of_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126 /* Add a fix-it hint suggesting the insertion of CONTENT before
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 INSERTION_POINT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 Attempt to handle formatting: if INSERTION_POINT is the first thing on
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 its line, and INDENT is sufficiently sane, then add CONTENT on its own
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 line, using the indentation of INDENT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 Otherwise, add CONTENT directly before INSERTION_POINT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 For example, adding "CONTENT;" with the closing brace as the insertion
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 point and "INDENT;" as the indentation point:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 if ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
139 INDENT;
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 would lead to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
143
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 if ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 INDENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147 CONTENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 but adding it to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
151
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152 if () {INDENT;}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
153
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
154 would lead to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
155
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156 if () {INDENT;CONTENT;}
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 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
160 gcc_rich_location::add_fixit_insert_formatted (const char *content,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 location_t insertion_point,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162 location_t indent)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
164 location_t start_of_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
165 if (use_new_line (insertion_point, indent, &start_of_line))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
166 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 /* Add CONTENT on its own line, using the indentation of INDENT. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
168
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
169 /* Generate an insertion string, indenting by the amount INDENT
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
170 was indented. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 int indent_column = LOCATION_COLUMN (get_start (indent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172 pretty_printer tmp_pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173 pretty_printer *pp = &tmp_pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 /* Columns are 1-based. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
175 for (int column = 1; column < indent_column; ++column)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
176 pp_space (pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177 pp_string (pp, content);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
178 pp_newline (pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
179
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
180 add_fixit_insert_before (start_of_line, pp_formatted_text (pp));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
181 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
182 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 add_fixit_insert_before (insertion_point, content);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
184 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
185
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
186 /* Implementation of range_label::get_text for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
187 maybe_range_label_for_tree_type_mismatch.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
188
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
189 If both expressions are non-NULL, then generate text describing
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
190 the first expression's type (using the other expression's type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
191 for comparison, analogous to %H and %I in the C++ frontend, but
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
192 on expressions rather than types). */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
193
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
194 label_text
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
195 maybe_range_label_for_tree_type_mismatch::get_text (unsigned range_idx) const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
196 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
197 if (m_expr == NULL_TREE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
198 || !EXPR_P (m_expr))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
199 return label_text::borrow (NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
200 tree expr_type = TREE_TYPE (m_expr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
202 tree other_type = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 if (m_other_expr && EXPR_P (m_other_expr))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 other_type = TREE_TYPE (m_other_expr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
205
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
206 range_label_for_type_mismatch inner (expr_type, other_type);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
207 return inner.get_text (range_idx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
208 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
209
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
210 /* binary_op_rich_location's ctor.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
211
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
212 If use_operator_loc_p (LOC, ARG0, ARG1), then attempt to make a 3-location
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
213 rich_location of the form:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
214
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
215 arg_0 op arg_1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
216 ~~~~~ ^~ ~~~~~
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
217 | |
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
218 | arg1 type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
219 arg0 type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
220
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
221 labelling the types of the arguments if SHOW_TYPES is true.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
222
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
223 Otherwise, make a 1-location rich_location using the compound
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
224 location within LOC:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
225
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
226 arg_0 op arg_1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
227 ~~~~~~^~~~~~~~
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
228
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
229 for which we can't label the types. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
231 binary_op_rich_location::binary_op_rich_location (const op_location_t &loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 tree arg0, tree arg1,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
233 bool show_types)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 : gcc_rich_location (loc.m_combined_loc),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
235 m_label_for_arg0 (arg0, arg1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
236 m_label_for_arg1 (arg1, arg0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
237 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
238 /* Default (above) to using the combined loc.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
239 Potentially override it here: if we have location information for the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
240 operator and for both arguments, then split them all out.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
241 Alternatively, override it if we don't have the combined location. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
242 if (use_operator_loc_p (loc, arg0, arg1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
244 set_range (0, loc.m_operator_loc, SHOW_RANGE_WITH_CARET);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
245 maybe_add_expr (arg0, show_types ? &m_label_for_arg0 : NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
246 maybe_add_expr (arg1, show_types ? &m_label_for_arg1 : NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
248 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
249
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
250 /* Determine if binary_op_rich_location's ctor should attempt to make
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
251 a 3-location rich_location (the location of the operator and of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
252 the 2 arguments), or fall back to a 1-location rich_location showing
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
253 just the combined location of the operation as a whole. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 binary_op_rich_location::use_operator_loc_p (const op_location_t &loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257 tree arg0, tree arg1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
258 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
259 /* If we don't have a combined location, then use the operator location,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
260 and try to add ranges for the operators. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
261 if (loc.m_combined_loc == UNKNOWN_LOCATION)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
262 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
263
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
264 /* If we don't have the operator location, then use the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
265 combined location. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
266 if (loc.m_operator_loc == UNKNOWN_LOCATION)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
267 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
268
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
269 /* We have both operator location and combined location: only use the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
270 operator location if we have locations for both arguments. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
271 return (EXPR_HAS_LOCATION (arg0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
272 && EXPR_HAS_LOCATION (arg1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
273 }