aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/semantics.cc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-08-15 10:23:54 -0400
committerPatrick Palka <ppalka@redhat.com>2024-08-15 10:23:54 -0400
commit484f139ccd3b631a777802e810a632678b42ffab (patch)
tree25aad0b8e17d149fa1b390862a8203e1de570228 /gcc/cp/semantics.cc
parent303bed670af962c01b77a4f0c51de97f70e8167e (diff)
downloadgcc-484f139ccd3b631a777802e810a632678b42ffab.zip
gcc-484f139ccd3b631a777802e810a632678b42ffab.tar.gz
gcc-484f139ccd3b631a777802e810a632678b42ffab.tar.bz2
c++: c->B::m access resolved through current inst [PR116320]
Here when checking the access of (the injected-class-name) B in c->B::m at parse time, we notice its context B (now the type) is a base of the object type C<T>, so we proceed to use C<T> as the effective qualifying type. But this C<T> is the dependent specialization not the primary template type, so it has empty TYPE_BINFO, which leads to a segfault later from perform_or_defer_access_check. The reason the DERIVED_FROM_P (B, C<T>) test guarding this code path works despite C<T> having empty TYPE_BINFO is because of its currently_open_class logic (added in r9-713-gd9338471b91bbe) which replaces a dependent specialization with the primary template type if we're inside it. So the safest fix seems to be to call currently_open_class in the caller as well. PR c++/116320 gcc/cp/ChangeLog: * semantics.cc (check_accessibility_of_qualified_id): Try currently_open_class when using the object type as the effective qualifying type. gcc/testsuite/ChangeLog: * g++.dg/template/access42.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc/cp/semantics.cc')
-rw-r--r--gcc/cp/semantics.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index e586126..5ab2076 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -2516,9 +2516,14 @@ check_accessibility_of_qualified_id (tree decl,
OBJECT_TYPE. */
&& CLASS_TYPE_P (object_type)
&& DERIVED_FROM_P (scope, object_type))
- /* If we are processing a `->' or `.' expression, use the type of the
- left-hand side. */
- qualifying_type = object_type;
+ {
+ /* If we are processing a `->' or `.' expression, use the type of the
+ left-hand side. */
+ if (tree open = currently_open_class (object_type))
+ qualifying_type = open;
+ else
+ qualifying_type = object_type;
+ }
else if (nested_name_specifier)
{
/* If the reference is to a non-static member of the