Skip to content

Commit

Permalink
c++/modules: imported spec befriending class tmpl [PR114889]
Browse files Browse the repository at this point in the history
When adding to CLASSTYPE_BEFRIENDING_CLASSES as part of installing an
imported class definition, we need to look through TEMPLATE_DECL like
make_friend_class does.

Otherwise in the below testcase we won't add _Hashtable<int, int> to
CLASSTYPE_BEFRIENDING_CLASSES of _Map_base, which leads to a bogus
access check failure for _M_hash_code.

	PR c++/114889

gcc/cp/ChangeLog:

	* module.cc (trees_in::read_class_def): Look through
	TEMPLATE_DECL when adding to CLASSTYPE_BEFRIENDING_CLASSES.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/friend-8_a.H: New test.
	* g++.dg/modules/friend-8_b.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
  • Loading branch information
Patrick Palka committed Apr 30, 2024
1 parent 3900e94 commit 22b20ac
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
2 changes: 2 additions & 0 deletions gcc/cp/module.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12498,6 +12498,8 @@ trees_in::read_class_def (tree defn, tree maybe_template)
for (; friend_classes; friend_classes = TREE_CHAIN (friend_classes))
{
tree f = TREE_VALUE (friend_classes);
if (TREE_CODE (f) == TEMPLATE_DECL)
f = TREE_TYPE (f);

if (CLASS_TYPE_P (f))
{
Expand Down
23 changes: 23 additions & 0 deletions gcc/testsuite/g++.dg/modules/friend-8_a.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// PR c++/114889
// { dg-additional-options "-fmodule-header" }
// { dg-module-cmi {} }

template<class, class>
struct _Hashtable;

template<class _Key, class _Val>
struct _Map_base {
void f() {
_Hashtable<_Key, _Val> __h;
__h._M_hash_code(0);
}
};

template<class _Key, class _Value>
struct _Hashtable {
template<class, class> friend struct _Map_base;
protected:
void _M_hash_code(int);
};

inline _Hashtable<int, int> m;
9 changes: 9 additions & 0 deletions gcc/testsuite/g++.dg/modules/friend-8_b.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// PR c++/114889
// { dg-additional-options "-fmodules-ts" }

import "friend-8_a.H";

int main() {
_Map_base<int, int> m;
m.f();
}

0 comments on commit 22b20ac

Please sign in to comment.