template<typename T> struct x { protected: typedef int type; };
template<typename T> struct y : public x<T> { typedef x<T> base_type; typedef typename base_type::type type; }; template<> struct y<void> : public x<void> { typedef x<void> base_type; typedef base_type::type type; }; template class y<int>; int main() { return 0; } $ g++4x spec.cc spec.cc: In instantiation of y<int>: spec.cc:22: instantiated from here spec.cc:5: error: typedef int x<void>::type is protected spec.cc:10: error: within this context $ g++4x -v Using built-in specs. Target: x86_64-unknown-linux-gnu Configured with: ../gcc-4.x/configure --prefix=/home/redi/gcc/4.x --with-system-zlib --enable-__cxa_atexit --with-arch=k8 --enable-libstdcxx-debug --disable-libstdcxx-pch --enable-languages=c,c++ --enable-libstdcxx-time=yes --disable-bootstrap --enable-checking=release Thread model: posix gcc version 4.5.0 20090502 (experimental) (GCC) If the base class is not a template there is no error, if the y<void> specialisation is not defined there is no error. As I'm not using the y<void> specialisation, its contents should make no difference to the instantiation of y<int>. Looks like a regression since 4.3 as it works with gcc version 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC) and Comeau's online compiler. -- Summary: specialization causes access problem in primary template Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jwakely dot gcc at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40007