111
|
1 /* Processing rules for constraints.
|
|
2 Copyright (C) 2013-2017 Free Software Foundation, Inc.
|
|
3 Contributed by Andrew Sutton (andrew.n.sutton@gmail.com)
|
|
4
|
|
5 This file is part of GCC.
|
|
6
|
|
7 GCC is free software; you can redistribute it and/or modify
|
|
8 it under the terms of the GNU General Public License as published by
|
|
9 the Free Software Foundation; either version 3, or (at your option)
|
|
10 any later version.
|
|
11
|
|
12 GCC is distributed in the hope that it will be useful,
|
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15 GNU General Public License for more details.
|
|
16
|
|
17 You should have received a copy of the GNU General Public License
|
|
18 along with GCC; see the file COPYING3. If not see
|
|
19 <http://www.gnu.org/licenses/>. */
|
|
20
|
|
21 #include "config.h"
|
|
22 #include "system.h"
|
|
23 #include "coretypes.h"
|
|
24 #include "tm.h"
|
|
25 #include "timevar.h"
|
|
26 #include "hash-set.h"
|
|
27 #include "machmode.h"
|
|
28 #include "vec.h"
|
|
29 #include "double-int.h"
|
|
30 #include "input.h"
|
|
31 #include "alias.h"
|
|
32 #include "symtab.h"
|
|
33 #include "wide-int.h"
|
|
34 #include "inchash.h"
|
|
35 #include "tree.h"
|
|
36 #include "stringpool.h"
|
|
37 #include "attribs.h"
|
|
38 #include "intl.h"
|
|
39 #include "flags.h"
|
|
40 #include "cp-tree.h"
|
|
41 #include "c-family/c-common.h"
|
|
42 #include "c-family/c-objc.h"
|
|
43 #include "cp-objcp-common.h"
|
|
44 #include "tree-inline.h"
|
|
45 #include "decl.h"
|
|
46 #include "toplev.h"
|
|
47 #include "type-utils.h"
|
|
48
|
|
49 /*---------------------------------------------------------------------------
|
|
50 Operations on constraints
|
|
51 ---------------------------------------------------------------------------*/
|
|
52
|
|
53 /* Returns true if C is a constraint tree code. Note that ERROR_MARK
|
|
54 is a valid constraint. */
|
|
55
|
|
56 static inline bool
|
|
57 constraint_p (tree_code c)
|
|
58 {
|
|
59 return ((PRED_CONSTR <= c && c <= DISJ_CONSTR)
|
|
60 || c == EXPR_PACK_EXPANSION
|
|
61 || c == ERROR_MARK);
|
|
62 }
|
|
63
|
|
64 /* Returns true if T is a constraint. Note that error_mark_node
|
|
65 is a valid constraint. */
|
|
66
|
|
67 bool
|
|
68 constraint_p (tree t)
|
|
69 {
|
|
70 return constraint_p (TREE_CODE (t));
|
|
71 }
|
|
72
|
|
73 /* Returns the conjunction of two constraints A and B. Note that
|
|
74 conjoining a non-null constraint with NULL_TREE is an identity
|
|
75 operation. That is, for non-null A,
|
|
76
|
|
77 conjoin_constraints(a, NULL_TREE) == a
|
|
78
|
|
79 and
|
|
80
|
|
81 conjoin_constraints (NULL_TREE, a) == a
|
|
82
|
|
83 If both A and B are NULL_TREE, the result is also NULL_TREE. */
|
|
84
|
|
85 tree
|
|
86 conjoin_constraints (tree a, tree b)
|
|
87 {
|
|
88 gcc_assert (a ? constraint_p (a) : true);
|
|
89 gcc_assert (b ? constraint_p (b) : true);
|
|
90 if (a)
|
|
91 return b ? build_nt (CONJ_CONSTR, a, b) : a;
|
|
92 else if (b)
|
|
93 return b;
|
|
94 else
|
|
95 return NULL_TREE;
|
|
96 }
|
|
97
|
|
98 /* Transform the vector of expressions in the T into a conjunction
|
|
99 of requirements. T must be a TREE_VEC. */
|
|
100
|
|
101 tree
|
|
102 conjoin_constraints (tree t)
|
|
103 {
|
|
104 gcc_assert (TREE_CODE (t) == TREE_VEC);
|
|
105 tree r = NULL_TREE;
|
|
106 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
|
|
107 r = conjoin_constraints (r, TREE_VEC_ELT (t, i));
|
|
108 return r;
|
|
109 }
|
|
110
|
|
111 /* Returns true if T is a call expression to a function
|
|
112 concept. */
|
|
113
|
|
114 bool
|
|
115 function_concept_check_p (tree t)
|
|
116 {
|
|
117 gcc_assert (TREE_CODE (t) == CALL_EXPR);
|
|
118 tree fn = CALL_EXPR_FN (t);
|
|
119 if (fn != NULL_TREE
|
|
120 && TREE_CODE (fn) == TEMPLATE_ID_EXPR)
|
|
121 {
|
|
122 tree f1 = OVL_FIRST (TREE_OPERAND (fn, 0));
|
|
123 if (TREE_CODE (f1) == TEMPLATE_DECL
|
|
124 && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (f1)))
|
|
125 return true;
|
|
126 }
|
|
127 return false;
|
|
128 }
|
|
129
|
|
130 /* Returns true if any of the arguments in the template
|
|
131 argument list is a wildcard or wildcard pack. */
|
|
132
|
|
133 bool
|
|
134 contains_wildcard_p (tree args)
|
|
135 {
|
|
136 for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
|
|
137 {
|
|
138 tree arg = TREE_VEC_ELT (args, i);
|
|
139 if (TREE_CODE (arg) == WILDCARD_DECL)
|
|
140 return true;
|
|
141 }
|
|
142 return false;
|
|
143 }
|
|
144
|
|
145 /* Build a new call expression, but don't actually generate a
|
|
146 new function call. We just want the tree, not the semantics. */
|
|
147
|
|
148 inline tree
|
|
149 build_call_check (tree id)
|
|
150 {
|
|
151 ++processing_template_decl;
|
|
152 vec<tree, va_gc> *fargs = make_tree_vector();
|
|
153 tree call = finish_call_expr (id, &fargs, false, false, tf_none);
|
|
154 release_tree_vector (fargs);
|
|
155 --processing_template_decl;
|
|
156 return call;
|
|
157 }
|
|
158
|
|
159 /* Build an expression that will check a variable concept. If any
|
|
160 argument contains a wildcard, don't try to finish the variable
|
|
161 template because we can't substitute into a non-existent
|
|
162 declaration. */
|
|
163
|
|
164 tree
|
|
165 build_variable_check (tree id)
|
|
166 {
|
|
167 gcc_assert (TREE_CODE (id) == TEMPLATE_ID_EXPR);
|
|
168 if (contains_wildcard_p (TREE_OPERAND (id, 1)))
|
|
169 return id;
|
|
170
|
|
171 ++processing_template_decl;
|
|
172 tree var = finish_template_variable (id);
|
|
173 --processing_template_decl;
|
|
174 return var;
|
|
175 }
|
|
176
|
|
177 /*---------------------------------------------------------------------------
|
|
178 Resolution of qualified concept names
|
|
179 ---------------------------------------------------------------------------*/
|
|
180
|
|
181 /* This facility is used to resolve constraint checks from
|
|
182 requirement expressions. A constraint check is a call to
|
|
183 a function template declared with the keyword 'concept'.
|
|
184
|
|
185 The result of resolution is a pair (a TREE_LIST) whose value
|
|
186 is the matched declaration, and whose purpose contains the
|
|
187 coerced template arguments that can be substituted into the
|
|
188 call. */
|
|
189
|
|
190 // Given an overload set OVL, try to find a unique definition that can be
|
|
191 // instantiated by the template arguments ARGS.
|
|
192 //
|
|
193 // This function is not called for arbitrary call expressions. In particular,
|
|
194 // the call expression must be written with explicit template arguments
|
|
195 // and no function arguments. For example:
|
|
196 //
|
|
197 // f<T, U>()
|
|
198 //
|
|
199 // If a single match is found, this returns a TREE_LIST whose VALUE
|
|
200 // is the constraint function (not the template), and its PURPOSE is
|
|
201 // the complete set of arguments substituted into the parameter list.
|
|
202 static tree
|
|
203 resolve_constraint_check (tree ovl, tree args)
|
|
204 {
|
|
205 int nerrs = 0;
|
|
206 tree cands = NULL_TREE;
|
|
207 for (lkp_iterator iter (ovl); iter; ++iter)
|
|
208 {
|
|
209 // Get the next template overload.
|
|
210 tree tmpl = *iter;
|
|
211 if (TREE_CODE (tmpl) != TEMPLATE_DECL)
|
|
212 continue;
|
|
213
|
|
214 // Don't try to deduce checks for non-concepts. We often
|
|
215 // end up trying to resolve constraints in functional casts
|
|
216 // as part of a postfix-expression. We can save time and
|
|
217 // headaches by not instantiating those declarations.
|
|
218 //
|
|
219 // NOTE: This masks a potential error, caused by instantiating
|
|
220 // non-deduced contexts using placeholder arguments.
|
|
221 tree fn = DECL_TEMPLATE_RESULT (tmpl);
|
|
222 if (DECL_ARGUMENTS (fn))
|
|
223 continue;
|
|
224 if (!DECL_DECLARED_CONCEPT_P (fn))
|
|
225 continue;
|
|
226
|
|
227 // Remember the candidate if we can deduce a substitution.
|
|
228 ++processing_template_decl;
|
|
229 tree parms = TREE_VALUE (DECL_TEMPLATE_PARMS (tmpl));
|
|
230 if (tree subst = coerce_template_parms (parms, args, tmpl))
|
|
231 {
|
|
232 if (subst == error_mark_node)
|
|
233 ++nerrs;
|
|
234 else
|
|
235 cands = tree_cons (subst, fn, cands);
|
|
236 }
|
|
237 --processing_template_decl;
|
|
238 }
|
|
239
|
|
240 if (!cands)
|
|
241 /* We either had no candidates or failed deductions. */
|
|
242 return nerrs ? error_mark_node : NULL_TREE;
|
|
243 else if (TREE_CHAIN (cands))
|
|
244 /* There are multiple candidates. */
|
|
245 return error_mark_node;
|
|
246
|
|
247 return cands;
|
|
248 }
|
|
249
|
|
250 // Determine if the the call expression CALL is a constraint check, and
|
|
251 // return the concept declaration and arguments being checked. If CALL
|
|
252 // does not denote a constraint check, return NULL.
|
|
253 tree
|
|
254 resolve_constraint_check (tree call)
|
|
255 {
|
|
256 gcc_assert (TREE_CODE (call) == CALL_EXPR);
|
|
257
|
|
258 // A constraint check must be only a template-id expression. If
|
|
259 // it's a call to a base-link, its function(s) should be a
|
|
260 // template-id expression. If this is not a template-id, then it
|
|
261 // cannot be a concept-check.
|
|
262 tree target = CALL_EXPR_FN (call);
|
|
263 if (BASELINK_P (target))
|
|
264 target = BASELINK_FUNCTIONS (target);
|
|
265 if (TREE_CODE (target) != TEMPLATE_ID_EXPR)
|
|
266 return NULL_TREE;
|
|
267
|
|
268 // Get the overload set and template arguments and try to
|
|
269 // resolve the target.
|
|
270 tree ovl = TREE_OPERAND (target, 0);
|
|
271
|
|
272 /* This is a function call of a variable concept... ill-formed. */
|
|
273 if (TREE_CODE (ovl) == TEMPLATE_DECL)
|
|
274 {
|
|
275 error_at (location_of (call),
|
|
276 "function call of variable concept %qE", call);
|
|
277 return error_mark_node;
|
|
278 }
|
|
279
|
|
280 tree args = TREE_OPERAND (target, 1);
|
|
281 return resolve_constraint_check (ovl, args);
|
|
282 }
|
|
283
|
|
284 /* Returns a pair containing the checked variable concept
|
|
285 and its associated prototype parameter. The result
|
|
286 is a TREE_LIST whose TREE_VALUE is the variable concept
|
|
287 and whose TREE_PURPOSE is the prototype parameter. */
|
|
288
|
|
289 tree
|
|
290 resolve_variable_concept_check (tree id)
|
|
291 {
|
|
292 tree tmpl = TREE_OPERAND (id, 0);
|
|
293 tree args = TREE_OPERAND (id, 1);
|
|
294
|
|
295 if (!variable_concept_p (tmpl))
|
|
296 return NULL_TREE;
|
|
297
|
|
298 /* Make sure that we have the right parameters before
|
|
299 assuming that it works. Note that failing to deduce
|
|
300 will result in diagnostics. */
|
|
301 tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
|
|
302 ++processing_template_decl;
|
|
303 tree result = coerce_template_parms (parms, args, tmpl);
|
|
304 --processing_template_decl;
|
|
305 if (result != error_mark_node)
|
|
306 {
|
|
307 tree decl = DECL_TEMPLATE_RESULT (tmpl);
|
|
308 return build_tree_list (result, decl);
|
|
309 }
|
|
310 else
|
|
311 return error_mark_node;
|
|
312 }
|
|
313
|
|
314
|
|
315 /* Given a call expression or template-id expression to
|
|
316 a concept EXPR possibly including a wildcard, deduce
|
|
317 the concept being checked and the prototype parameter.
|
|
318 Returns true if the constraint and prototype can be
|
|
319 deduced and false otherwise. Note that the CHECK and
|
|
320 PROTO arguments are set to NULL_TREE if this returns
|
|
321 false. */
|
|
322
|
|
323 bool
|
|
324 deduce_constrained_parameter (tree expr, tree& check, tree& proto)
|
|
325 {
|
|
326 tree info = NULL_TREE;
|
|
327 if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)
|
|
328 info = resolve_variable_concept_check (expr);
|
|
329 else if (TREE_CODE (expr) == CALL_EXPR)
|
|
330 info = resolve_constraint_check (expr);
|
|
331 else
|
|
332 gcc_unreachable ();
|
|
333
|
|
334 if (info && info != error_mark_node)
|
|
335 {
|
|
336 check = TREE_VALUE (info);
|
|
337 tree arg = TREE_VEC_ELT (TREE_PURPOSE (info), 0);
|
|
338 if (ARGUMENT_PACK_P (arg))
|
|
339 arg = TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg), 0);
|
|
340 proto = TREE_TYPE (arg);
|
|
341 return true;
|
|
342 }
|
|
343 check = proto = NULL_TREE;
|
|
344 return false;
|
|
345 }
|
|
346
|
|
347 // Given a call expression or template-id expression to a concept, EXPR,
|
|
348 // deduce the concept being checked and return the template arguments.
|
|
349 // Returns NULL_TREE if deduction fails.
|
|
350 static tree
|
|
351 deduce_concept_introduction (tree expr)
|
|
352 {
|
|
353 tree info = NULL_TREE;
|
|
354 if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)
|
|
355 info = resolve_variable_concept_check (expr);
|
|
356 else if (TREE_CODE (expr) == CALL_EXPR)
|
|
357 info = resolve_constraint_check (expr);
|
|
358 else
|
|
359 gcc_unreachable ();
|
|
360
|
|
361 if (info && info != error_mark_node)
|
|
362 return TREE_PURPOSE (info);
|
|
363 return NULL_TREE;
|
|
364 }
|
|
365
|
|
366 namespace {
|
|
367
|
|
368 /*---------------------------------------------------------------------------
|
|
369 Constraint implication learning
|
|
370 ---------------------------------------------------------------------------*/
|
|
371
|
|
372 /* The implication context determines how we memoize concept checks.
|
|
373 Given two checks C1 and C2, the direction of implication depends
|
|
374 on whether we are learning implications of a conjunction or disjunction.
|
|
375 For example:
|
|
376
|
|
377 template<typename T> concept bool C = ...;
|
|
378 template<typenaem T> concept bool D = C<T> && true;
|
|
379
|
|
380 From this, we can learn that D<T> implies C<T>. We cannot learn,
|
|
381 without further testing, that C<T> does not imply D<T>. If, for
|
|
382 example, C<T> were defined as true, then these constraints would
|
|
383 be logically equivalent.
|
|
384
|
|
385 In rare cases, we may start with a logical equivalence. For example:
|
|
386
|
|
387 template<typename T> concept bool C = ...;
|
|
388 template<typename T> concept bool D = C<T>;
|
|
389
|
|
390 Here, we learn that C<T> implies D<T> and vice versa. */
|
|
391
|
|
392 enum implication_context
|
|
393 {
|
|
394 conjunction_cxt, /* C1 implies C2. */
|
|
395 disjunction_cxt, /* C2 implies C1. */
|
|
396 equivalence_cxt /* C1 implies C2, C2 implies C1. */
|
|
397 };
|
|
398
|
|
399 void learn_implications(tree, tree, implication_context);
|
|
400
|
|
401 void
|
|
402 learn_implication (tree parent, tree child, implication_context cxt)
|
|
403 {
|
|
404 switch (cxt)
|
|
405 {
|
|
406 case conjunction_cxt:
|
|
407 save_subsumption_result (parent, child, true);
|
|
408 break;
|
|
409 case disjunction_cxt:
|
|
410 save_subsumption_result (child, parent, true);
|
|
411 break;
|
|
412 case equivalence_cxt:
|
|
413 save_subsumption_result (parent, child, true);
|
|
414 save_subsumption_result (child, parent, true);
|
|
415 break;
|
|
416 }
|
|
417 }
|
|
418
|
|
419 void
|
|
420 learn_logical_operation (tree parent, tree constr, implication_context cxt)
|
|
421 {
|
|
422 learn_implications (parent, TREE_OPERAND (constr, 0), cxt);
|
|
423 learn_implications (parent, TREE_OPERAND (constr, 1), cxt);
|
|
424 }
|
|
425
|
|
426 void
|
|
427 learn_implications (tree parent, tree constr, implication_context cxt)
|
|
428 {
|
|
429 switch (TREE_CODE (constr))
|
|
430 {
|
|
431 case CHECK_CONSTR:
|
|
432 return learn_implication (parent, constr, cxt);
|
|
433
|
|
434 case CONJ_CONSTR:
|
|
435 if (cxt == disjunction_cxt)
|
|
436 return;
|
|
437 return learn_logical_operation (parent, constr, cxt);
|
|
438
|
|
439 case DISJ_CONSTR:
|
|
440 if (cxt == conjunction_cxt)
|
|
441 return;
|
|
442 return learn_logical_operation (parent, constr, cxt);
|
|
443
|
|
444 default:
|
|
445 break;
|
|
446 }
|
|
447 }
|
|
448
|
|
449 /* Quickly scan the top-level constraints of CONSTR to learn and
|
|
450 cache logical relations between concepts. The search does not
|
|
451 include conjunctions of disjunctions or vice versa. */
|
|
452
|
|
453 void
|
|
454 learn_implications (tree tmpl, tree args, tree constr)
|
|
455 {
|
|
456 /* Don't memoize relations between non-dependent arguemnts. It's not
|
|
457 helpful. */
|
|
458 if (!uses_template_parms (args))
|
|
459 return;
|
|
460
|
|
461 /* Build a check constraint for the purpose of caching. */
|
|
462 tree parent = build_nt (CHECK_CONSTR, tmpl, args);
|
|
463
|
|
464 /* Start learning based on the kind of the top-level contraint. */
|
|
465 if (TREE_CODE (constr) == CONJ_CONSTR)
|
|
466 return learn_logical_operation (parent, constr, conjunction_cxt);
|
|
467 else if (TREE_CODE (constr) == DISJ_CONSTR)
|
|
468 return learn_logical_operation (parent, constr, disjunction_cxt);
|
|
469 else if (TREE_CODE (constr) == CHECK_CONSTR)
|
|
470 /* This is the rare concept alias case. */
|
|
471 return learn_implication (parent, constr, equivalence_cxt);
|
|
472 }
|
|
473
|
|
474 /*---------------------------------------------------------------------------
|
|
475 Expansion of concept definitions
|
|
476 ---------------------------------------------------------------------------*/
|
|
477
|
|
478 /* Returns the expression of a function concept. */
|
|
479
|
|
480 tree
|
|
481 get_returned_expression (tree fn)
|
|
482 {
|
|
483 /* Extract the body of the function minus the return expression. */
|
|
484 tree body = DECL_SAVED_TREE (fn);
|
|
485 if (!body)
|
|
486 return error_mark_node;
|
|
487 if (TREE_CODE (body) == BIND_EXPR)
|
|
488 body = BIND_EXPR_BODY (body);
|
|
489 if (TREE_CODE (body) != RETURN_EXPR)
|
|
490 return error_mark_node;
|
|
491
|
|
492 return TREE_OPERAND (body, 0);
|
|
493 }
|
|
494
|
|
495 /* Returns the initializer of a variable concept. */
|
|
496
|
|
497 tree
|
|
498 get_variable_initializer (tree var)
|
|
499 {
|
|
500 tree init = DECL_INITIAL (var);
|
|
501 if (!init)
|
|
502 return error_mark_node;
|
|
503 return init;
|
|
504 }
|
|
505
|
|
506 /* Returns the definition of a variable or function concept. */
|
|
507
|
|
508 tree
|
|
509 get_concept_definition (tree decl)
|
|
510 {
|
|
511 if (VAR_P (decl))
|
|
512 return get_variable_initializer (decl);
|
|
513 else if (TREE_CODE (decl) == FUNCTION_DECL)
|
|
514 return get_returned_expression (decl);
|
|
515 gcc_unreachable ();
|
|
516 }
|
|
517
|
|
518 int expansion_level = 0;
|
|
519
|
|
520 struct expanding_concept_sentinel
|
|
521 {
|
|
522 expanding_concept_sentinel ()
|
|
523 {
|
|
524 ++expansion_level;
|
|
525 }
|
|
526
|
|
527 ~expanding_concept_sentinel()
|
|
528 {
|
|
529 --expansion_level;
|
|
530 }
|
|
531 };
|
|
532
|
|
533
|
|
534 } /* namespace */
|
|
535
|
|
536 /* Returns true when a concept is being expanded. */
|
|
537
|
|
538 bool
|
|
539 expanding_concept()
|
|
540 {
|
|
541 return expansion_level > 0;
|
|
542 }
|
|
543
|
|
544 /* Expand a concept declaration (not a template) and its arguments to
|
|
545 a constraint defined by the concept's initializer or definition. */
|
|
546
|
|
547 tree
|
|
548 expand_concept (tree decl, tree args)
|
|
549 {
|
|
550 expanding_concept_sentinel sentinel;
|
|
551
|
|
552 if (TREE_CODE (decl) == TEMPLATE_DECL)
|
|
553 decl = DECL_TEMPLATE_RESULT (decl);
|
|
554 tree tmpl = DECL_TI_TEMPLATE (decl);
|
|
555
|
|
556 /* Check for a previous specialization. */
|
|
557 if (tree spec = get_concept_expansion (tmpl, args))
|
|
558 return spec;
|
|
559
|
|
560 /* Substitute the arguments to form a new definition expression. */
|
|
561 tree def = get_concept_definition (decl);
|
|
562
|
|
563 ++processing_template_decl;
|
|
564 tree result = tsubst_expr (def, args, tf_none, NULL_TREE, true);
|
|
565 --processing_template_decl;
|
|
566 if (result == error_mark_node)
|
|
567 return error_mark_node;
|
|
568
|
|
569 /* And lastly, normalize it, check for implications, and save
|
|
570 the specialization for later. */
|
|
571 tree norm = normalize_expression (result);
|
|
572 learn_implications (tmpl, args, norm);
|
|
573 return save_concept_expansion (tmpl, args, norm);
|
|
574 }
|
|
575
|
|
576
|
|
577 /*---------------------------------------------------------------------------
|
|
578 Stepwise normalization of expressions
|
|
579
|
|
580 This set of functions will transform an expression into a constraint
|
|
581 in a sequence of steps. Normalization does not not look into concept
|
|
582 definitions.
|
|
583 ---------------------------------------------------------------------------*/
|
|
584
|
|
585 /* Transform a logical-or or logical-and expression into either
|
|
586 a conjunction or disjunction. */
|
|
587
|
|
588 tree
|
|
589 normalize_logical_operation (tree t, tree_code c)
|
|
590 {
|
|
591 tree t0 = normalize_expression (TREE_OPERAND (t, 0));
|
|
592 tree t1 = normalize_expression (TREE_OPERAND (t, 1));
|
|
593 return build_nt (c, t0, t1);
|
|
594 }
|
|
595
|
|
596 /* A simple requirement T introduces an expression constraint
|
|
597 for its expression. */
|
|
598
|
|
599 inline tree
|
|
600 normalize_simple_requirement (tree t)
|
|
601 {
|
|
602 return build_nt (EXPR_CONSTR, TREE_OPERAND (t, 0));
|
|
603 }
|
|
604
|
|
605 /* A type requirement T introduce a type constraint for its type. */
|
|
606
|
|
607 inline tree
|
|
608 normalize_type_requirement (tree t)
|
|
609 {
|
|
610 return build_nt (TYPE_CONSTR, TREE_OPERAND (t, 0));
|
|
611 }
|
|
612
|
|
613 /* A compound requirement T introduces a conjunction of constraints
|
|
614 depending on its form. The conjunction always includes an
|
|
615 expression constraint for the expression of the requirement.
|
|
616 If a trailing return type was specified, the conjunction includes
|
|
617 either an implicit conversion constraint or an argument deduction
|
|
618 constraint. If the noexcept specifier is present, the conjunction
|
|
619 includes an exception constraint. */
|
|
620
|
|
621 tree
|
|
622 normalize_compound_requirement (tree t)
|
|
623 {
|
|
624 tree expr = TREE_OPERAND (t, 0);
|
|
625 tree constr = build_nt (EXPR_CONSTR, TREE_OPERAND (t, 0));
|
|
626
|
|
627 /* If a type is given, append an implicit conversion or
|
|
628 argument deduction constraint. */
|
|
629 if (tree type = TREE_OPERAND (t, 1))
|
|
630 {
|
|
631 tree type_constr;
|
|
632 /* TODO: We should be extracting a list of auto nodes
|
|
633 from type_uses_auto, not a single node */
|
|
634 if (tree placeholder = type_uses_auto (type))
|
|
635 type_constr = build_nt (DEDUCT_CONSTR, expr, type, placeholder);
|
|
636 else
|
|
637 type_constr = build_nt (ICONV_CONSTR, expr, type);
|
|
638 constr = conjoin_constraints (constr, type_constr);
|
|
639 }
|
|
640
|
|
641 /* If noexcept is present, append an exception constraint. */
|
|
642 if (COMPOUND_REQ_NOEXCEPT_P (t))
|
|
643 {
|
|
644 tree except = build_nt (EXCEPT_CONSTR, expr);
|
|
645 constr = conjoin_constraints (constr, except);
|
|
646 }
|
|
647
|
|
648 return constr;
|
|
649 }
|
|
650
|
|
651 /* A nested requirement T introduces a conjunction of constraints
|
|
652 corresponding to its constraint-expression.
|
|
653
|
|
654 If the result of transforming T is error_mark_node, the resulting
|
|
655 constraint is a predicate constraint whose operand is also
|
|
656 error_mark_node. This preserves the constraint structure, but
|
|
657 will guarantee that the constraint is never satisfied. */
|
|
658
|
|
659 inline tree
|
|
660 normalize_nested_requirement (tree t)
|
|
661 {
|
|
662 return normalize_expression (TREE_OPERAND (t, 0));
|
|
663 }
|
|
664
|
|
665 /* Transform a requirement T into one or more constraints. */
|
|
666
|
|
667 tree
|
|
668 normalize_requirement (tree t)
|
|
669 {
|
|
670 switch (TREE_CODE (t))
|
|
671 {
|
|
672 case SIMPLE_REQ:
|
|
673 return normalize_simple_requirement (t);
|
|
674
|
|
675 case TYPE_REQ:
|
|
676 return normalize_type_requirement (t);
|
|
677
|
|
678 case COMPOUND_REQ:
|
|
679 return normalize_compound_requirement (t);
|
|
680
|
|
681 case NESTED_REQ:
|
|
682 return normalize_nested_requirement (t);
|
|
683
|
|
684 default:
|
|
685 gcc_unreachable ();
|
|
686 }
|
|
687 return error_mark_node;
|
|
688 }
|
|
689
|
|
690 /* Transform a sequence of requirements into a conjunction of
|
|
691 constraints. */
|
|
692
|
|
693 tree
|
|
694 normalize_requirements (tree t)
|
|
695 {
|
|
696 tree result = NULL_TREE;
|
|
697 for (; t; t = TREE_CHAIN (t))
|
|
698 {
|
|
699 tree constr = normalize_requirement (TREE_VALUE (t));
|
|
700 result = conjoin_constraints (result, constr);
|
|
701 }
|
|
702 return result;
|
|
703 }
|
|
704
|
|
705 /* The normal form of a requires-expression is a parameterized
|
|
706 constraint having the same parameters and a conjunction of
|
|
707 constraints representing the normal form of requirements. */
|
|
708
|
|
709 tree
|
|
710 normalize_requires_expression (tree t)
|
|
711 {
|
|
712 tree operand = normalize_requirements (TREE_OPERAND (t, 1));
|
|
713 if (tree parms = TREE_OPERAND (t, 0))
|
|
714 return build_nt (PARM_CONSTR, parms, operand);
|
|
715 else
|
|
716 return operand;
|
|
717 }
|
|
718
|
|
719 /* For a template-id referring to a variable concept, returns
|
|
720 a check constraint. Otherwise, returns a predicate constraint. */
|
|
721
|
|
722 tree
|
|
723 normalize_template_id_expression (tree t)
|
|
724 {
|
|
725 if (tree info = resolve_variable_concept_check (t))
|
|
726 {
|
|
727 if (info == error_mark_node)
|
|
728 {
|
|
729 /* We get this when the template arguments don't match
|
|
730 the variable concept. */
|
|
731 error ("invalid reference to concept %qE", t);
|
|
732 return error_mark_node;
|
|
733 }
|
|
734
|
|
735 tree decl = TREE_VALUE (info);
|
|
736 tree args = TREE_PURPOSE (info);
|
|
737 return build_nt (CHECK_CONSTR, decl, args);
|
|
738 }
|
|
739
|
|
740 /* Check that we didn't refer to a function concept like a variable. */
|
|
741 tree fn = OVL_FIRST (TREE_OPERAND (t, 0));
|
|
742 if (TREE_CODE (fn) == TEMPLATE_DECL
|
|
743 && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (fn)))
|
|
744 {
|
|
745 error_at (location_of (t),
|
|
746 "invalid reference to function concept %qD", fn);
|
|
747 return error_mark_node;
|
|
748 }
|
|
749
|
|
750 return build_nt (PRED_CONSTR, t);
|
|
751 }
|
|
752
|
|
753 /* For a call expression to a function concept, returns a check
|
|
754 constraint. Otherwise, returns a predicate constraint. */
|
|
755
|
|
756 tree
|
|
757 normalize_call_expression (tree t)
|
|
758 {
|
|
759 /* Try to resolve this function call as a concept. If not, then
|
|
760 it can be returned as a predicate constraint. */
|
|
761 tree check = resolve_constraint_check (t);
|
|
762 if (!check)
|
|
763 return build_nt (PRED_CONSTR, t);
|
|
764 if (check == error_mark_node)
|
|
765 {
|
|
766 /* TODO: Improve diagnostics. We could report why the reference
|
|
767 is invalid. */
|
|
768 error ("invalid reference to concept %qE", t);
|
|
769 return error_mark_node;
|
|
770 }
|
|
771
|
|
772 tree fn = TREE_VALUE (check);
|
|
773 tree args = TREE_PURPOSE (check);
|
|
774 return build_nt (CHECK_CONSTR, fn, args);
|
|
775 }
|
|
776
|
|
777 /* If T is a call to an overloaded && or || operator, diagnose that
|
|
778 as a non-SFINAEable error. Returns true if an error is emitted.
|
|
779
|
|
780 TODO: It would be better to diagnose this at the point of definition,
|
|
781 if possible. Perhaps we should immediately do a first-pass normalization
|
|
782 of a concept definition to catch obvious non-dependent errors like
|
|
783 this. */
|
|
784
|
|
785 bool
|
|
786 check_for_logical_overloads (tree t)
|
|
787 {
|
|
788 if (TREE_CODE (t) != CALL_EXPR)
|
|
789 return false;
|
|
790
|
|
791 tree fn = CALL_EXPR_FN (t);
|
|
792
|
|
793 /* For member calls, try extracting the function from the
|
|
794 component ref. */
|
|
795 if (TREE_CODE (fn) == COMPONENT_REF)
|
|
796 {
|
|
797 fn = TREE_OPERAND (fn, 1);
|
|
798 if (TREE_CODE (fn) == BASELINK)
|
|
799 fn = BASELINK_FUNCTIONS (fn);
|
|
800 }
|
|
801
|
|
802 if (TREE_CODE (fn) != FUNCTION_DECL)
|
|
803 return false;
|
|
804
|
|
805 if (DECL_OVERLOADED_OPERATOR_P (fn))
|
|
806 {
|
|
807 location_t loc = EXPR_LOC_OR_LOC (t, input_location);
|
|
808 error_at (loc, "constraint %qE, uses overloaded operator", t);
|
|
809 return true;
|
|
810 }
|
|
811
|
|
812 return false;
|
|
813 }
|
|
814
|
|
815 /* The normal form of an atom depends on the expression. The normal
|
|
816 form of a function call to a function concept is a check constraint
|
|
817 for that concept. The normal form of a reference to a variable
|
|
818 concept is a check constraint for that concept. Otherwise, the
|
|
819 constraint is a predicate constraint. */
|
|
820
|
|
821 tree
|
|
822 normalize_atom (tree t)
|
|
823 {
|
|
824 /* We can get constraints pushed down through pack expansions, so
|
|
825 just return them. */
|
|
826 if (constraint_p (t))
|
|
827 return t;
|
|
828
|
|
829 tree type = TREE_TYPE (t);
|
|
830 if (!type || type_unknown_p (t) || TREE_CODE (type) == TEMPLATE_TYPE_PARM)
|
|
831 ;
|
|
832 else if (!dependent_type_p (type))
|
|
833 {
|
|
834 if (check_for_logical_overloads (t))
|
|
835 return error_mark_node;
|
|
836
|
|
837 type = cv_unqualified (type);
|
|
838 if (!same_type_p (type, boolean_type_node))
|
|
839 {
|
|
840 error ("predicate constraint %q+E does not have type %<bool%>", t);
|
|
841 return error_mark_node;
|
|
842 }
|
|
843 }
|
|
844
|
|
845 if (TREE_CODE (t) == TEMPLATE_ID_EXPR)
|
|
846 return normalize_template_id_expression (t);
|
|
847 if (TREE_CODE (t) == CALL_EXPR)
|
|
848 return normalize_call_expression (t);
|
|
849 return build_nt (PRED_CONSTR, t);
|
|
850 }
|
|
851
|
|
852 /* Push down the pack expansion EXP into the leaves of the constraint PAT. */
|
|
853
|
|
854 tree
|
|
855 push_down_pack_expansion (tree exp, tree pat)
|
|
856 {
|
|
857 switch (TREE_CODE (pat))
|
|
858 {
|
|
859 case CONJ_CONSTR:
|
|
860 case DISJ_CONSTR:
|
|
861 {
|
|
862 pat = copy_node (pat);
|
|
863 TREE_OPERAND (pat, 0)
|
|
864 = push_down_pack_expansion (exp, TREE_OPERAND (pat, 0));
|
|
865 TREE_OPERAND (pat, 1)
|
|
866 = push_down_pack_expansion (exp, TREE_OPERAND (pat, 1));
|
|
867 return pat;
|
|
868 }
|
|
869 default:
|
|
870 {
|
|
871 exp = copy_node (exp);
|
|
872 SET_PACK_EXPANSION_PATTERN (exp, pat);
|
|
873 return exp;
|
|
874 }
|
|
875 }
|
|
876 }
|
|
877
|
|
878 /* Transform a pack expansion into a constraint. First we transform the
|
|
879 pattern of the pack expansion, then we push the pack expansion down into the
|
|
880 leaves of the constraint so that partial ordering will work. */
|
|
881
|
|
882 tree
|
|
883 normalize_pack_expansion (tree t)
|
|
884 {
|
|
885 tree pat = normalize_expression (PACK_EXPANSION_PATTERN (t));
|
|
886 return push_down_pack_expansion (t, pat);
|
|
887 }
|
|
888
|
|
889 /* Transform an expression into a constraint. */
|
|
890
|
|
891 tree
|
|
892 normalize_any_expression (tree t)
|
|
893 {
|
|
894 switch (TREE_CODE (t))
|
|
895 {
|
|
896 case TRUTH_ANDIF_EXPR:
|
|
897 return normalize_logical_operation (t, CONJ_CONSTR);
|
|
898
|
|
899 case TRUTH_ORIF_EXPR:
|
|
900 return normalize_logical_operation (t, DISJ_CONSTR);
|
|
901
|
|
902 case REQUIRES_EXPR:
|
|
903 return normalize_requires_expression (t);
|
|
904
|
|
905 case BIND_EXPR:
|
|
906 return normalize_expression (BIND_EXPR_BODY (t));
|
|
907
|
|
908 case EXPR_PACK_EXPANSION:
|
|
909 return normalize_pack_expansion (t);
|
|
910
|
|
911 default:
|
|
912 /* All other constraints are atomic. */
|
|
913 return normalize_atom (t);
|
|
914 }
|
|
915 }
|
|
916
|
|
917 /* Transform a statement into an expression. */
|
|
918 tree
|
|
919 normalize_any_statement (tree t)
|
|
920 {
|
|
921 switch (TREE_CODE (t))
|
|
922 {
|
|
923 case RETURN_EXPR:
|
|
924 return normalize_expression (TREE_OPERAND (t, 0));
|
|
925 default:
|
|
926 gcc_unreachable ();
|
|
927 }
|
|
928 return error_mark_node;
|
|
929 }
|
|
930
|
|
931 /* Reduction rules for the declaration T. */
|
|
932
|
|
933 tree
|
|
934 normalize_any_declaration (tree t)
|
|
935 {
|
|
936 switch (TREE_CODE (t))
|
|
937 {
|
|
938 case VAR_DECL:
|
|
939 return normalize_atom (t);
|
|
940 default:
|
|
941 gcc_unreachable ();
|
|
942 }
|
|
943 return error_mark_node;
|
|
944 }
|
|
945
|
|
946 /* Returns the normal form of a constraint expression. */
|
|
947
|
|
948 tree
|
|
949 normalize_expression (tree t)
|
|
950 {
|
|
951 if (!t)
|
|
952 return NULL_TREE;
|
|
953
|
|
954 if (t == error_mark_node)
|
|
955 return error_mark_node;
|
|
956
|
|
957 switch (TREE_CODE_CLASS (TREE_CODE (t)))
|
|
958 {
|
|
959 case tcc_unary:
|
|
960 case tcc_binary:
|
|
961 case tcc_expression:
|
|
962 case tcc_vl_exp:
|
|
963 return normalize_any_expression (t);
|
|
964
|
|
965 case tcc_statement:
|
|
966 return normalize_any_statement (t);
|
|
967
|
|
968 case tcc_declaration:
|
|
969 return normalize_any_declaration (t);
|
|
970
|
|
971 case tcc_exceptional:
|
|
972 case tcc_constant:
|
|
973 case tcc_reference:
|
|
974 case tcc_comparison:
|
|
975 /* These are all atomic predicate constraints. */
|
|
976 return normalize_atom (t);
|
|
977
|
|
978 default:
|
|
979 /* Unhandled node kind. */
|
|
980 gcc_unreachable ();
|
|
981 }
|
|
982 return error_mark_node;
|
|
983 }
|
|
984
|
|
985
|
|
986 /*---------------------------------------------------------------------------
|
|
987 Constraint normalization
|
|
988 ---------------------------------------------------------------------------*/
|
|
989
|
|
990 tree normalize_constraint (tree);
|
|
991
|
|
992 /* The normal form of the disjunction T0 /\ T1 is the conjunction
|
|
993 of the normal form of T0 and the normal form of T1. */
|
|
994
|
|
995 inline tree
|
|
996 normalize_conjunction (tree t)
|
|
997 {
|
|
998 tree t0 = normalize_constraint (TREE_OPERAND (t, 0));
|
|
999 tree t1 = normalize_constraint (TREE_OPERAND (t, 1));
|
|
1000 return build_nt (CONJ_CONSTR, t0, t1);
|
|
1001 }
|
|
1002
|
|
1003 /* The normal form of the disjunction T0 \/ T1 is the disjunction
|
|
1004 of the normal form of T0 and the normal form of T1. */
|
|
1005
|
|
1006 inline tree
|
|
1007 normalize_disjunction (tree t)
|
|
1008 {
|
|
1009 tree t0 = normalize_constraint (TREE_OPERAND (t, 0));
|
|
1010 tree t1 = normalize_constraint (TREE_OPERAND (t, 1));
|
|
1011 return build_nt (DISJ_CONSTR, t0, t1);
|
|
1012 }
|
|
1013
|
|
1014 /* A predicate constraint is normalized in two stages. First all
|
|
1015 references specializations of concepts are replaced by their
|
|
1016 substituted definitions. Then, the resulting expression is
|
|
1017 transformed into a constraint by transforming && expressions
|
|
1018 into conjunctions and || into disjunctions. */
|
|
1019
|
|
1020 tree
|
|
1021 normalize_predicate_constraint (tree t)
|
|
1022 {
|
|
1023 ++processing_template_decl;
|
|
1024 tree expr = PRED_CONSTR_EXPR (t);
|
|
1025 tree constr = normalize_expression (expr);
|
|
1026 --processing_template_decl;
|
|
1027 return constr;
|
|
1028 }
|
|
1029
|
|
1030 /* The normal form of a parameterized constraint is the normal
|
|
1031 form of its operand. */
|
|
1032
|
|
1033 tree
|
|
1034 normalize_parameterized_constraint (tree t)
|
|
1035 {
|
|
1036 tree parms = PARM_CONSTR_PARMS (t);
|
|
1037 tree operand = normalize_constraint (PARM_CONSTR_OPERAND (t));
|
|
1038 return build_nt (PARM_CONSTR, parms, operand);
|
|
1039 }
|
|
1040
|
|
1041 /* Normalize the constraint T by reducing it so that it is
|
|
1042 comprised of only conjunctions and disjunctions of atomic
|
|
1043 constraints. */
|
|
1044
|
|
1045 tree
|
|
1046 normalize_constraint (tree t)
|
|
1047 {
|
|
1048 if (!t)
|
|
1049 return NULL_TREE;
|
|
1050
|
|
1051 if (t == error_mark_node)
|
|
1052 return t;
|
|
1053
|
|
1054 switch (TREE_CODE (t))
|
|
1055 {
|
|
1056 case CONJ_CONSTR:
|
|
1057 return normalize_conjunction (t);
|
|
1058
|
|
1059 case DISJ_CONSTR:
|
|
1060 return normalize_disjunction (t);
|
|
1061
|
|
1062 case PRED_CONSTR:
|
|
1063 return normalize_predicate_constraint (t);
|
|
1064
|
|
1065 case PARM_CONSTR:
|
|
1066 return normalize_parameterized_constraint (t);
|
|
1067
|
|
1068 case EXPR_CONSTR:
|
|
1069 case TYPE_CONSTR:
|
|
1070 case ICONV_CONSTR:
|
|
1071 case DEDUCT_CONSTR:
|
|
1072 case EXCEPT_CONSTR:
|
|
1073 /* These constraints are defined to be atomic. */
|
|
1074 return t;
|
|
1075
|
|
1076 default:
|
|
1077 /* CONSTR was not a constraint. */
|
|
1078 gcc_unreachable();
|
|
1079 }
|
|
1080 return error_mark_node;
|
|
1081 }
|
|
1082
|
|
1083
|
|
1084
|
|
1085 // -------------------------------------------------------------------------- //
|
|
1086 // Constraint Semantic Processing
|
|
1087 //
|
|
1088 // The following functions are called by the parser and substitution rules
|
|
1089 // to create and evaluate constraint-related nodes.
|
|
1090
|
|
1091 // The constraints associated with the current template parameters.
|
|
1092 tree
|
|
1093 current_template_constraints (void)
|
|
1094 {
|
|
1095 if (!current_template_parms)
|
|
1096 return NULL_TREE;
|
|
1097 tree tmpl_constr = TEMPLATE_PARM_CONSTRAINTS (current_template_parms);
|
|
1098 return build_constraints (tmpl_constr, NULL_TREE);
|
|
1099 }
|
|
1100
|
|
1101 // If the recently parsed TYPE declares or defines a template or template
|
|
1102 // specialization, get its corresponding constraints from the current
|
|
1103 // template parameters and bind them to TYPE's declaration.
|
|
1104 tree
|
|
1105 associate_classtype_constraints (tree type)
|
|
1106 {
|
|
1107 if (!type || type == error_mark_node || TREE_CODE (type) != RECORD_TYPE)
|
|
1108 return type;
|
|
1109
|
|
1110 // An explicit class template specialization has no template
|
|
1111 // parameters.
|
|
1112 if (!current_template_parms)
|
|
1113 return type;
|
|
1114
|
|
1115 if (CLASSTYPE_IS_TEMPLATE (type) || CLASSTYPE_TEMPLATE_SPECIALIZATION (type))
|
|
1116 {
|
|
1117 tree decl = TYPE_STUB_DECL (type);
|
|
1118 tree ci = current_template_constraints ();
|
|
1119
|
|
1120 // An implicitly instantiated member template declaration already
|
|
1121 // has associated constraints. If it is defined outside of its
|
|
1122 // class, then we need match these constraints against those of
|
|
1123 // original declaration.
|
|
1124 if (tree orig_ci = get_constraints (decl))
|
|
1125 {
|
|
1126 if (!equivalent_constraints (ci, orig_ci))
|
|
1127 {
|
|
1128 // FIXME: Improve diagnostics.
|
|
1129 error ("%qT does not match any declaration", type);
|
|
1130 return error_mark_node;
|
|
1131 }
|
|
1132 return type;
|
|
1133 }
|
|
1134 set_constraints (decl, ci);
|
|
1135 }
|
|
1136 return type;
|
|
1137 }
|
|
1138
|
|
1139 namespace {
|
|
1140
|
|
1141 // Create an empty constraint info block.
|
|
1142 inline tree_constraint_info*
|
|
1143 build_constraint_info ()
|
|
1144 {
|
|
1145 return (tree_constraint_info *)make_node (CONSTRAINT_INFO);
|
|
1146 }
|
|
1147
|
|
1148 } // namespace
|
|
1149
|
|
1150 /* Build a constraint-info object that contains the associated constraints
|
|
1151 of a declaration. This also includes the declaration's template
|
|
1152 requirements (TREQS) and any trailing requirements for a function
|
|
1153 declarator (DREQS). Note that both TREQS and DREQS must be constraints.
|
|
1154
|
|
1155 If the declaration has neither template nor declaration requirements
|
|
1156 this returns NULL_TREE, indicating an unconstrained declaration. */
|
|
1157
|
|
1158 tree
|
|
1159 build_constraints (tree tmpl_reqs, tree decl_reqs)
|
|
1160 {
|
|
1161 gcc_assert (tmpl_reqs ? constraint_p (tmpl_reqs) : true);
|
|
1162 gcc_assert (decl_reqs ? constraint_p (decl_reqs) : true);
|
|
1163
|
|
1164 if (!tmpl_reqs && !decl_reqs)
|
|
1165 return NULL_TREE;
|
|
1166
|
|
1167 tree_constraint_info* ci = build_constraint_info ();
|
|
1168 ci->template_reqs = tmpl_reqs;
|
|
1169 ci->declarator_reqs = decl_reqs;
|
|
1170 ci->associated_constr = conjoin_constraints (tmpl_reqs, decl_reqs);
|
|
1171
|
|
1172 return (tree)ci;
|
|
1173 }
|
|
1174
|
|
1175 namespace {
|
|
1176
|
|
1177 /* Construct a sequence of template arguments by prepending
|
|
1178 ARG to REST. Either ARG or REST may be null. */
|
|
1179 tree
|
|
1180 build_concept_check_arguments (tree arg, tree rest)
|
|
1181 {
|
|
1182 gcc_assert (rest ? TREE_CODE (rest) == TREE_VEC : true);
|
|
1183 tree args;
|
|
1184 if (arg)
|
|
1185 {
|
|
1186 int n = rest ? TREE_VEC_LENGTH (rest) : 0;
|
|
1187 args = make_tree_vec (n + 1);
|
|
1188 TREE_VEC_ELT (args, 0) = arg;
|
|
1189 if (rest)
|
|
1190 for (int i = 0; i < n; ++i)
|
|
1191 TREE_VEC_ELT (args, i + 1) = TREE_VEC_ELT (rest, i);
|
|
1192 int def = rest ? GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (rest) : 0;
|
|
1193 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (args, def + 1);
|
|
1194 }
|
|
1195 else
|
|
1196 {
|
|
1197 gcc_assert (rest != NULL_TREE);
|
|
1198 args = rest;
|
|
1199 }
|
|
1200 return args;
|
|
1201 }
|
|
1202
|
|
1203 } // namespace
|
|
1204
|
|
1205 /* Construct an expression that checks the concept given by
|
|
1206 TARGET. The TARGET must be:
|
|
1207
|
|
1208 - an OVERLOAD referring to one or more function concepts
|
|
1209 - a BASELINK referring to an overload set of the above, or
|
|
1210 - a TEMPLTATE_DECL referring to a variable concept.
|
|
1211
|
|
1212 ARG and REST are the explicit template arguments for the
|
|
1213 eventual concept check. */
|
|
1214 tree
|
|
1215 build_concept_check (tree target, tree arg, tree rest)
|
|
1216 {
|
|
1217 tree args = build_concept_check_arguments (arg, rest);
|
|
1218 if (variable_template_p (target))
|
|
1219 return build_variable_check (lookup_template_variable (target, args));
|
|
1220 else
|
|
1221 return build_call_check (lookup_template_function (target, args));
|
|
1222 }
|
|
1223
|
|
1224
|
|
1225 /* Returns a TYPE_DECL that contains sufficient information to
|
|
1226 build a template parameter of the same kind as PROTO and
|
|
1227 constrained by the concept declaration CNC. Note that PROTO
|
|
1228 is the first template parameter of CNC.
|
|
1229
|
|
1230 If specified, ARGS provides additional arguments to the
|
|
1231 constraint check. */
|
|
1232 tree
|
|
1233 build_constrained_parameter (tree cnc, tree proto, tree args)
|
|
1234 {
|
|
1235 tree name = DECL_NAME (cnc);
|
|
1236 tree type = TREE_TYPE (proto);
|
|
1237 tree decl = build_decl (input_location, TYPE_DECL, name, type);
|
|
1238 CONSTRAINED_PARM_PROTOTYPE (decl) = proto;
|
|
1239 CONSTRAINED_PARM_CONCEPT (decl) = cnc;
|
|
1240 CONSTRAINED_PARM_EXTRA_ARGS (decl) = args;
|
|
1241 return decl;
|
|
1242 }
|
|
1243
|
|
1244 /* Create a constraint expression for the given DECL that
|
|
1245 evaluates the requirements specified by CONSTR, a TYPE_DECL
|
|
1246 that contains all the information necessary to build the
|
|
1247 requirements (see finish_concept_name for the layout of
|
|
1248 that TYPE_DECL).
|
|
1249
|
|
1250 Note that the constraints are neither reduced nor decomposed.
|
|
1251 That is done only after the requires clause has been parsed
|
|
1252 (or not).
|
|
1253
|
|
1254 This will always return a CHECK_CONSTR. */
|
|
1255 tree
|
|
1256 finish_shorthand_constraint (tree decl, tree constr)
|
|
1257 {
|
|
1258 /* No requirements means no constraints. */
|
|
1259 if (!constr)
|
|
1260 return NULL_TREE;
|
|
1261
|
|
1262 tree proto = CONSTRAINED_PARM_PROTOTYPE (constr);
|
|
1263 tree con = CONSTRAINED_PARM_CONCEPT (constr);
|
|
1264 tree args = CONSTRAINED_PARM_EXTRA_ARGS (constr);
|
|
1265
|
|
1266 /* If the parameter declaration is variadic, but the concept
|
|
1267 is not then we need to apply the concept to every element
|
|
1268 in the pack. */
|
|
1269 bool is_proto_pack = template_parameter_pack_p (proto);
|
|
1270 bool is_decl_pack = template_parameter_pack_p (decl);
|
|
1271 bool apply_to_all_p = is_decl_pack && !is_proto_pack;
|
|
1272
|
|
1273 /* Get the argument and overload used for the requirement
|
|
1274 and adjust it if we're going to expand later. */
|
|
1275 tree arg = template_parm_to_arg (build_tree_list (NULL_TREE, decl));
|
|
1276 if (apply_to_all_p)
|
|
1277 arg = PACK_EXPANSION_PATTERN (TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg), 0));
|
|
1278
|
|
1279 /* Build the concept check. If it the constraint needs to be
|
|
1280 applied to all elements of the parameter pack, then make
|
|
1281 the constraint an expansion. */
|
|
1282 tree tmpl = DECL_TI_TEMPLATE (con);
|
|
1283 tree check = VAR_P (con) ? tmpl : ovl_make (tmpl);
|
|
1284 check = build_concept_check (check, arg, args);
|
|
1285
|
|
1286 /* Make the check a pack expansion if needed.
|
|
1287
|
|
1288 FIXME: We should be making a fold expression. */
|
|
1289 if (apply_to_all_p)
|
|
1290 {
|
|
1291 check = make_pack_expansion (check);
|
|
1292 TREE_TYPE (check) = boolean_type_node;
|
|
1293 }
|
|
1294
|
|
1295 return normalize_expression (check);
|
|
1296 }
|
|
1297
|
|
1298 /* Returns a conjunction of shorthand requirements for the template
|
|
1299 parameter list PARMS. Note that the requirements are stored in
|
|
1300 the TYPE of each tree node. */
|
|
1301 tree
|
|
1302 get_shorthand_constraints (tree parms)
|
|
1303 {
|
|
1304 tree result = NULL_TREE;
|
|
1305 parms = INNERMOST_TEMPLATE_PARMS (parms);
|
|
1306 for (int i = 0; i < TREE_VEC_LENGTH (parms); ++i)
|
|
1307 {
|
|
1308 tree parm = TREE_VEC_ELT (parms, i);
|
|
1309 tree constr = TEMPLATE_PARM_CONSTRAINTS (parm);
|
|
1310 result = conjoin_constraints (result, constr);
|
|
1311 }
|
|
1312 return result;
|
|
1313 }
|
|
1314
|
|
1315 // Returns and chains a new parameter for PARAMETER_LIST which will conform
|
|
1316 // to the prototype given by SRC_PARM. The new parameter will have its
|
|
1317 // identifier and location set according to IDENT and PARM_LOC respectively.
|
|
1318 static tree
|
|
1319 process_introduction_parm (tree parameter_list, tree src_parm)
|
|
1320 {
|
|
1321 // If we have a pack, we should have a single pack argument which is the
|
|
1322 // placeholder we want to look at.
|
|
1323 bool is_parameter_pack = ARGUMENT_PACK_P (src_parm);
|
|
1324 if (is_parameter_pack)
|
|
1325 src_parm = TREE_VEC_ELT (ARGUMENT_PACK_ARGS (src_parm), 0);
|
|
1326
|
|
1327 // At this point we should have a wildcard, but we want to
|
|
1328 // grab the associated decl from it. Also grab the stored
|
|
1329 // identifier and location that should be chained to it in
|
|
1330 // a PARM_DECL.
|
|
1331 gcc_assert (TREE_CODE (src_parm) == WILDCARD_DECL);
|
|
1332
|
|
1333 tree ident = DECL_NAME (src_parm);
|
|
1334 location_t parm_loc = DECL_SOURCE_LOCATION (src_parm);
|
|
1335
|
|
1336 // If we expect a pack and the deduced template is not a pack, or if the
|
|
1337 // template is using a pack and we didn't declare a pack, throw an error.
|
|
1338 if (is_parameter_pack != WILDCARD_PACK_P (src_parm))
|
|
1339 {
|
|
1340 error_at (parm_loc, "cannot match pack for introduced parameter");
|
|
1341 tree err_parm = build_tree_list (error_mark_node, error_mark_node);
|
|
1342 return chainon (parameter_list, err_parm);
|
|
1343 }
|
|
1344
|
|
1345 src_parm = TREE_TYPE (src_parm);
|
|
1346
|
|
1347 tree parm;
|
|
1348 bool is_non_type;
|
|
1349 if (TREE_CODE (src_parm) == TYPE_DECL)
|
|
1350 {
|
|
1351 is_non_type = false;
|
|
1352 parm = finish_template_type_parm (class_type_node, ident);
|
|
1353 }
|
|
1354 else if (TREE_CODE (src_parm) == TEMPLATE_DECL)
|
|
1355 {
|
|
1356 is_non_type = false;
|
|
1357 begin_template_parm_list ();
|
|
1358 current_template_parms = DECL_TEMPLATE_PARMS (src_parm);
|
|
1359 end_template_parm_list ();
|
|
1360 parm = finish_template_template_parm (class_type_node, ident);
|
|
1361 }
|
|
1362 else
|
|
1363 {
|
|
1364 is_non_type = true;
|
|
1365
|
|
1366 // Since we don't have a declarator, so we can copy the source
|
|
1367 // parameter and change the name and eventually the location.
|
|
1368 parm = copy_decl (src_parm);
|
|
1369 DECL_NAME (parm) = ident;
|
|
1370 }
|
|
1371
|
|
1372 // Wrap in a TREE_LIST for process_template_parm. Introductions do not
|
|
1373 // retain the defaults from the source template.
|
|
1374 parm = build_tree_list (NULL_TREE, parm);
|
|
1375
|
|
1376 return process_template_parm (parameter_list, parm_loc, parm,
|
|
1377 is_non_type, is_parameter_pack);
|
|
1378 }
|
|
1379
|
|
1380 /* Associates a constraint check to the current template based
|
|
1381 on the introduction parameters. INTRO_LIST must be a TREE_VEC
|
|
1382 of WILDCARD_DECLs containing a chained PARM_DECL which
|
|
1383 contains the identifier as well as the source location.
|
|
1384 TMPL_DECL is the decl for the concept being used. If we
|
|
1385 take a concept, C, this will form a check in the form of
|
|
1386 C<INTRO_LIST> filling in any extra arguments needed by the
|
|
1387 defaults deduced.
|
|
1388
|
|
1389 Returns NULL_TREE if no concept could be matched and
|
|
1390 error_mark_node if an error occurred when matching. */
|
|
1391 tree
|
|
1392 finish_template_introduction (tree tmpl_decl, tree intro_list)
|
|
1393 {
|
|
1394 /* Deduce the concept check. */
|
|
1395 tree expr = build_concept_check (tmpl_decl, NULL_TREE, intro_list);
|
|
1396 if (expr == error_mark_node)
|
|
1397 return NULL_TREE;
|
|
1398
|
|
1399 tree parms = deduce_concept_introduction (expr);
|
|
1400 if (!parms)
|
|
1401 return NULL_TREE;
|
|
1402
|
|
1403 /* Build template parameter scope for introduction. */
|
|
1404 tree parm_list = NULL_TREE;
|
|
1405 begin_template_parm_list ();
|
|
1406 int nargs = MIN (TREE_VEC_LENGTH (parms), TREE_VEC_LENGTH (intro_list));
|
|
1407 for (int n = 0; n < nargs; ++n)
|
|
1408 parm_list = process_introduction_parm (parm_list, TREE_VEC_ELT (parms, n));
|
|
1409 parm_list = end_template_parm_list (parm_list);
|
|
1410 for (int i = 0; i < TREE_VEC_LENGTH (parm_list); ++i)
|
|
1411 if (TREE_VALUE (TREE_VEC_ELT (parm_list, i)) == error_mark_node)
|
|
1412 {
|
|
1413 end_template_decl ();
|
|
1414 return error_mark_node;
|
|
1415 }
|
|
1416
|
|
1417 /* Build a concept check for our constraint. */
|
|
1418 tree check_args = make_tree_vec (TREE_VEC_LENGTH (parms));
|
|
1419 int n = 0;
|
|
1420 for (; n < TREE_VEC_LENGTH (parm_list); ++n)
|
|
1421 {
|
|
1422 tree parm = TREE_VEC_ELT (parm_list, n);
|
|
1423 TREE_VEC_ELT (check_args, n) = template_parm_to_arg (parm);
|
|
1424 }
|
|
1425 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (check_args, n);
|
|
1426
|
|
1427 /* If the template expects more parameters we should be able
|
|
1428 to use the defaults from our deduced concept. */
|
|
1429 for (; n < TREE_VEC_LENGTH (parms); ++n)
|
|
1430 TREE_VEC_ELT (check_args, n) = TREE_VEC_ELT (parms, n);
|
|
1431
|
|
1432 /* Associate the constraint. */
|
|
1433 tree check = build_concept_check (tmpl_decl, NULL_TREE, check_args);
|
|
1434 tree constr = normalize_expression (check);
|
|
1435 TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = constr;
|
|
1436
|
|
1437 return parm_list;
|
|
1438 }
|
|
1439
|
|
1440
|
|
1441 /* Given the predicate constraint T from a constrained-type-specifier, extract
|
|
1442 its TMPL and ARGS. FIXME why do we need two different forms of
|
|
1443 constrained-type-specifier? */
|
|
1444
|
|
1445 void
|
|
1446 placeholder_extract_concept_and_args (tree t, tree &tmpl, tree &args)
|
|
1447 {
|
|
1448 if (TREE_CODE (t) == TYPE_DECL)
|
|
1449 {
|
|
1450 /* A constrained parameter. Build a constraint check
|
|
1451 based on the prototype parameter and then extract the
|
|
1452 arguments from that. */
|
|
1453 tree proto = CONSTRAINED_PARM_PROTOTYPE (t);
|
|
1454 tree check = finish_shorthand_constraint (proto, t);
|
|
1455 placeholder_extract_concept_and_args (check, tmpl, args);
|
|
1456 return;
|
|
1457 }
|
|
1458
|
|
1459 if (TREE_CODE (t) == CHECK_CONSTR)
|
|
1460 {
|
|
1461 tree decl = CHECK_CONSTR_CONCEPT (t);
|
|
1462 tmpl = DECL_TI_TEMPLATE (decl);
|
|
1463 args = CHECK_CONSTR_ARGS (t);
|
|
1464 return;
|
|
1465 }
|
|
1466
|
|
1467 gcc_unreachable ();
|
|
1468 }
|
|
1469
|
|
1470 /* Returns true iff the placeholders C1 and C2 are equivalent. C1
|
|
1471 and C2 can be either CHECK_CONSTR or TEMPLATE_TYPE_PARM. */
|
|
1472
|
|
1473 bool
|
|
1474 equivalent_placeholder_constraints (tree c1, tree c2)
|
|
1475 {
|
|
1476 if (c1 && TREE_CODE (c1) == TEMPLATE_TYPE_PARM)
|
|
1477 /* A constrained auto. */
|
|
1478 c1 = PLACEHOLDER_TYPE_CONSTRAINTS (c1);
|
|
1479 if (c2 && TREE_CODE (c2) == TEMPLATE_TYPE_PARM)
|
|
1480 c2 = PLACEHOLDER_TYPE_CONSTRAINTS (c2);
|
|
1481
|
|
1482 if (c1 == c2)
|
|
1483 return true;
|
|
1484 if (!c1 || !c2)
|
|
1485 return false;
|
|
1486 if (c1 == error_mark_node || c2 == error_mark_node)
|
|
1487 /* We get here during satisfaction; when a deduction constraint
|
|
1488 fails, substitution can produce an error_mark_node for the
|
|
1489 placeholder constraints. */
|
|
1490 return false;
|
|
1491
|
|
1492 tree t1, t2, a1, a2;
|
|
1493 placeholder_extract_concept_and_args (c1, t1, a1);
|
|
1494 placeholder_extract_concept_and_args (c2, t2, a2);
|
|
1495
|
|
1496 if (t1 != t2)
|
|
1497 return false;
|
|
1498
|
|
1499 int len1 = TREE_VEC_LENGTH (a1);
|
|
1500 int len2 = TREE_VEC_LENGTH (a2);
|
|
1501 if (len1 != len2)
|
|
1502 return false;
|
|
1503
|
|
1504 /* Skip the first argument so we don't infinitely recurse.
|
|
1505 Also, they may differ in template parameter index. */
|
|
1506 for (int i = 1; i < len1; ++i)
|
|
1507 {
|
|
1508 tree t1 = TREE_VEC_ELT (a1, i);
|
|
1509 tree t2 = TREE_VEC_ELT (a2, i);
|
|
1510 if (!template_args_equal (t1, t2))
|
|
1511 return false;
|
|
1512 }
|
|
1513 return true;
|
|
1514 }
|
|
1515
|
|
1516 /* Return a hash value for the placeholder PRED_CONSTR C. */
|
|
1517
|
|
1518 hashval_t
|
|
1519 hash_placeholder_constraint (tree c)
|
|
1520 {
|
|
1521 tree t, a;
|
|
1522 placeholder_extract_concept_and_args (c, t, a);
|
|
1523
|
|
1524 /* Like hash_tmpl_and_args, but skip the first argument. */
|
|
1525 hashval_t val = iterative_hash_object (DECL_UID (t), 0);
|
|
1526
|
|
1527 for (int i = TREE_VEC_LENGTH (a)-1; i > 0; --i)
|
|
1528 val = iterative_hash_template_arg (TREE_VEC_ELT (a, i), val);
|
|
1529
|
|
1530 return val;
|
|
1531 }
|
|
1532
|
|
1533 /*---------------------------------------------------------------------------
|
|
1534 Constraint substitution
|
|
1535 ---------------------------------------------------------------------------*/
|
|
1536
|
|
1537 /* The following functions implement substitution rules for constraints.
|
|
1538 Substitution without checking constraints happens only in the
|
|
1539 instantiation of class templates. For example:
|
|
1540
|
|
1541 template<C1 T> struct S {
|
|
1542 void f(T) requires C2<T>;
|
|
1543 void g(T) requires T::value;
|
|
1544 };
|
|
1545
|
|
1546 S<int> s; // error instantiating S<int>::g(T)
|
|
1547
|
|
1548 When we instantiate S, we substitute into its member declarations,
|
|
1549 including their constraints. However, those constraints are not
|
|
1550 checked. Substituting int into C2<T> yields C2<int>, and substituting
|
|
1551 into T::value yields a substitution failure, making the program
|
|
1552 ill-formed.
|
|
1553
|
|
1554 Note that we only ever substitute into the associated constraints
|
|
1555 of a declaration. That is, substitution is defined only for predicate
|
|
1556 constraints and conjunctions. */
|
|
1557
|
|
1558 /* Substitute into the predicate constraints. Returns error_mark_node
|
|
1559 if the substitution into the expression fails. */
|
|
1560 tree
|
|
1561 tsubst_predicate_constraint (tree t, tree args,
|
|
1562 tsubst_flags_t complain, tree in_decl)
|
|
1563 {
|
|
1564 tree expr = PRED_CONSTR_EXPR (t);
|
|
1565 ++processing_template_decl;
|
|
1566 tree result = tsubst_expr (expr, args, complain, in_decl, false);
|
|
1567 --processing_template_decl;
|
|
1568 return build_nt (PRED_CONSTR, result);
|
|
1569 }
|
|
1570
|
|
1571 /* Substitute into a check constraint. */
|
|
1572
|
|
1573 tree
|
|
1574 tsubst_check_constraint (tree t, tree args,
|
|
1575 tsubst_flags_t complain, tree in_decl)
|
|
1576 {
|
|
1577 tree decl = CHECK_CONSTR_CONCEPT (t);
|
|
1578 tree tmpl = DECL_TI_TEMPLATE (decl);
|
|
1579 tree targs = CHECK_CONSTR_ARGS (t);
|
|
1580
|
|
1581 /* Substitute through by building an template-id expression
|
|
1582 and then substituting into that. */
|
|
1583 tree expr = build_nt (TEMPLATE_ID_EXPR, tmpl, targs);
|
|
1584 ++processing_template_decl;
|
|
1585 tree result = tsubst_expr (expr, args, complain, in_decl, false);
|
|
1586 --processing_template_decl;
|
|
1587
|
|
1588 if (result == error_mark_node)
|
|
1589 return error_mark_node;
|
|
1590
|
|
1591 /* Extract the results and rebuild the check constraint. */
|
|
1592 decl = DECL_TEMPLATE_RESULT (TREE_OPERAND (result, 0));
|
|
1593 args = TREE_OPERAND (result, 1);
|
|
1594
|
|
1595 return build_nt (CHECK_CONSTR, decl, args);
|
|
1596 }
|
|
1597
|
|
1598 /* Substitute into the conjunction of constraints. Returns
|
|
1599 error_mark_node if substitution into either operand fails. */
|
|
1600
|
|
1601 tree
|
|
1602 tsubst_logical_operator (tree t, tree args,
|
|
1603 tsubst_flags_t complain, tree in_decl)
|
|
1604 {
|
|
1605 tree t0 = TREE_OPERAND (t, 0);
|
|
1606 tree r0 = tsubst_constraint (t0, args, complain, in_decl);
|
|
1607 if (r0 == error_mark_node)
|
|
1608 return error_mark_node;
|
|
1609 tree t1 = TREE_OPERAND (t, 1);
|
|
1610 tree r1 = tsubst_constraint (t1, args, complain, in_decl);
|
|
1611 if (r1 == error_mark_node)
|
|
1612 return error_mark_node;
|
|
1613 return build_nt (TREE_CODE (t), r0, r1);
|
|
1614 }
|
|
1615
|
|
1616 namespace {
|
|
1617
|
|
1618 /* Substitute ARGS into the expression constraint T. */
|
|
1619
|
|
1620 tree
|
|
1621 tsubst_expr_constr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|
1622 {
|
|
1623 cp_unevaluated guard;
|
|
1624 tree expr = EXPR_CONSTR_EXPR (t);
|
|
1625 tree ret = tsubst_expr (expr, args, complain, in_decl, false);
|
|
1626 if (ret == error_mark_node)
|
|
1627 return error_mark_node;
|
|
1628 return build_nt (EXPR_CONSTR, ret);
|
|
1629 }
|
|
1630
|
|
1631 /* Substitute ARGS into the type constraint T. */
|
|
1632
|
|
1633 tree
|
|
1634 tsubst_type_constr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|
1635 {
|
|
1636 tree type = TYPE_CONSTR_TYPE (t);
|
|
1637 tree ret = tsubst (type, args, complain, in_decl);
|
|
1638 if (ret == error_mark_node)
|
|
1639 return error_mark_node;
|
|
1640 return build_nt (TYPE_CONSTR, ret);
|
|
1641 }
|
|
1642
|
|
1643 /* Substitute ARGS into the implicit conversion constraint T. */
|
|
1644
|
|
1645 tree
|
|
1646 tsubst_implicit_conversion_constr (tree t, tree args, tsubst_flags_t complain,
|
|
1647 tree in_decl)
|
|
1648 {
|
|
1649 cp_unevaluated guard;
|
|
1650 tree expr = ICONV_CONSTR_EXPR (t);
|
|
1651 tree type = ICONV_CONSTR_TYPE (t);
|
|
1652 tree new_expr = tsubst_expr (expr, args, complain, in_decl, false);
|
|
1653 if (new_expr == error_mark_node)
|
|
1654 return error_mark_node;
|
|
1655 tree new_type = tsubst (type, args, complain, in_decl);
|
|
1656 if (new_type == error_mark_node)
|
|
1657 return error_mark_node;
|
|
1658 return build_nt (ICONV_CONSTR, new_expr, new_type);
|
|
1659 }
|
|
1660
|
|
1661 /* Substitute ARGS into the argument deduction constraint T. */
|
|
1662
|
|
1663 tree
|
|
1664 tsubst_argument_deduction_constr (tree t, tree args, tsubst_flags_t complain,
|
|
1665 tree in_decl)
|
|
1666 {
|
|
1667 cp_unevaluated guard;
|
|
1668 tree expr = DEDUCT_CONSTR_EXPR (t);
|
|
1669 tree pattern = DEDUCT_CONSTR_PATTERN (t);
|
|
1670 tree autos = DEDUCT_CONSTR_PLACEHOLDER(t);
|
|
1671 tree new_expr = tsubst_expr (expr, args, complain, in_decl, false);
|
|
1672 if (new_expr == error_mark_node)
|
|
1673 return error_mark_node;
|
|
1674 /* It seems like substituting through the pattern will not affect the
|
|
1675 placeholders. We should (?) be able to reuse the existing list
|
|
1676 without any problems. If not, then we probably want to create a
|
|
1677 new list of placeholders and then instantiate the pattern using
|
|
1678 those. */
|
|
1679 tree new_pattern = tsubst (pattern, args, complain, in_decl);
|
|
1680 if (new_pattern == error_mark_node)
|
|
1681 return error_mark_node;
|
|
1682 return build_nt (DEDUCT_CONSTR, new_expr, new_pattern, autos);
|
|
1683 }
|
|
1684
|
|
1685 /* Substitute ARGS into the exception constraint T. */
|
|
1686
|
|
1687 tree
|
|
1688 tsubst_exception_constr (tree t, tree args, tsubst_flags_t complain,
|
|
1689 tree in_decl)
|
|
1690 {
|
|
1691 cp_unevaluated guard;
|
|
1692 tree expr = EXCEPT_CONSTR_EXPR (t);
|
|
1693 tree ret = tsubst_expr (expr, args, complain, in_decl, false);
|
|
1694 if (ret == error_mark_node)
|
|
1695 return error_mark_node;
|
|
1696 return build_nt (EXCEPT_CONSTR, ret);
|
|
1697 }
|
|
1698
|
|
1699 /* A subroutine of tsubst_constraint_variables. Register local
|
|
1700 specializations for each of parameter in PARMS and its
|
|
1701 corresponding substituted constraint variable in VARS.
|
|
1702 Returns VARS. */
|
|
1703
|
|
1704 tree
|
|
1705 declare_constraint_vars (tree parms, tree vars)
|
|
1706 {
|
|
1707 tree s = vars;
|
|
1708 for (tree t = parms; t; t = DECL_CHAIN (t))
|
|
1709 {
|
|
1710 if (DECL_PACK_P (t))
|
|
1711 {
|
|
1712 tree pack = extract_fnparm_pack (t, &s);
|
|
1713 register_local_specialization (pack, t);
|
|
1714 }
|
|
1715 else
|
|
1716 {
|
|
1717 register_local_specialization (s, t);
|
|
1718 s = DECL_CHAIN (s);
|
|
1719 }
|
|
1720 }
|
|
1721 return vars;
|
|
1722 }
|
|
1723
|
|
1724 /* A subroutine of tsubst_parameterized_constraint. Substitute ARGS
|
|
1725 into the parameter list T, producing a sequence of constraint
|
|
1726 variables, declared in the current scope.
|
|
1727
|
|
1728 Note that the caller must establish a local specialization stack
|
|
1729 prior to calling this function since this substitution will
|
|
1730 declare the substituted parameters. */
|
|
1731
|
|
1732 tree
|
|
1733 tsubst_constraint_variables (tree t, tree args,
|
|
1734 tsubst_flags_t complain, tree in_decl)
|
|
1735 {
|
|
1736 /* Clear cp_unevaluated_operand across tsubst so that we get a proper chain
|
|
1737 of PARM_DECLs. */
|
|
1738 int saved_unevaluated_operand = cp_unevaluated_operand;
|
|
1739 cp_unevaluated_operand = 0;
|
|
1740 tree vars = tsubst (t, args, complain, in_decl);
|
|
1741 cp_unevaluated_operand = saved_unevaluated_operand;
|
|
1742 if (vars == error_mark_node)
|
|
1743 return error_mark_node;
|
|
1744 return declare_constraint_vars (t, vars);
|
|
1745 }
|
|
1746
|
|
1747 /* Substitute ARGS into the parameterized constraint T. */
|
|
1748
|
|
1749 tree
|
|
1750 tsubst_parameterized_constraint (tree t, tree args,
|
|
1751 tsubst_flags_t complain, tree in_decl)
|
|
1752 {
|
|
1753 local_specialization_stack stack;
|
|
1754 tree vars = tsubst_constraint_variables (PARM_CONSTR_PARMS (t),
|
|
1755 args, complain, in_decl);
|
|
1756 if (vars == error_mark_node)
|
|
1757 return error_mark_node;
|
|
1758 tree expr = tsubst_constraint (PARM_CONSTR_OPERAND (t), args,
|
|
1759 complain, in_decl);
|
|
1760 if (expr == error_mark_node)
|
|
1761 return error_mark_node;
|
|
1762 return build_nt (PARM_CONSTR, vars, expr);
|
|
1763 }
|
|
1764
|
|
1765 /* Substitute ARGS into the simple requirement T. Note that
|
|
1766 substitution may result in an ill-formed expression without
|
|
1767 causing the program to be ill-formed. In such cases, the
|
|
1768 requirement wraps an error_mark_node. */
|
|
1769
|
|
1770 inline tree
|
|
1771 tsubst_simple_requirement (tree t, tree args,
|
|
1772 tsubst_flags_t complain, tree in_decl)
|
|
1773 {
|
|
1774 ++processing_template_decl;
|
|
1775 tree expr = tsubst_expr (TREE_OPERAND (t, 0), args, complain, in_decl, false);
|
|
1776 --processing_template_decl;
|
|
1777 return finish_simple_requirement (expr);
|
|
1778 }
|
|
1779
|
|
1780 /* Substitute ARGS into the type requirement T. Note that
|
|
1781 substitution may result in an ill-formed type without
|
|
1782 causing the program to be ill-formed. In such cases, the
|
|
1783 requirement wraps an error_mark_node. */
|
|
1784
|
|
1785 inline tree
|
|
1786 tsubst_type_requirement (tree t, tree args,
|
|
1787 tsubst_flags_t complain, tree in_decl)
|
|
1788 {
|
|
1789 ++processing_template_decl;
|
|
1790 tree type = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
|
|
1791 --processing_template_decl;
|
|
1792 return finish_type_requirement (type);
|
|
1793 }
|
|
1794
|
|
1795 /* Substitute args into the compound requirement T. If substituting
|
|
1796 into either the expression or the type fails, the corresponding
|
|
1797 operands in the resulting node will be error_mark_node. This
|
|
1798 preserves a requirement for the purpose of partial ordering, but
|
|
1799 it will never be satisfied. */
|
|
1800
|
|
1801 tree
|
|
1802 tsubst_compound_requirement (tree t, tree args,
|
|
1803 tsubst_flags_t complain, tree in_decl)
|
|
1804 {
|
|
1805 ++processing_template_decl;
|
|
1806 tree expr = tsubst_expr (TREE_OPERAND (t, 0), args, complain, in_decl, false);
|
|
1807 tree type = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl);
|
|
1808 --processing_template_decl;
|
|
1809 bool noexcept_p = COMPOUND_REQ_NOEXCEPT_P (t);
|
|
1810 return finish_compound_requirement (expr, type, noexcept_p);
|
|
1811 }
|
|
1812
|
|
1813 /* Substitute ARGS into the nested requirement T. */
|
|
1814
|
|
1815 tree
|
|
1816 tsubst_nested_requirement (tree t, tree args,
|
|
1817 tsubst_flags_t complain, tree in_decl)
|
|
1818 {
|
|
1819 ++processing_template_decl;
|
|
1820 tree expr = tsubst_expr (TREE_OPERAND (t, 0), args, complain, in_decl, false);
|
|
1821 --processing_template_decl;
|
|
1822 return finish_nested_requirement (expr);
|
|
1823 }
|
|
1824
|
|
1825 /* Substitute ARGS into the requirement T. */
|
|
1826
|
|
1827 inline tree
|
|
1828 tsubst_requirement (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|
1829 {
|
|
1830 switch (TREE_CODE (t))
|
|
1831 {
|
|
1832 case SIMPLE_REQ:
|
|
1833 return tsubst_simple_requirement (t, args, complain, in_decl);
|
|
1834 case TYPE_REQ:
|
|
1835 return tsubst_type_requirement (t, args, complain, in_decl);
|
|
1836 case COMPOUND_REQ:
|
|
1837 return tsubst_compound_requirement (t, args, complain, in_decl);
|
|
1838 case NESTED_REQ:
|
|
1839 return tsubst_nested_requirement (t, args, complain, in_decl);
|
|
1840 default:
|
|
1841 gcc_unreachable ();
|
|
1842 }
|
|
1843 return error_mark_node;
|
|
1844 }
|
|
1845
|
|
1846 /* Substitute ARGS into the list of requirements T. Note that
|
|
1847 substitution failures here result in ill-formed programs. */
|
|
1848
|
|
1849 tree
|
|
1850 tsubst_requirement_body (tree t, tree args,
|
|
1851 tsubst_flags_t complain, tree in_decl)
|
|
1852 {
|
|
1853 tree r = NULL_TREE;
|
|
1854 while (t)
|
|
1855 {
|
|
1856 tree e = tsubst_requirement (TREE_VALUE (t), args, complain, in_decl);
|
|
1857 if (e == error_mark_node)
|
|
1858 return error_mark_node;
|
|
1859 r = tree_cons (NULL_TREE, e, r);
|
|
1860 t = TREE_CHAIN (t);
|
|
1861 }
|
|
1862 /* Ensure that the order of constraints is the same as the original. */
|
|
1863 return nreverse (r);
|
|
1864 }
|
|
1865
|
|
1866 } /* namespace */
|
|
1867
|
|
1868 /* Substitute ARGS into the requires expression T. Note that this
|
|
1869 results in the re-declaration of local parameters when
|
|
1870 substituting through the parameter list. If either substitution
|
|
1871 fails, the program is ill-formed. */
|
|
1872
|
|
1873 tree
|
|
1874 tsubst_requires_expr (tree t, tree args,
|
|
1875 tsubst_flags_t complain, tree in_decl)
|
|
1876 {
|
|
1877 local_specialization_stack stack;
|
|
1878
|
|
1879 tree parms = TREE_OPERAND (t, 0);
|
|
1880 if (parms)
|
|
1881 {
|
|
1882 parms = tsubst_constraint_variables (parms, args, complain, in_decl);
|
|
1883 if (parms == error_mark_node)
|
|
1884 return error_mark_node;
|
|
1885 }
|
|
1886
|
|
1887 tree reqs = TREE_OPERAND (t, 1);
|
|
1888 reqs = tsubst_requirement_body (reqs, args, complain, in_decl);
|
|
1889 if (reqs == error_mark_node)
|
|
1890 return error_mark_node;
|
|
1891
|
|
1892 return finish_requires_expr (parms, reqs);
|
|
1893 }
|
|
1894
|
|
1895 /* Substitute ARGS into the constraint information CI, producing a new
|
|
1896 constraint record. */
|
|
1897
|
|
1898 tree
|
|
1899 tsubst_constraint_info (tree t, tree args,
|
|
1900 tsubst_flags_t complain, tree in_decl)
|
|
1901 {
|
|
1902 if (!t || t == error_mark_node || !check_constraint_info (t))
|
|
1903 return NULL_TREE;
|
|
1904
|
|
1905 tree tmpl_constr = NULL_TREE;
|
|
1906 if (tree r = CI_TEMPLATE_REQS (t))
|
|
1907 tmpl_constr = tsubst_constraint (r, args, complain, in_decl);
|
|
1908
|
|
1909 tree decl_constr = NULL_TREE;
|
|
1910 if (tree r = CI_DECLARATOR_REQS (t))
|
|
1911 decl_constr = tsubst_constraint (r, args, complain, in_decl);
|
|
1912
|
|
1913 return build_constraints (tmpl_constr, decl_constr);
|
|
1914 }
|
|
1915
|
|
1916 /* Substitute ARGS into the constraint T. */
|
|
1917
|
|
1918 tree
|
|
1919 tsubst_constraint (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|
1920 {
|
|
1921 if (t == NULL_TREE)
|
|
1922 return t;
|
|
1923 switch (TREE_CODE (t))
|
|
1924 {
|
|
1925 case PRED_CONSTR:
|
|
1926 return tsubst_predicate_constraint (t, args, complain, in_decl);
|
|
1927 case CHECK_CONSTR:
|
|
1928 return tsubst_check_constraint (t, args, complain, in_decl);
|
|
1929 case CONJ_CONSTR:
|
|
1930 case DISJ_CONSTR:
|
|
1931 return tsubst_logical_operator (t, args, complain, in_decl);
|
|
1932 case PARM_CONSTR:
|
|
1933 return tsubst_parameterized_constraint (t, args, complain, in_decl);
|
|
1934 case EXPR_CONSTR:
|
|
1935 return tsubst_expr_constr (t, args, complain, in_decl);
|
|
1936 case TYPE_CONSTR:
|
|
1937 return tsubst_type_constr (t, args, complain, in_decl);
|
|
1938 case ICONV_CONSTR:
|
|
1939 return tsubst_implicit_conversion_constr (t, args, complain, in_decl);
|
|
1940 case DEDUCT_CONSTR:
|
|
1941 return tsubst_argument_deduction_constr (t, args, complain, in_decl);
|
|
1942 case EXCEPT_CONSTR:
|
|
1943 return tsubst_exception_constr (t, args, complain, in_decl);
|
|
1944 default:
|
|
1945 gcc_unreachable ();
|
|
1946 }
|
|
1947 return error_mark_node;
|
|
1948 }
|
|
1949
|
|
1950 /*---------------------------------------------------------------------------
|
|
1951 Constraint satisfaction
|
|
1952 ---------------------------------------------------------------------------*/
|
|
1953
|
|
1954 /* The following functions determine if a constraint, when
|
|
1955 substituting template arguments, is satisfied. For convenience,
|
|
1956 satisfaction reduces a constraint to either true or false (and
|
|
1957 nothing else). */
|
|
1958
|
|
1959 namespace {
|
|
1960
|
|
1961 tree satisfy_constraint_1 (tree, tree, tsubst_flags_t, tree);
|
|
1962
|
|
1963 /* Check the constraint pack expansion. */
|
|
1964
|
|
1965 tree
|
|
1966 satisfy_pack_expansion (tree t, tree args,
|
|
1967 tsubst_flags_t complain, tree in_decl)
|
|
1968 {
|
|
1969 /* Get the vector of satisfaction results.
|
|
1970 gen_elem_of_pack_expansion_instantiation will check that each element of
|
|
1971 the expansion is satisfied. */
|
|
1972 tree exprs = tsubst_pack_expansion (t, args, complain, in_decl);
|
|
1973
|
|
1974 if (exprs == error_mark_node)
|
|
1975 return boolean_false_node;
|
|
1976
|
|
1977 /* TODO: It might be better to normalize each expanded term
|
|
1978 and evaluate them separately. That would provide better
|
|
1979 opportunities for diagnostics. */
|
|
1980 for (int i = 0; i < TREE_VEC_LENGTH (exprs); ++i)
|
|
1981 if (TREE_VEC_ELT (exprs, i) != boolean_true_node)
|
|
1982 return boolean_false_node;
|
|
1983 return boolean_true_node;
|
|
1984 }
|
|
1985
|
|
1986 /* A predicate constraint is satisfied if its expression evaluates
|
|
1987 to true. If substitution into that node fails, the constraint
|
|
1988 is not satisfied ([temp.constr.pred]).
|
|
1989
|
|
1990 Note that a predicate constraint is a constraint expression
|
|
1991 of type bool. If neither of those are true, the program is
|
|
1992 ill-formed; they are not SFINAE'able errors. */
|
|
1993
|
|
1994 tree
|
|
1995 satisfy_predicate_constraint (tree t, tree args,
|
|
1996 tsubst_flags_t complain, tree in_decl)
|
|
1997 {
|
|
1998 tree expr = TREE_OPERAND (t, 0);
|
|
1999
|
|
2000 /* We should never have a naked pack expansion in a predicate constraint. */
|
|
2001 gcc_assert (TREE_CODE (expr) != EXPR_PACK_EXPANSION);
|
|
2002
|
|
2003 /* If substitution into the expression fails, the constraint
|
|
2004 is not satisfied. */
|
|
2005 expr = tsubst_expr (expr, args, complain, in_decl, false);
|
|
2006 if (expr == error_mark_node)
|
|
2007 return boolean_false_node;
|
|
2008
|
|
2009 /* A predicate constraint shall have type bool. In some
|
|
2010 cases, substitution gives us const-qualified bool, which
|
|
2011 is also acceptable. */
|
|
2012 tree type = cv_unqualified (TREE_TYPE (expr));
|
|
2013 if (!same_type_p (type, boolean_type_node))
|
|
2014 {
|
|
2015 error_at (EXPR_LOC_OR_LOC (expr, input_location),
|
|
2016 "constraint %qE does not have type %qT",
|
|
2017 expr, boolean_type_node);
|
|
2018 return boolean_false_node;
|
|
2019 }
|
|
2020
|
|
2021 return cxx_constant_value (expr);
|
|
2022 }
|
|
2023
|
|
2024 /* A concept check constraint like C<CARGS> is satisfied if substituting ARGS
|
|
2025 into CARGS succeeds and C is satisfied for the resulting arguments. */
|
|
2026
|
|
2027 tree
|
|
2028 satisfy_check_constraint (tree t, tree args,
|
|
2029 tsubst_flags_t complain, tree in_decl)
|
|
2030 {
|
|
2031 tree decl = CHECK_CONSTR_CONCEPT (t);
|
|
2032 tree tmpl = DECL_TI_TEMPLATE (decl);
|
|
2033 tree cargs = CHECK_CONSTR_ARGS (t);
|
|
2034
|
|
2035 /* Instantiate the concept check arguments. */
|
|
2036 tree targs = tsubst (cargs, args, tf_none, NULL_TREE);
|
|
2037 if (targs == error_mark_node)
|
|
2038 return boolean_false_node;
|
|
2039
|
|
2040 /* Search for a previous value. */
|
|
2041 if (tree prev = lookup_concept_satisfaction (tmpl, targs))
|
|
2042 return prev;
|
|
2043
|
|
2044 /* Expand the concept; failure here implies non-satisfaction. */
|
|
2045 tree def = expand_concept (decl, targs);
|
|
2046 if (def == error_mark_node)
|
|
2047 return memoize_concept_satisfaction (tmpl, args, boolean_false_node);
|
|
2048
|
|
2049 /* Recursively satisfy the constraint. */
|
|
2050 tree result = satisfy_constraint_1 (def, targs, complain, in_decl);
|
|
2051 return memoize_concept_satisfaction (tmpl, targs, result);
|
|
2052 }
|
|
2053
|
|
2054 /* Check an expression constraint. The constraint is satisfied if
|
|
2055 substitution succeeds ([temp.constr.expr]).
|
|
2056
|
|
2057 Note that the expression is unevaluated. */
|
|
2058
|
|
2059 tree
|
|
2060 satisfy_expression_constraint (tree t, tree args,
|
|
2061 tsubst_flags_t complain, tree in_decl)
|
|
2062 {
|
|
2063 cp_unevaluated guard;
|
|
2064 deferring_access_check_sentinel deferring;
|
|
2065
|
|
2066 tree expr = EXPR_CONSTR_EXPR (t);
|
|
2067 tree check = tsubst_expr (expr, args, complain, in_decl, false);
|
|
2068 if (check == error_mark_node)
|
|
2069 return boolean_false_node;
|
|
2070 if (!perform_deferred_access_checks (tf_none))
|
|
2071 return boolean_false_node;
|
|
2072 return boolean_true_node;
|
|
2073 }
|
|
2074
|
|
2075 /* Check a type constraint. The constraint is satisfied if
|
|
2076 substitution succeeds. */
|
|
2077
|
|
2078 inline tree
|
|
2079 satisfy_type_constraint (tree t, tree args,
|
|
2080 tsubst_flags_t complain, tree in_decl)
|
|
2081 {
|
|
2082 deferring_access_check_sentinel deferring;
|
|
2083 tree type = TYPE_CONSTR_TYPE (t);
|
|
2084 gcc_assert (TYPE_P (type) || type == error_mark_node);
|
|
2085 tree check = tsubst (type, args, complain, in_decl);
|
|
2086 if (error_operand_p (check))
|
|
2087 return boolean_false_node;
|
|
2088 if (!perform_deferred_access_checks (complain))
|
|
2089 return boolean_false_node;
|
|
2090 return boolean_true_node;
|
|
2091 }
|
|
2092
|
|
2093 /* Check an implicit conversion constraint. */
|
|
2094
|
|
2095 tree
|
|
2096 satisfy_implicit_conversion_constraint (tree t, tree args,
|
|
2097 tsubst_flags_t complain, tree in_decl)
|
|
2098 {
|
|
2099 /* Don't tsubst as if we're processing a template. If we try
|
|
2100 to we can end up generating template-like expressions
|
|
2101 (e.g., modop-exprs) that aren't properly typed. */
|
|
2102 tree expr =
|
|
2103 tsubst_expr (ICONV_CONSTR_EXPR (t), args, complain, in_decl, false);
|
|
2104 if (expr == error_mark_node)
|
|
2105 return boolean_false_node;
|
|
2106
|
|
2107 /* Get the transformed target type. */
|
|
2108 tree type = tsubst (ICONV_CONSTR_TYPE (t), args, complain, in_decl);
|
|
2109 if (type == error_mark_node)
|
|
2110 return boolean_false_node;
|
|
2111
|
|
2112 /* Attempt the conversion as a direct initialization
|
|
2113 of the form TYPE <unspecified> = EXPR. */
|
|
2114 tree conv =
|
|
2115 perform_direct_initialization_if_possible (type, expr, false, complain);
|
|
2116 if (conv == NULL_TREE || conv == error_mark_node)
|
|
2117 return boolean_false_node;
|
|
2118 else
|
|
2119 return boolean_true_node;
|
|
2120 }
|
|
2121
|
|
2122 /* Check an argument deduction constraint. */
|
|
2123
|
|
2124 tree
|
|
2125 satisfy_argument_deduction_constraint (tree t, tree args,
|
|
2126 tsubst_flags_t complain, tree in_decl)
|
|
2127 {
|
|
2128 /* Substitute through the expression. */
|
|
2129 tree expr = DEDUCT_CONSTR_EXPR (t);
|
|
2130 tree init = tsubst_expr (expr, args, complain, in_decl, false);
|
|
2131 if (expr == error_mark_node)
|
|
2132 return boolean_false_node;
|
|
2133
|
|
2134 /* Perform auto or decltype(auto) deduction to get the result. */
|
|
2135 tree pattern = DEDUCT_CONSTR_PATTERN (t);
|
|
2136 tree placeholder = DEDUCT_CONSTR_PLACEHOLDER (t);
|
|
2137 tree constr = PLACEHOLDER_TYPE_CONSTRAINTS (placeholder);
|
|
2138 tree type_canonical = TYPE_CANONICAL (placeholder);
|
|
2139 PLACEHOLDER_TYPE_CONSTRAINTS (placeholder)
|
|
2140 = tsubst_constraint (constr, args, complain|tf_partial, in_decl);
|
|
2141 TYPE_CANONICAL (placeholder) = NULL_TREE;
|
|
2142 tree type = do_auto_deduction (pattern, init, placeholder,
|
|
2143 complain, adc_requirement);
|
|
2144 PLACEHOLDER_TYPE_CONSTRAINTS (placeholder) = constr;
|
|
2145 TYPE_CANONICAL (placeholder) = type_canonical;
|
|
2146 if (type == error_mark_node)
|
|
2147 return boolean_false_node;
|
|
2148
|
|
2149 return boolean_true_node;
|
|
2150 }
|
|
2151
|
|
2152 /* Check an exception constraint. An exception constraint for an
|
|
2153 expression e is satisfied when noexcept(e) is true. */
|
|
2154
|
|
2155 tree
|
|
2156 satisfy_exception_constraint (tree t, tree args,
|
|
2157 tsubst_flags_t complain, tree in_decl)
|
|
2158 {
|
|
2159 tree expr = EXCEPT_CONSTR_EXPR (t);
|
|
2160 tree check = tsubst_expr (expr, args, complain, in_decl, false);
|
|
2161 if (check == error_mark_node)
|
|
2162 return boolean_false_node;
|
|
2163
|
|
2164 if (expr_noexcept_p (check, complain))
|
|
2165 return boolean_true_node;
|
|
2166 else
|
|
2167 return boolean_false_node;
|
|
2168 }
|
|
2169
|
|
2170 /* Check a parameterized constraint. */
|
|
2171
|
|
2172 tree
|
|
2173 satisfy_parameterized_constraint (tree t, tree args,
|
|
2174 tsubst_flags_t complain, tree in_decl)
|
|
2175 {
|
|
2176 local_specialization_stack stack;
|
|
2177 tree parms = PARM_CONSTR_PARMS (t);
|
|
2178 tree vars = tsubst_constraint_variables (parms, args, complain, in_decl);
|
|
2179 if (vars == error_mark_node)
|
|
2180 return boolean_false_node;
|
|
2181 tree constr = PARM_CONSTR_OPERAND (t);
|
|
2182 return satisfy_constraint_1 (constr, args, complain, in_decl);
|
|
2183 }
|
|
2184
|
|
2185 /* Check that the conjunction of constraints is satisfied. Note
|
|
2186 that if left operand is not satisfied, the right operand
|
|
2187 is not checked.
|
|
2188
|
|
2189 FIXME: Check that this wouldn't result in a user-defined
|
|
2190 operator. Note that this error is partially diagnosed in
|
|
2191 satisfy_predicate_constraint. It would be nice to diagnose
|
|
2192 the overload, but I don't think it's strictly necessary. */
|
|
2193
|
|
2194 tree
|
|
2195 satisfy_conjunction (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|
2196 {
|
|
2197 tree t0 = satisfy_constraint_1 (TREE_OPERAND (t, 0), args, complain, in_decl);
|
|
2198 if (t0 == boolean_false_node)
|
|
2199 return boolean_false_node;
|
|
2200 return satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
|
|
2201 }
|
|
2202
|
|
2203 /* Check that the disjunction of constraints is satisfied. Note
|
|
2204 that if the left operand is satisfied, the right operand is not
|
|
2205 checked. */
|
|
2206
|
|
2207 tree
|
|
2208 satisfy_disjunction (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|
2209 {
|
|
2210 tree t0 = satisfy_constraint_1 (TREE_OPERAND (t, 0), args, complain, in_decl);
|
|
2211 if (t0 == boolean_true_node)
|
|
2212 return boolean_true_node;
|
|
2213 return satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
|
|
2214 }
|
|
2215
|
|
2216 /* Dispatch to an appropriate satisfaction routine depending on the
|
|
2217 tree code of T. */
|
|
2218
|
|
2219 tree
|
|
2220 satisfy_constraint_1 (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|
2221 {
|
|
2222 gcc_assert (!processing_template_decl);
|
|
2223
|
|
2224 if (!t)
|
|
2225 return boolean_false_node;
|
|
2226
|
|
2227 if (t == error_mark_node)
|
|
2228 return boolean_false_node;
|
|
2229
|
|
2230 switch (TREE_CODE (t))
|
|
2231 {
|
|
2232 case PRED_CONSTR:
|
|
2233 return satisfy_predicate_constraint (t, args, complain, in_decl);
|
|
2234
|
|
2235 case CHECK_CONSTR:
|
|
2236 return satisfy_check_constraint (t, args, complain, in_decl);
|
|
2237
|
|
2238 case EXPR_CONSTR:
|
|
2239 return satisfy_expression_constraint (t, args, complain, in_decl);
|
|
2240
|
|
2241 case TYPE_CONSTR:
|
|
2242 return satisfy_type_constraint (t, args, complain, in_decl);
|
|
2243
|
|
2244 case ICONV_CONSTR:
|
|
2245 return satisfy_implicit_conversion_constraint (t, args, complain, in_decl);
|
|
2246
|
|
2247 case DEDUCT_CONSTR:
|
|
2248 return satisfy_argument_deduction_constraint (t, args, complain, in_decl);
|
|
2249
|
|
2250 case EXCEPT_CONSTR:
|
|
2251 return satisfy_exception_constraint (t, args, complain, in_decl);
|
|
2252
|
|
2253 case PARM_CONSTR:
|
|
2254 return satisfy_parameterized_constraint (t, args, complain, in_decl);
|
|
2255
|
|
2256 case CONJ_CONSTR:
|
|
2257 return satisfy_conjunction (t, args, complain, in_decl);
|
|
2258
|
|
2259 case DISJ_CONSTR:
|
|
2260 return satisfy_disjunction (t, args, complain, in_decl);
|
|
2261
|
|
2262 case EXPR_PACK_EXPANSION:
|
|
2263 return satisfy_pack_expansion (t, args, complain, in_decl);
|
|
2264
|
|
2265 default:
|
|
2266 gcc_unreachable ();
|
|
2267 }
|
|
2268 return boolean_false_node;
|
|
2269 }
|
|
2270
|
|
2271 /* Check that the constraint is satisfied, according to the rules
|
|
2272 for that constraint. Note that each satisfy_* function returns
|
|
2273 true or false, depending on whether it is satisfied or not. */
|
|
2274
|
|
2275 tree
|
|
2276 satisfy_constraint (tree t, tree args)
|
|
2277 {
|
|
2278 auto_timevar time (TV_CONSTRAINT_SAT);
|
|
2279
|
|
2280 /* Turn off template processing. Constraint satisfaction only applies
|
|
2281 to non-dependent terms, so we want to ensure full checking here. */
|
|
2282 processing_template_decl_sentinel proc (true);
|
|
2283
|
|
2284 /* Avoid early exit in tsubst and tsubst_copy from null args; since earlier
|
|
2285 substitution was done with processing_template_decl forced on, there will
|
|
2286 be expressions that still need semantic processing, possibly buried in
|
|
2287 decltype or a template argument. */
|
|
2288 if (args == NULL_TREE)
|
|
2289 args = make_tree_vec (1);
|
|
2290
|
|
2291 return satisfy_constraint_1 (t, args, tf_none, NULL_TREE);
|
|
2292 }
|
|
2293
|
|
2294 /* Check the associated constraints in CI against the given
|
|
2295 ARGS, returning true when the constraints are satisfied
|
|
2296 and false otherwise. */
|
|
2297
|
|
2298 tree
|
|
2299 satisfy_associated_constraints (tree ci, tree args)
|
|
2300 {
|
|
2301 /* If there are no constraints then this is trivially satisfied. */
|
|
2302 if (!ci)
|
|
2303 return boolean_true_node;
|
|
2304
|
|
2305 /* If any arguments depend on template parameters, we can't
|
|
2306 check constraints. */
|
|
2307 if (args && uses_template_parms (args))
|
|
2308 return boolean_true_node;
|
|
2309
|
|
2310 /* Check if we've seen a previous result. */
|
|
2311 if (tree prev = lookup_constraint_satisfaction (ci, args))
|
|
2312 return prev;
|
|
2313
|
|
2314 /* Actually test for satisfaction. */
|
|
2315 tree result = satisfy_constraint (CI_ASSOCIATED_CONSTRAINTS (ci), args);
|
|
2316 return memoize_constraint_satisfaction (ci, args, result);
|
|
2317 }
|
|
2318
|
|
2319 } /* namespace */
|
|
2320
|
|
2321 /* Evaluate the given constraint, returning boolean_true_node
|
|
2322 if the constraint is satisfied and boolean_false_node
|
|
2323 otherwise. */
|
|
2324
|
|
2325 tree
|
|
2326 evaluate_constraints (tree constr, tree args)
|
|
2327 {
|
|
2328 gcc_assert (constraint_p (constr));
|
|
2329 return satisfy_constraint (constr, args);
|
|
2330 }
|
|
2331
|
|
2332 /* Evaluate the function concept FN by substituting its own args
|
|
2333 into its definition and evaluating that as the result. Returns
|
|
2334 boolean_true_node if the constraints are satisfied and
|
|
2335 boolean_false_node otherwise. */
|
|
2336
|
|
2337 tree
|
|
2338 evaluate_function_concept (tree fn, tree args)
|
|
2339 {
|
|
2340 tree constr = build_nt (CHECK_CONSTR, fn, args);
|
|
2341 return satisfy_constraint (constr, args);
|
|
2342 }
|
|
2343
|
|
2344 /* Evaluate the variable concept VAR by substituting its own args into
|
|
2345 its initializer and checking the resulting constraint. Returns
|
|
2346 boolean_true_node if the constraints are satisfied and
|
|
2347 boolean_false_node otherwise. */
|
|
2348
|
|
2349 tree
|
|
2350 evaluate_variable_concept (tree var, tree args)
|
|
2351 {
|
|
2352 tree constr = build_nt (CHECK_CONSTR, var, args);
|
|
2353 return satisfy_constraint (constr, args);
|
|
2354 }
|
|
2355
|
|
2356 /* Evaluate the given expression as if it were a predicate
|
|
2357 constraint. Returns boolean_true_node if the constraint
|
|
2358 is satisfied and boolean_false_node otherwise. */
|
|
2359
|
|
2360 tree
|
|
2361 evaluate_constraint_expression (tree expr, tree args)
|
|
2362 {
|
|
2363 tree constr = normalize_expression (expr);
|
|
2364 return satisfy_constraint (constr, args);
|
|
2365 }
|
|
2366
|
|
2367 /* Returns true if the DECL's constraints are satisfied.
|
|
2368 This is used in cases where a declaration is formed but
|
|
2369 before it is used (e.g., overload resolution). */
|
|
2370
|
|
2371 bool
|
|
2372 constraints_satisfied_p (tree decl)
|
|
2373 {
|
|
2374 /* Get the constraints to check for satisfaction. This depends
|
|
2375 on whether we're looking at a template specialization or not. */
|
|
2376 tree ci;
|
|
2377 tree args = NULL_TREE;
|
|
2378 if (tree ti = DECL_TEMPLATE_INFO (decl))
|
|
2379 {
|
|
2380 tree tmpl = TI_TEMPLATE (ti);
|
|
2381 ci = get_constraints (tmpl);
|
|
2382 int depth = TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl));
|
|
2383 args = get_innermost_template_args (TI_ARGS (ti), depth);
|
|
2384 }
|
|
2385 else
|
|
2386 {
|
|
2387 ci = get_constraints (decl);
|
|
2388 }
|
|
2389
|
|
2390 tree eval = satisfy_associated_constraints (ci, args);
|
|
2391 return eval == boolean_true_node;
|
|
2392 }
|
|
2393
|
|
2394 /* Returns true if the constraints are satisfied by ARGS.
|
|
2395 Here, T can be either a constraint or a constrained
|
|
2396 declaration. */
|
|
2397
|
|
2398 bool
|
|
2399 constraints_satisfied_p (tree t, tree args)
|
|
2400 {
|
|
2401 tree eval;
|
|
2402 if (constraint_p (t))
|
|
2403 eval = evaluate_constraints (t, args);
|
|
2404 else
|
|
2405 eval = satisfy_associated_constraints (get_constraints (t), args);
|
|
2406 return eval == boolean_true_node;
|
|
2407 }
|
|
2408
|
|
2409 namespace
|
|
2410 {
|
|
2411
|
|
2412 /* Normalize EXPR and determine if the resulting constraint is
|
|
2413 satisfied by ARGS. Returns true if and only if the constraint
|
|
2414 is satisfied. This is used extensively by diagnostics to
|
|
2415 determine causes for failure. */
|
|
2416
|
|
2417 inline bool
|
|
2418 constraint_expression_satisfied_p (tree expr, tree args)
|
|
2419 {
|
|
2420 return evaluate_constraint_expression (expr, args) == boolean_true_node;
|
|
2421 }
|
|
2422
|
|
2423 } /* namespace */
|
|
2424
|
|
2425 /*---------------------------------------------------------------------------
|
|
2426 Semantic analysis of requires-expressions
|
|
2427 ---------------------------------------------------------------------------*/
|
|
2428
|
|
2429 /* Finish a requires expression for the given PARMS (possibly
|
|
2430 null) and the non-empty sequence of requirements. */
|
|
2431 tree
|
|
2432 finish_requires_expr (tree parms, tree reqs)
|
|
2433 {
|
|
2434 /* Modify the declared parameters by removing their context
|
|
2435 so they don't refer to the enclosing scope and explicitly
|
|
2436 indicating that they are constraint variables. */
|
|
2437 for (tree parm = parms; parm; parm = DECL_CHAIN (parm))
|
|
2438 {
|
|
2439 DECL_CONTEXT (parm) = NULL_TREE;
|
|
2440 CONSTRAINT_VAR_P (parm) = true;
|
|
2441 }
|
|
2442
|
|
2443 /* Build the node. */
|
|
2444 tree r = build_min (REQUIRES_EXPR, boolean_type_node, parms, reqs);
|
|
2445 TREE_SIDE_EFFECTS (r) = false;
|
|
2446 TREE_CONSTANT (r) = true;
|
|
2447 return r;
|
|
2448 }
|
|
2449
|
|
2450 /* Construct a requirement for the validity of EXPR. */
|
|
2451 tree
|
|
2452 finish_simple_requirement (tree expr)
|
|
2453 {
|
|
2454 return build_nt (SIMPLE_REQ, expr);
|
|
2455 }
|
|
2456
|
|
2457 /* Construct a requirement for the validity of TYPE. */
|
|
2458 tree
|
|
2459 finish_type_requirement (tree type)
|
|
2460 {
|
|
2461 return build_nt (TYPE_REQ, type);
|
|
2462 }
|
|
2463
|
|
2464 /* Construct a requirement for the validity of EXPR, along with
|
|
2465 its properties. if TYPE is non-null, then it specifies either
|
|
2466 an implicit conversion or argument deduction constraint,
|
|
2467 depending on whether any placeholders occur in the type name.
|
|
2468 NOEXCEPT_P is true iff the noexcept keyword was specified. */
|
|
2469 tree
|
|
2470 finish_compound_requirement (tree expr, tree type, bool noexcept_p)
|
|
2471 {
|
|
2472 tree req = build_nt (COMPOUND_REQ, expr, type);
|
|
2473 COMPOUND_REQ_NOEXCEPT_P (req) = noexcept_p;
|
|
2474 return req;
|
|
2475 }
|
|
2476
|
|
2477 /* Finish a nested requirement. */
|
|
2478 tree
|
|
2479 finish_nested_requirement (tree expr)
|
|
2480 {
|
|
2481 return build_nt (NESTED_REQ, expr);
|
|
2482 }
|
|
2483
|
|
2484 // Check that FN satisfies the structural requirements of a
|
|
2485 // function concept definition.
|
|
2486 tree
|
|
2487 check_function_concept (tree fn)
|
|
2488 {
|
|
2489 // Check that the function is comprised of only a single
|
|
2490 // return statement.
|
|
2491 tree body = DECL_SAVED_TREE (fn);
|
|
2492 if (TREE_CODE (body) == BIND_EXPR)
|
|
2493 body = BIND_EXPR_BODY (body);
|
|
2494
|
|
2495 // Sometimes a function call results in the creation of clean up
|
|
2496 // points. Allow these to be preserved in the body of the
|
|
2497 // constraint, as we might actually need them for some constexpr
|
|
2498 // evaluations.
|
|
2499 if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
|
|
2500 body = TREE_OPERAND (body, 0);
|
|
2501
|
|
2502 /* Check that the definition is written correctly. */
|
|
2503 if (TREE_CODE (body) != RETURN_EXPR)
|
|
2504 {
|
|
2505 location_t loc = DECL_SOURCE_LOCATION (fn);
|
|
2506 if (TREE_CODE (body) == STATEMENT_LIST && !STATEMENT_LIST_HEAD (body))
|
|
2507 {
|
|
2508 if (seen_error ())
|
|
2509 /* The definition was probably erroneous, not empty. */;
|
|
2510 else
|
|
2511 error_at (loc, "definition of concept %qD is empty", fn);
|
|
2512 }
|
|
2513 else
|
|
2514 error_at (loc, "definition of concept %qD has multiple statements", fn);
|
|
2515 }
|
|
2516
|
|
2517 return NULL_TREE;
|
|
2518 }
|
|
2519
|
|
2520
|
|
2521 // Check that a constrained friend declaration function declaration,
|
|
2522 // FN, is admissible. This is the case only when the declaration depends
|
|
2523 // on template parameters and does not declare a specialization.
|
|
2524 void
|
|
2525 check_constrained_friend (tree fn, tree reqs)
|
|
2526 {
|
|
2527 if (fn == error_mark_node)
|
|
2528 return;
|
|
2529 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
|
|
2530
|
|
2531 // If there are not constraints, this cannot be an error.
|
|
2532 if (!reqs)
|
|
2533 return;
|
|
2534
|
|
2535 // Constrained friend functions that don't depend on template
|
|
2536 // arguments are effectively meaningless.
|
|
2537 if (!uses_template_parms (TREE_TYPE (fn)))
|
|
2538 {
|
|
2539 error_at (location_of (fn),
|
|
2540 "constrained friend does not depend on template parameters");
|
|
2541 return;
|
|
2542 }
|
|
2543 }
|
|
2544
|
|
2545 /*---------------------------------------------------------------------------
|
|
2546 Equivalence of constraints
|
|
2547 ---------------------------------------------------------------------------*/
|
|
2548
|
|
2549 /* Returns true when A and B are equivalent constraints. */
|
|
2550 bool
|
|
2551 equivalent_constraints (tree a, tree b)
|
|
2552 {
|
|
2553 gcc_assert (!a || TREE_CODE (a) == CONSTRAINT_INFO);
|
|
2554 gcc_assert (!b || TREE_CODE (b) == CONSTRAINT_INFO);
|
|
2555 return cp_tree_equal (a, b);
|
|
2556 }
|
|
2557
|
|
2558 /* Returns true if the template declarations A and B have equivalent
|
|
2559 constraints. This is the case when A's constraints subsume B's and
|
|
2560 when B's also constrain A's. */
|
|
2561 bool
|
|
2562 equivalently_constrained (tree d1, tree d2)
|
|
2563 {
|
|
2564 gcc_assert (TREE_CODE (d1) == TREE_CODE (d2));
|
|
2565 return equivalent_constraints (get_constraints (d1), get_constraints (d2));
|
|
2566 }
|
|
2567
|
|
2568 /*---------------------------------------------------------------------------
|
|
2569 Partial ordering of constraints
|
|
2570 ---------------------------------------------------------------------------*/
|
|
2571
|
|
2572 /* Returns true when the the constraints in A subsume those in B. */
|
|
2573
|
|
2574 bool
|
|
2575 subsumes_constraints (tree a, tree b)
|
|
2576 {
|
|
2577 gcc_assert (!a || TREE_CODE (a) == CONSTRAINT_INFO);
|
|
2578 gcc_assert (!b || TREE_CODE (b) == CONSTRAINT_INFO);
|
|
2579 return subsumes (a, b);
|
|
2580 }
|
|
2581
|
|
2582 /* Returns true when the the constraints in A subsume those in B, but
|
|
2583 the constraints in B do not subsume the constraints in A. */
|
|
2584
|
|
2585 bool
|
|
2586 strictly_subsumes (tree a, tree b)
|
|
2587 {
|
|
2588 return subsumes (a, b) && !subsumes (b, a);
|
|
2589 }
|
|
2590
|
|
2591 /* Determines which of the declarations, A or B, is more constrained.
|
|
2592 That is, which declaration's constraints subsume but are not subsumed
|
|
2593 by the other's?
|
|
2594
|
|
2595 Returns 1 if A is more constrained than B, -1 if B is more constrained
|
|
2596 than A, and 0 otherwise. */
|
|
2597
|
|
2598 int
|
|
2599 more_constrained (tree d1, tree d2)
|
|
2600 {
|
|
2601 tree c1 = get_constraints (d1);
|
|
2602 tree c2 = get_constraints (d2);
|
|
2603 int winner = 0;
|
|
2604 if (subsumes_constraints (c1, c2))
|
|
2605 ++winner;
|
|
2606 if (subsumes_constraints (c2, c1))
|
|
2607 --winner;
|
|
2608 return winner;
|
|
2609 }
|
|
2610
|
|
2611 /* Returns true if D1 is at least as constrained as D2. That is, the
|
|
2612 associated constraints of D1 subsume those of D2, or both declarations
|
|
2613 are unconstrained. */
|
|
2614
|
|
2615 bool
|
|
2616 at_least_as_constrained (tree d1, tree d2)
|
|
2617 {
|
|
2618 tree c1 = get_constraints (d1);
|
|
2619 tree c2 = get_constraints (d2);
|
|
2620 return subsumes_constraints (c1, c2);
|
|
2621 }
|
|
2622
|
|
2623
|
|
2624 /*---------------------------------------------------------------------------
|
|
2625 Constraint diagnostics
|
|
2626
|
|
2627 FIXME: Normalize expressions into constraints before evaluating them.
|
|
2628 This should be the general pattern for all such diagnostics.
|
|
2629 ---------------------------------------------------------------------------*/
|
|
2630
|
|
2631 /* The number of detailed constraint failures. */
|
|
2632
|
|
2633 int constraint_errors = 0;
|
|
2634
|
|
2635 /* Do not generate errors after diagnosing this number of constraint
|
|
2636 failures.
|
|
2637
|
|
2638 FIXME: This is a really arbitrary number. Provide better control of
|
|
2639 constraint diagnostics with a command line option. */
|
|
2640
|
|
2641 int constraint_thresh = 20;
|
|
2642
|
|
2643
|
|
2644 /* Returns true if we should elide the diagnostic for a constraint failure.
|
|
2645 This is the case when the number of errors has exceeded the pre-configured
|
|
2646 threshold. */
|
|
2647
|
|
2648 inline bool
|
|
2649 elide_constraint_failure_p ()
|
|
2650 {
|
|
2651 bool ret = constraint_thresh <= constraint_errors;
|
|
2652 ++constraint_errors;
|
|
2653 return ret;
|
|
2654 }
|
|
2655
|
|
2656 /* Returns the number of undiagnosed errors. */
|
|
2657
|
|
2658 inline int
|
|
2659 undiagnosed_constraint_failures ()
|
|
2660 {
|
|
2661 return constraint_errors - constraint_thresh;
|
|
2662 }
|
|
2663
|
|
2664 /* The diagnosis of constraints performs a combination of normalization
|
|
2665 and satisfaction testing. We recursively walk through the conjunction or
|
|
2666 disjunction of associated constraints, testing each sub-constraint in
|
|
2667 turn. */
|
|
2668
|
|
2669 namespace {
|
|
2670
|
|
2671 void diagnose_constraint (location_t, tree, tree, tree);
|
|
2672
|
|
2673 /* Emit a specific diagnostics for a failed trait. */
|
|
2674
|
|
2675 void
|
|
2676 diagnose_trait_expression (location_t loc, tree, tree cur, tree args)
|
|
2677 {
|
|
2678 if (constraint_expression_satisfied_p (cur, args))
|
|
2679 return;
|
|
2680 if (elide_constraint_failure_p())
|
|
2681 return;
|
|
2682
|
|
2683 tree expr = PRED_CONSTR_EXPR (cur);
|
|
2684 ++processing_template_decl;
|
|
2685 expr = tsubst_expr (expr, args, tf_none, NULL_TREE, false);
|
|
2686 --processing_template_decl;
|
|
2687
|
|
2688 tree t1 = TRAIT_EXPR_TYPE1 (expr);
|
|
2689 tree t2 = TRAIT_EXPR_TYPE2 (expr);
|
|
2690 switch (TRAIT_EXPR_KIND (expr))
|
|
2691 {
|
|
2692 case CPTK_HAS_NOTHROW_ASSIGN:
|
|
2693 inform (loc, " %qT is not nothrow copy assignable", t1);
|
|
2694 break;
|
|
2695 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
|
|
2696 inform (loc, " %qT is not nothrow default constructible", t1);
|
|
2697 break;
|
|
2698 case CPTK_HAS_NOTHROW_COPY:
|
|
2699 inform (loc, " %qT is not nothrow copy constructible", t1);
|
|
2700 break;
|
|
2701 case CPTK_HAS_TRIVIAL_ASSIGN:
|
|
2702 inform (loc, " %qT is not trivially copy assignable", t1);
|
|
2703 break;
|
|
2704 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
|
|
2705 inform (loc, " %qT is not trivially default constructible", t1);
|
|
2706 break;
|
|
2707 case CPTK_HAS_TRIVIAL_COPY:
|
|
2708 inform (loc, " %qT is not trivially copy constructible", t1);
|
|
2709 break;
|
|
2710 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
|
|
2711 inform (loc, " %qT is not trivially destructible", t1);
|
|
2712 break;
|
|
2713 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
|
|
2714 inform (loc, " %qT does not have a virtual destructor", t1);
|
|
2715 break;
|
|
2716 case CPTK_IS_ABSTRACT:
|
|
2717 inform (loc, " %qT is not an abstract class", t1);
|
|
2718 break;
|
|
2719 case CPTK_IS_BASE_OF:
|
|
2720 inform (loc, " %qT is not a base of %qT", t1, t2);
|
|
2721 break;
|
|
2722 case CPTK_IS_CLASS:
|
|
2723 inform (loc, " %qT is not a class", t1);
|
|
2724 break;
|
|
2725 case CPTK_IS_EMPTY:
|
|
2726 inform (loc, " %qT is not an empty class", t1);
|
|
2727 break;
|
|
2728 case CPTK_IS_ENUM:
|
|
2729 inform (loc, " %qT is not an enum", t1);
|
|
2730 break;
|
|
2731 case CPTK_IS_FINAL:
|
|
2732 inform (loc, " %qT is not a final class", t1);
|
|
2733 break;
|
|
2734 case CPTK_IS_LITERAL_TYPE:
|
|
2735 inform (loc, " %qT is not a literal type", t1);
|
|
2736 break;
|
|
2737 case CPTK_IS_POD:
|
|
2738 inform (loc, " %qT is not a POD type", t1);
|
|
2739 break;
|
|
2740 case CPTK_IS_POLYMORPHIC:
|
|
2741 inform (loc, " %qT is not a polymorphic type", t1);
|
|
2742 break;
|
|
2743 case CPTK_IS_SAME_AS:
|
|
2744 inform (loc, " %qT is not the same as %qT", t1, t2);
|
|
2745 break;
|
|
2746 case CPTK_IS_STD_LAYOUT:
|
|
2747 inform (loc, " %qT is not an standard layout type", t1);
|
|
2748 break;
|
|
2749 case CPTK_IS_TRIVIAL:
|
|
2750 inform (loc, " %qT is not a trivial type", t1);
|
|
2751 break;
|
|
2752 case CPTK_IS_UNION:
|
|
2753 inform (loc, " %qT is not a union", t1);
|
|
2754 break;
|
|
2755 default:
|
|
2756 gcc_unreachable ();
|
|
2757 }
|
|
2758 }
|
|
2759
|
|
2760 /* Diagnose the expression of a predicate constraint. */
|
|
2761
|
|
2762 void
|
|
2763 diagnose_other_expression (location_t loc, tree, tree cur, tree args)
|
|
2764 {
|
|
2765 if (constraint_expression_satisfied_p (cur, args))
|
|
2766 return;
|
|
2767 if (elide_constraint_failure_p())
|
|
2768 return;
|
|
2769 inform (loc, "%qE evaluated to false", cur);
|
|
2770 }
|
|
2771
|
|
2772 /* Do our best to infer meaning from predicates. */
|
|
2773
|
|
2774 inline void
|
|
2775 diagnose_predicate_constraint (location_t loc, tree orig, tree cur, tree args)
|
|
2776 {
|
|
2777 if (TREE_CODE (PRED_CONSTR_EXPR (cur)) == TRAIT_EXPR)
|
|
2778 diagnose_trait_expression (loc, orig, cur, args);
|
|
2779 else
|
|
2780 diagnose_other_expression (loc, orig, cur, args);
|
|
2781 }
|
|
2782
|
|
2783 /* Diagnose a failed pack expansion, possibly containing constraints. */
|
|
2784
|
|
2785 void
|
|
2786 diagnose_pack_expansion (location_t loc, tree, tree cur, tree args)
|
|
2787 {
|
|
2788 if (constraint_expression_satisfied_p (cur, args))
|
|
2789 return;
|
|
2790 if (elide_constraint_failure_p())
|
|
2791 return;
|
|
2792
|
|
2793 /* Make sure that we don't have naked packs that we don't expect. */
|
|
2794 if (!same_type_p (TREE_TYPE (cur), boolean_type_node))
|
|
2795 {
|
|
2796 inform (loc, "invalid pack expansion in constraint %qE", cur);
|
|
2797 return;
|
|
2798 }
|
|
2799
|
|
2800 inform (loc, "in the expansion of %qE", cur);
|
|
2801
|
|
2802 /* Get the vector of expanded arguments. Note that n must not
|
|
2803 be 0 since this constraint is not satisfied. */
|
|
2804 ++processing_template_decl;
|
|
2805 tree exprs = tsubst_pack_expansion (cur, args, tf_none, NULL_TREE);
|
|
2806 --processing_template_decl;
|
|
2807 if (exprs == error_mark_node)
|
|
2808 {
|
|
2809 /* TODO: This error message could be better. */
|
|
2810 inform (loc, " substitution failure occurred during expansion");
|
|
2811 return;
|
|
2812 }
|
|
2813
|
|
2814 /* Check each expanded constraint separately. */
|
|
2815 int n = TREE_VEC_LENGTH (exprs);
|
|
2816 for (int i = 0; i < n; ++i)
|
|
2817 {
|
|
2818 tree expr = TREE_VEC_ELT (exprs, i);
|
|
2819 if (!constraint_expression_satisfied_p (expr, args))
|
|
2820 inform (loc, " %qE was not satisfied", expr);
|
|
2821 }
|
|
2822 }
|
|
2823
|
|
2824 /* Diagnose a potentially unsatisfied concept check constraint DECL<CARGS>.
|
|
2825 Parameters are as for diagnose_constraint. */
|
|
2826
|
|
2827 void
|
|
2828 diagnose_check_constraint (location_t loc, tree orig, tree cur, tree args)
|
|
2829 {
|
|
2830 if (constraints_satisfied_p (cur, args))
|
|
2831 return;
|
|
2832
|
|
2833 tree decl = CHECK_CONSTR_CONCEPT (cur);
|
|
2834 tree cargs = CHECK_CONSTR_ARGS (cur);
|
|
2835 tree tmpl = DECL_TI_TEMPLATE (decl);
|
|
2836 tree check = build_nt (CHECK_CONSTR, decl, cargs);
|
|
2837
|
|
2838 /* Instantiate the concept check arguments. */
|
|
2839 tree targs = tsubst (cargs, args, tf_none, NULL_TREE);
|
|
2840 if (targs == error_mark_node)
|
|
2841 {
|
|
2842 if (elide_constraint_failure_p ())
|
|
2843 return;
|
|
2844 inform (loc, "invalid use of the concept %qE", check);
|
|
2845 tsubst (cargs, args, tf_warning_or_error, NULL_TREE);
|
|
2846 return;
|
|
2847 }
|
|
2848
|
|
2849 tree sub = build_tree_list (tmpl, targs);
|
|
2850 /* Update to the expanded definitions. */
|
|
2851 cur = expand_concept (decl, targs);
|
|
2852 if (cur == error_mark_node)
|
|
2853 {
|
|
2854 if (elide_constraint_failure_p ())
|
|
2855 return;
|
|
2856 inform (loc, "in the expansion of concept %<%E %S%>", check, sub);
|
|
2857 cur = get_concept_definition (decl);
|
|
2858 tsubst_expr (cur, targs, tf_warning_or_error, NULL_TREE, false);
|
|
2859 return;
|
|
2860 }
|
|
2861
|
|
2862 orig = get_concept_definition (CHECK_CONSTR_CONCEPT (orig));
|
|
2863 orig = normalize_expression (orig);
|
|
2864
|
|
2865 location_t dloc = DECL_SOURCE_LOCATION (decl);
|
|
2866 inform (dloc, "within %qS", sub);
|
|
2867 diagnose_constraint (dloc, orig, cur, targs);
|
|
2868 }
|
|
2869
|
|
2870 /* Diagnose a potentially unsatisfied conjunction or disjunction. Parameters
|
|
2871 are as for diagnose_constraint. */
|
|
2872
|
|
2873 void
|
|
2874 diagnose_logical_constraint (location_t loc, tree orig, tree cur, tree args)
|
|
2875 {
|
|
2876 tree t0 = TREE_OPERAND (cur, 0);
|
|
2877 tree t1 = TREE_OPERAND (cur, 1);
|
|
2878 if (!constraints_satisfied_p (t0, args))
|
|
2879 diagnose_constraint (loc, TREE_OPERAND (orig, 0), t0, args);
|
|
2880 else if (TREE_CODE (orig) == TRUTH_ORIF_EXPR)
|
|
2881 return;
|
|
2882 if (!constraints_satisfied_p (t1, args))
|
|
2883 diagnose_constraint (loc, TREE_OPERAND (orig, 1), t1, args);
|
|
2884 }
|
|
2885
|
|
2886 /* Diagnose a potential expression constraint failure. */
|
|
2887
|
|
2888 void
|
|
2889 diagnose_expression_constraint (location_t loc, tree orig, tree cur, tree args)
|
|
2890 {
|
|
2891 if (constraints_satisfied_p (cur, args))
|
|
2892 return;
|
|
2893 if (elide_constraint_failure_p())
|
|
2894 return;
|
|
2895
|
|
2896 tree expr = EXPR_CONSTR_EXPR (orig);
|
|
2897 inform (loc, "the required expression %qE would be ill-formed", expr);
|
|
2898
|
|
2899 // TODO: We should have a flag that controls this substitution.
|
|
2900 // I'm finding it very useful for resolving concept check errors.
|
|
2901
|
|
2902 // inform (input_location, "==== BEGIN DUMP ====");
|
|
2903 // tsubst_expr (EXPR_CONSTR_EXPR (orig), args, tf_warning_or_error, NULL_TREE, false);
|
|
2904 // inform (input_location, "==== END DUMP ====");
|
|
2905 }
|
|
2906
|
|
2907 /* Diagnose a potentially failed type constraint. */
|
|
2908
|
|
2909 void
|
|
2910 diagnose_type_constraint (location_t loc, tree orig, tree cur, tree args)
|
|
2911 {
|
|
2912 if (constraints_satisfied_p (cur, args))
|
|
2913 return;
|
|
2914 if (elide_constraint_failure_p())
|
|
2915 return;
|
|
2916
|
|
2917 tree type = TYPE_CONSTR_TYPE (orig);
|
|
2918 inform (loc, "the required type %qT would be ill-formed", type);
|
|
2919 }
|
|
2920
|
|
2921 /* Diagnose a potentially unsatisfied conversion constraint. */
|
|
2922
|
|
2923 void
|
|
2924 diagnose_implicit_conversion_constraint (location_t loc, tree orig, tree cur,
|
|
2925 tree args)
|
|
2926 {
|
|
2927 if (constraints_satisfied_p (cur, args))
|
|
2928 return;
|
|
2929
|
|
2930 /* The expression and type will previously have been substituted into,
|
|
2931 and therefore may already be an error. Also, we will have already
|
|
2932 diagnosed substitution failures into an expression since this must be
|
|
2933 part of a compound requirement. */
|
|
2934 tree expr = ICONV_CONSTR_EXPR (cur);
|
|
2935 if (error_operand_p (expr))
|
|
2936 return;
|
|
2937
|
|
2938 /* Don't elide a previously diagnosed failure. */
|
|
2939 if (elide_constraint_failure_p())
|
|
2940 return;
|
|
2941
|
|
2942 tree type = ICONV_CONSTR_TYPE (cur);
|
|
2943 if (error_operand_p (type))
|
|
2944 {
|
|
2945 inform (loc, "substitution into type %qT failed",
|
|
2946 ICONV_CONSTR_TYPE (orig));
|
|
2947 return;
|
|
2948 }
|
|
2949
|
|
2950 inform(loc, "%qE is not implicitly convertible to %qT", expr, type);
|
|
2951 }
|
|
2952
|
|
2953 /* Diagnose an argument deduction constraint. */
|
|
2954
|
|
2955 void
|
|
2956 diagnose_argument_deduction_constraint (location_t loc, tree orig, tree cur,
|
|
2957 tree args)
|
|
2958 {
|
|
2959 if (constraints_satisfied_p (cur, args))
|
|
2960 return;
|
|
2961
|
|
2962 /* The expression and type will previously have been substituted into,
|
|
2963 and therefore may already be an error. Also, we will have already
|
|
2964 diagnosed substution failures into an expression since this must be
|
|
2965 part of a compound requirement. */
|
|
2966 tree expr = DEDUCT_CONSTR_EXPR (cur);
|
|
2967 if (error_operand_p (expr))
|
|
2968 return;
|
|
2969
|
|
2970 /* Don't elide a previously diagnosed failure. */
|
|
2971 if (elide_constraint_failure_p ())
|
|
2972 return;
|
|
2973
|
|
2974 tree pattern = DEDUCT_CONSTR_PATTERN (cur);
|
|
2975 if (error_operand_p (pattern))
|
|
2976 {
|
|
2977 inform (loc, "substitution into type %qT failed",
|
|
2978 DEDUCT_CONSTR_PATTERN (orig));
|
|
2979 return;
|
|
2980 }
|
|
2981
|
|
2982 inform (loc, "unable to deduce placeholder type %qT from %qE",
|
|
2983 pattern, expr);
|
|
2984 }
|
|
2985
|
|
2986 /* Diagnose an exception constraint. */
|
|
2987
|
|
2988 void
|
|
2989 diagnose_exception_constraint (location_t loc, tree orig, tree cur, tree args)
|
|
2990 {
|
|
2991 if (constraints_satisfied_p (cur, args))
|
|
2992 return;
|
|
2993 if (elide_constraint_failure_p ())
|
|
2994 return;
|
|
2995
|
|
2996 /* Rebuild a noexcept expression. */
|
|
2997 tree expr = EXCEPT_CONSTR_EXPR (cur);
|
|
2998 if (error_operand_p (expr))
|
|
2999 return;
|
|
3000
|
|
3001 inform (loc, "%qE evaluated to false", EXCEPT_CONSTR_EXPR (orig));
|
|
3002 }
|
|
3003
|
|
3004 /* Diagnose a potentially unsatisfied parameterized constraint. */
|
|
3005
|
|
3006 void
|
|
3007 diagnose_parameterized_constraint (location_t loc, tree orig, tree cur,
|
|
3008 tree args)
|
|
3009 {
|
|
3010 if (constraints_satisfied_p (cur, args))
|
|
3011 return;
|
|
3012
|
|
3013 local_specialization_stack stack;
|
|
3014 tree parms = PARM_CONSTR_PARMS (cur);
|
|
3015 tree vars = tsubst_constraint_variables (parms, args, tf_warning_or_error,
|
|
3016 NULL_TREE);
|
|
3017 if (vars == error_mark_node)
|
|
3018 {
|
|
3019 if (elide_constraint_failure_p ())
|
|
3020 return;
|
|
3021
|
|
3022 /* TODO: Check which variable failed and use orig to diagnose
|
|
3023 that substitution error. */
|
|
3024 inform (loc, "failed to instantiate constraint variables");
|
|
3025 return;
|
|
3026 }
|
|
3027
|
|
3028 /* TODO: It would be better write these in a list. */
|
|
3029 while (vars)
|
|
3030 {
|
|
3031 inform (loc, " with %q#D", vars);
|
|
3032 vars = TREE_CHAIN (vars);
|
|
3033 }
|
|
3034 orig = PARM_CONSTR_OPERAND (orig);
|
|
3035 cur = PARM_CONSTR_OPERAND (cur);
|
|
3036 return diagnose_constraint (loc, orig, cur, args);
|
|
3037 }
|
|
3038
|
|
3039 /* Diagnose the constraint CUR for the given ARGS. This is only ever invoked
|
|
3040 on the associated constraints, so we can only have conjunctions of
|
|
3041 predicate constraints. The ORIGinal (dependent) constructs follow
|
|
3042 the current constraints to enable better diagnostics. Note that ORIG
|
|
3043 and CUR must be the same kinds of node, except when CUR is an error. */
|
|
3044
|
|
3045 void
|
|
3046 diagnose_constraint (location_t loc, tree orig, tree cur, tree args)
|
|
3047 {
|
|
3048 switch (TREE_CODE (cur))
|
|
3049 {
|
|
3050 case EXPR_CONSTR:
|
|
3051 diagnose_expression_constraint (loc, orig, cur, args);
|
|
3052 break;
|
|
3053
|
|
3054 case TYPE_CONSTR:
|
|
3055 diagnose_type_constraint (loc, orig, cur, args);
|
|
3056 break;
|
|
3057
|
|
3058 case ICONV_CONSTR:
|
|
3059 diagnose_implicit_conversion_constraint (loc, orig, cur, args);
|
|
3060 break;
|
|
3061
|
|
3062 case DEDUCT_CONSTR:
|
|
3063 diagnose_argument_deduction_constraint (loc, orig, cur, args);
|
|
3064 break;
|
|
3065
|
|
3066 case EXCEPT_CONSTR:
|
|
3067 diagnose_exception_constraint (loc, orig, cur, args);
|
|
3068 break;
|
|
3069
|
|
3070 case CONJ_CONSTR:
|
|
3071 case DISJ_CONSTR:
|
|
3072 diagnose_logical_constraint (loc, orig, cur, args);
|
|
3073 break;
|
|
3074
|
|
3075 case PRED_CONSTR:
|
|
3076 diagnose_predicate_constraint (loc, orig, cur, args);
|
|
3077 break;
|
|
3078
|
|
3079 case PARM_CONSTR:
|
|
3080 diagnose_parameterized_constraint (loc, orig, cur, args);
|
|
3081 break;
|
|
3082
|
|
3083 case CHECK_CONSTR:
|
|
3084 diagnose_check_constraint (loc, orig, cur, args);
|
|
3085 break;
|
|
3086
|
|
3087 case EXPR_PACK_EXPANSION:
|
|
3088 diagnose_pack_expansion (loc, orig, cur, args);
|
|
3089 break;
|
|
3090
|
|
3091 case ERROR_MARK:
|
|
3092 /* TODO: Can we improve the diagnostic with the original? */
|
|
3093 inform (input_location, "ill-formed constraint");
|
|
3094 break;
|
|
3095
|
|
3096 default:
|
|
3097 gcc_unreachable ();
|
|
3098 break;
|
|
3099 }
|
|
3100 }
|
|
3101
|
|
3102 /* Diagnose the reason(s) why ARGS do not satisfy the constraints
|
|
3103 of declaration DECL. */
|
|
3104
|
|
3105 void
|
|
3106 diagnose_declaration_constraints (location_t loc, tree decl, tree args)
|
|
3107 {
|
|
3108 inform (loc, " constraints not satisfied");
|
|
3109
|
|
3110 /* Constraints are attached to the template. */
|
|
3111 if (tree ti = DECL_TEMPLATE_INFO (decl))
|
|
3112 {
|
|
3113 decl = TI_TEMPLATE (ti);
|
|
3114 if (!args)
|
|
3115 args = TI_ARGS (ti);
|
|
3116 }
|
|
3117
|
|
3118 /* Recursively diagnose the associated constraints. */
|
|
3119 tree ci = get_constraints (decl);
|
|
3120 tree t = CI_ASSOCIATED_CONSTRAINTS (ci);
|
|
3121 diagnose_constraint (loc, t, t, args);
|
|
3122 }
|
|
3123
|
|
3124 } // namespace
|
|
3125
|
|
3126 /* Emit diagnostics detailing the failure ARGS to satisfy the
|
|
3127 constraints of T. Here, T can be either a constraint
|
|
3128 or a declaration. */
|
|
3129
|
|
3130 void
|
|
3131 diagnose_constraints (location_t loc, tree t, tree args)
|
|
3132 {
|
|
3133 constraint_errors = 0;
|
|
3134
|
|
3135 if (constraint_p (t))
|
|
3136 diagnose_constraint (loc, t, t, args);
|
|
3137 else if (DECL_P (t))
|
|
3138 diagnose_declaration_constraints (loc, t, args);
|
|
3139 else
|
|
3140 gcc_unreachable ();
|
|
3141
|
|
3142 /* Note the number of elided failures. */
|
|
3143 int n = undiagnosed_constraint_failures ();
|
|
3144 if (n > 0)
|
|
3145 inform (loc, "... and %d more constraint errors not shown", n);
|
|
3146 }
|