]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: modules and std::source_location::current() def arg [PR100881]
authorPatrick Palka <ppalka@redhat.com>
Mon, 19 Dec 2022 20:35:51 +0000 (15:35 -0500)
committerPatrick Palka <ppalka@redhat.com>
Mon, 19 Dec 2022 20:35:51 +0000 (15:35 -0500)
commit64f7a3b38765bcf7cdf5b37a991c06337468ad8b
tree72bade88174709211f90a619218822629b53cf63
parenta7c8036b26082d8da001e05596777c5f911590e1
c++: modules and std::source_location::current() def arg [PR100881]

We currently declare __builtin_source_location with a const void* return
type instead of the actual type const std::source_location::__impl*, and
later when folding this builtin we obtain the actual type via name lookup.

But the below testcase demonstrates this approach seems to interact
poorly with modules, since we may import an entity that uses
std::source_location::current() in its default argument (or DMI) without
necessarily importing <source_location>, and thus the name lookup for
std::source_location will fail at the call site (when using the default
argument) unless we also import <source_location>.

This patch fixes this by instead initially declaring the builtin with an
auto return type and updating it appropriately upon its first use (in
standard code the first/only use would be in the definition of
std::source_location).  Thus when folding calls to this builtin we can
get at its return type through the type of the CALL_EXPR and avoid
needing to do a name lookup.

PR c++/100881

gcc/cp/ChangeLog:

* constexpr.cc (cxx_eval_builtin_function_call): Adjust calls
to fold_builtin_source_location.
* cp-gimplify.cc (cp_gimplify_expr): Likewise.
(cp_fold): Likewise.
(get_source_location_impl_type): Remove location_t parameter and
adjust accordingly.  No longer static.
(fold_builtin_source_location): Take a CALL_EXPR tree instead of a
location and obtain the impl type from its return type.
* cp-tree.h (enum cp_tree_index): Remove CPTI_SOURCE_LOCATION_IMPL
enumerator.
(source_location_impl): Remove.
(fold_builtin_source_location): Adjust parameter type.
(get_source_location_impl_type): Declare.
* decl.cc (cxx_init_decl_processing): Declare
__builtin_source_location with auto return type instead of
const void*.
(require_deduced_type): Update the return type of
__builtin_source_location.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/srcloc3.C: Adjust expected note s/evaluating/using.
* g++.dg/cpp2a/srcloc4.C: Likewise.
* g++.dg/cpp2a/srcloc5.C: Likewise.
* g++.dg/cpp2a/srcloc6.C: Likewise.
* g++.dg/cpp2a/srcloc7.C: Likewise.
* g++.dg/cpp2a/srcloc8.C: Likewise.
* g++.dg/cpp2a/srcloc9.C: Likewise.
* g++.dg/cpp2a/srcloc10.C: Likewise.
* g++.dg/cpp2a/srcloc11.C: Likewise.
* g++.dg/cpp2a/srcloc12.C: Likewise.
* g++.dg/cpp2a/srcloc13.C: Likewise.
* g++.dg/modules/pr100881_a.C: New test.
* g++.dg/modules/pr100881_b.C: New test.
17 files changed:
gcc/cp/constexpr.cc
gcc/cp/cp-gimplify.cc
gcc/cp/cp-tree.h
gcc/cp/decl.cc
gcc/testsuite/g++.dg/cpp2a/srcloc10.C
gcc/testsuite/g++.dg/cpp2a/srcloc11.C
gcc/testsuite/g++.dg/cpp2a/srcloc12.C
gcc/testsuite/g++.dg/cpp2a/srcloc13.C
gcc/testsuite/g++.dg/cpp2a/srcloc3.C
gcc/testsuite/g++.dg/cpp2a/srcloc4.C
gcc/testsuite/g++.dg/cpp2a/srcloc5.C
gcc/testsuite/g++.dg/cpp2a/srcloc6.C
gcc/testsuite/g++.dg/cpp2a/srcloc7.C
gcc/testsuite/g++.dg/cpp2a/srcloc8.C
gcc/testsuite/g++.dg/cpp2a/srcloc9.C
gcc/testsuite/g++.dg/modules/pr100881_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr100881_b.C [new file with mode: 0644]