From 28750ac2765e808aa4f45a73c630e53575834efd Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Sat, 12 Mar 2022 14:57:56 -0500 Subject: [PATCH] c++: give fold expressions a location MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This improves diagnostic quality for unsatisfied atomic constraints that consist of a fold expression, e.g. in concepts/diagnostic3.C the "evaluated to false" diagnostic now points to the expression: .../diagnostic3.C:10:22: note: the expression ‘(foo && ...) [with Ts = {int, char}]’ evaluated to ‘false’ 10 | requires (foo && ...) | ~~~~~~~~~~~~^~~~ gcc/cp/ChangeLog: * semantics.cc (finish_unary_fold_expr): Use input_location instead of UNKNOWN_LOCATION. (finish_binary_fold_expr): Likewise. gcc/testsuite/ChangeLog: * g++.dg/concepts/diagnostic3.C: Adjusted expected location of "evaluated to false" diagnostics. --- gcc/cp/semantics.cc | 4 ++-- gcc/testsuite/g++.dg/concepts/diagnostic3.C | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index da270e8..d5565eb 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -12197,7 +12197,7 @@ finish_unary_fold_expr (tree expr, int op, tree_code dir) /* Build the fold expression. */ tree code = build_int_cstu (integer_type_node, abs (op)); - tree fold = build_min_nt_loc (UNKNOWN_LOCATION, dir, code, pack); + tree fold = build_min_nt_loc (input_location, dir, code, pack); FOLD_EXPR_MODIFY_P (fold) = (op < 0); TREE_TYPE (fold) = build_dependent_operator_type (NULL_TREE, FOLD_EXPR_OP (fold), @@ -12226,7 +12226,7 @@ finish_binary_fold_expr (tree pack, tree init, int op, tree_code dir) { pack = make_pack_expansion (pack); tree code = build_int_cstu (integer_type_node, abs (op)); - tree fold = build_min_nt_loc (UNKNOWN_LOCATION, dir, code, pack, init); + tree fold = build_min_nt_loc (input_location, dir, code, pack, init); FOLD_EXPR_MODIFY_P (fold) = (op < 0); TREE_TYPE (fold) = build_dependent_operator_type (NULL_TREE, FOLD_EXPR_OP (fold), diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic3.C b/gcc/testsuite/g++.dg/concepts/diagnostic3.C index 7796e26..410651a 100644 --- a/gcc/testsuite/g++.dg/concepts/diagnostic3.C +++ b/gcc/testsuite/g++.dg/concepts/diagnostic3.C @@ -7,18 +7,18 @@ template concept foo = (bool)(foo_v | foo_v); template -requires (foo && ...) +requires (foo && ...) // { dg-message "with Ts = .int, char... evaluated to .false." } void -bar() // { dg-message "with Ts = .int, char... evaluated to .false." } +bar() { } template struct S { }; template -requires (foo> && ...) +requires (foo> && ...) // { dg-message "with Is = .2, 3, 4... evaluated to .false." } void -baz() // { dg-message "with Is = .2, 3, 4... evaluated to .false." } +baz() { } void -- 2.7.4