aboutsummaryrefslogtreecommitdiff
path: root/contrib/gcc-changelog/git_commit.py
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2025-01-31 23:53:35 +1100
committerNathaniel Shead <nathanieloshead@gmail.com>2025-03-11 01:23:47 +1100
commit65febfb25544f089e7459219b6c095f0b8eff879 (patch)
tree286876ca7d7312af804dbcfca071c5c13eac9b06 /contrib/gcc-changelog/git_commit.py
parente187ed927ae52df7998376d6ccfdd2181fc8f774 (diff)
downloadgcc-65febfb25544f089e7459219b6c095f0b8eff879.zip
gcc-65febfb25544f089e7459219b6c095f0b8eff879.tar.gz
gcc-65febfb25544f089e7459219b6c095f0b8eff879.tar.bz2
c++/modules: Handle exposures of TU-local types in uninstantiated member templates
Previously, 'is_tu_local_entity' wouldn't detect the exposure of the (in practice) TU-local lambda in the following example, unless instantiated: struct S { template <typename> static inline decltype([]{}) x = {}; }; This is for two reasons. Firstly, when traversing the TYPE_FIELDS of S we only see the TEMPLATE_DECL, and never end up building a dependency on its DECL_TEMPLATE_RESULT (due to not being instantiated). This patch fixes this by stripping any templates before checking for unnamed types. The second reason is that we currently assume all class-scope entities are not TU-local. Despite this being unambiguous in the standard, this is not actually true in our implementation just yet, due to issues with mangling lambdas in some circumstances. Allowing these lambdas to be exported can cause issues in importers with apparently conflicting declarations, so this patch treats them as TU-local as well. After these changes, we now get double diagnostics from the two ways that we can see the above lambda being exposed, via 'S' (through TYPE_FIELDS) or via 'S::x'. To workaround this we hide diagnostics from the first case, so we only get errors from 'S::x' which will be closer to the point the offending lambda is declared. gcc/cp/ChangeLog: * module.cc (trees_out::has_tu_local_dep): Also look at the TI_TEMPLATE if we don't find a dep for a decl. (depset::hash::is_tu_local_entity): Handle unnamed template types, treat lambdas specially. (is_exposure_of_member_type): New function. (depset::hash::add_dependency): Use it. (depset::hash::finalize_dependencies): Likewise. gcc/testsuite/ChangeLog: * g++.dg/modules/internal-10.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'contrib/gcc-changelog/git_commit.py')
0 files changed, 0 insertions, 0 deletions