c++: Improve location information in constant evaluation
commit5ebe5bcf8b6b6a0de16737b717e8bd06e4950a14
authorNathaniel Shead <nathanieloshead@gmail.com>
Sat, 22 Jul 2023 15:13:43 +0000 (23 01:13 +1000)
committerJason Merrill <jason@redhat.com>
Wed, 26 Jul 2023 01:45:10 +0000 (25 21:45 -0400)
tree6729835611be593167053724c99df1544bf496d6
parent2ace6cd69429e0078147cdeaa16b92fab0002a02
c++: Improve location information in constant evaluation

This patch updates 'input_location' during constant evaluation to ensure
that errors in subexpressions that lack location information still
provide accurate diagnostics.

By itself this change causes some small regressions in diagnostic
quality for circumstances where errors used 'input_location' but the
location of the parent subexpression doesn't make sense, so this patch
also includes a small diagnostic improvement to fix the most egregious
case.

gcc/cp/ChangeLog:

* constexpr.cc (modifying_const_object_error): Find the source
location of the const object's declaration.
(cxx_eval_constant_expression): Update input_location to the
location of the currently evaluated expression, if possible.

libstdc++-v3/ChangeLog:

* testsuite/25_algorithms/equal/constexpr_neg.cc: Update diagnostic
locations.
* testsuite/26_numerics/gcd/105844.cc: Likewise.
* testsuite/26_numerics/lcm/105844.cc: Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/constexpr-48089.C: Update diagnostic locations.
* g++.dg/cpp0x/constexpr-70323.C: Likewise.
* g++.dg/cpp0x/constexpr-70323a.C: Likewise.
* g++.dg/cpp0x/constexpr-delete2.C: Likewise.
* g++.dg/cpp0x/constexpr-diag3.C: Likewise.
* g++.dg/cpp0x/constexpr-ice20.C: Likewise.
* g++.dg/cpp0x/constexpr-mutable3.C: Likewise.
* g++.dg/cpp0x/constexpr-recursion.C: Likewise.
* g++.dg/cpp0x/overflow1.C: Likewise.
* g++.dg/cpp1y/constexpr-89285.C: Likewise.
* g++.dg/cpp1y/constexpr-89481.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const14.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const16.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const18.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const19.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const21.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const22.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const3.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const4.C: Likewise.
* g++.dg/cpp1y/constexpr-tracking-const7.C: Likewise.
* g++.dg/cpp1y/constexpr-union5.C: Likewise.
* g++.dg/cpp1y/pr68180.C: Likewise.
* g++.dg/cpp1z/constexpr-lambda6.C: Likewise.
* g++.dg/cpp1z/constexpr-lambda8.C: Likewise.
* g++.dg/cpp2a/bit-cast11.C: Likewise.
* g++.dg/cpp2a/bit-cast12.C: Likewise.
* g++.dg/cpp2a/bit-cast14.C: Likewise.
* g++.dg/cpp2a/constexpr-98122.C: Likewise.
* g++.dg/cpp2a/constexpr-dynamic17.C: Likewise.
* g++.dg/cpp2a/constexpr-init1.C: Likewise.
* g++.dg/cpp2a/constexpr-new12.C: Likewise.
* g++.dg/cpp2a/constexpr-new3.C: Likewise.
* g++.dg/cpp2a/constinit10.C: Likewise.
* g++.dg/cpp2a/is-corresponding-member4.C: Likewise.
* g++.dg/ext/constexpr-vla2.C: Likewise.
* g++.dg/ext/constexpr-vla3.C: Likewise.
* g++.dg/ubsan/pr63956.C: Likewise.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
41 files changed:
gcc/cp/constexpr.cc
gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C
gcc/testsuite/g++.dg/cpp0x/constexpr-70323.C
gcc/testsuite/g++.dg/cpp0x/constexpr-70323a.C
gcc/testsuite/g++.dg/cpp0x/constexpr-delete2.C
gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ice20.C
gcc/testsuite/g++.dg/cpp0x/constexpr-mutable3.C
gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C
gcc/testsuite/g++.dg/cpp0x/overflow1.C
gcc/testsuite/g++.dg/cpp1y/constexpr-89285.C
gcc/testsuite/g++.dg/cpp1y/constexpr-89481.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const14.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const16.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const18.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const19.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const21.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const22.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const3.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const4.C
gcc/testsuite/g++.dg/cpp1y/constexpr-tracking-const7.C
gcc/testsuite/g++.dg/cpp1y/constexpr-union5.C
gcc/testsuite/g++.dg/cpp1y/pr68180.C
gcc/testsuite/g++.dg/cpp1z/constexpr-lambda6.C
gcc/testsuite/g++.dg/cpp1z/constexpr-lambda8.C
gcc/testsuite/g++.dg/cpp2a/bit-cast11.C
gcc/testsuite/g++.dg/cpp2a/bit-cast12.C
gcc/testsuite/g++.dg/cpp2a/bit-cast14.C
gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C
gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic17.C
gcc/testsuite/g++.dg/cpp2a/constexpr-init1.C
gcc/testsuite/g++.dg/cpp2a/constexpr-new12.C
gcc/testsuite/g++.dg/cpp2a/constexpr-new3.C
gcc/testsuite/g++.dg/cpp2a/constinit10.C
gcc/testsuite/g++.dg/cpp2a/is-corresponding-member4.C
gcc/testsuite/g++.dg/ext/constexpr-vla2.C
gcc/testsuite/g++.dg/ext/constexpr-vla3.C
gcc/testsuite/g++.dg/ubsan/pr63956.C
libstdc++-v3/testsuite/25_algorithms/equal/constexpr_neg.cc
libstdc++-v3/testsuite/26_numerics/gcd/105844.cc
libstdc++-v3/testsuite/26_numerics/lcm/105844.cc