https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87571
Bug ID: 87571
Summary: [8/9 Regression] ICE in friend_accessible_p, accessing
protected member of template friend inside template
class
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: Francois-R.Boyer at PolyMtl dot ca
Target Milestone: ---
The following code fails to compile with g++ 8.1, 8.2 and 9.0.0 20181007 on
godbolt, but compiles with g++ 7.3, clang, MSVC, etc.:
template <class> struct A {
template <class> struct B {
template <class> friend class B;
protected:
int protected_member_;
public:
template <class T> int method(const B<T>& other) const {
return other.protected_member_;
}
};
};
int main() {
A<int>::B<int> a;
A<int>::B<char> b;
a.method(b);
}
The error message is:
<source>: In instantiation of 'int A< <template-parameter-1-1> >::B<
<template-parameter-2-1> >::method(const A< <template-parameter-1-1> >::B<T>&)
const [with T = char; <template-parameter-2-1> = int; <template-parameter-1-1>
= int]':
<source>:16:13: required from here
<source>:8:20: internal compiler error: in friend_accessible_p, at
cp/search.c:719
8 | return other.protected_member_;
| ~~~~~~^~~~~~~~~~~~~~~~~
Note that it compiles if we change any of these:
- the member is private instead of protected,
- struct A is not a template, or
- we explicitly 'friend class B<int>;' instead or in addition of the template
friend.