diff options
author | Patrick Palka <ppalka@redhat.com> | 2024-08-15 10:23:54 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2024-08-15 10:23:54 -0400 |
commit | 484f139ccd3b631a777802e810a632678b42ffab (patch) | |
tree | 25aad0b8e17d149fa1b390862a8203e1de570228 /gcc/cp | |
parent | 303bed670af962c01b77a4f0c51de97f70e8167e (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/cp/semantics.cc | 11 |
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 |