Mark, in PR c++/11987 you added a comment saying that it was a regression. But the more I look at it, the less I understand it.
The test case is: ================================================== template <int dim> struct X { struct I { I(); }; }; template <int dim> struct Y : X<dim> { typedef typename X<dim>::I I; }; template <int dim> Y<dim>::I::I () {} // note: I is nested type in X, not Y! template struct Y<1>; ================================================== g++ currently accepts this test case. The PR says that this test case is invalid, and should be rejected. But I can't figure out why. The function definition using a typedef is clearly OK. Is the problem specifically that this code declares a constructor using a template specialization? That is, would this code be valid C++? ================================================== template <int dim> struct X { struct I { I(); void foo(); }; }; template <int dim> struct Y : X<dim> { typedef typename X<dim>::I I; }; template <int dim> void Y<dim>::I::foo () {} template struct Y<1>; ================================================== (Incidentally, this test case currently gets an ICE, but that is presumably an unrelated problem.) Or is the problem something else? For what it's worth, I have a simple patch which rejects this code as invalid and passes the g++ testsuite. But the patch seems fragile and wrong. While trying to make the patch correct, I realized that I don't understand what is correct. Thanks. Ian