https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107126
--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> --- https://wg21.link/cwg1435 introduced the wording that allows this (which can still be seen in the context for the [class.dtor] changes in CWG 2337): "in a declaration at namespace scope or in a friend declaration, the id-expression is nested-name-specifier ~class-name and the class-name names the same class as the nested-name-specifier." https://wg21.link/p1787r6 changed that to: "otherwise, the id-expression is nested-name-specifier ~class-name and the class-name is the injected-class-name of the class nominated by the nested-name-specifier." This seems like a breaking change that was not obvious from the revision history of the r5 paper: - Required destructor declarations to use the injected-class-name, avoiding name lookup - Simplified lookup for destructors - Specified that < begins a template argument list in a destructor name All compilers accept the program in C++17 mode, and I don't think it's at all clear that the code was always invalid in older standards, as you claim.