Thanks for bringing this up Richard! we reject the corresponding non-template case >
It looks like we *correctly* reject the non-template case. The GCC folks ran into that case and declared it invalid: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51080. but accept the corresponding non-local class template case. > In terms of standardese, I haven't dug deep enough to determine whether this case is valid or not. Perhaps you know the answer to this already? In terms of our implementation, given that the non-template case is ill-formed: struct X { > static constexpr int get() { return 42; } int arr[get()]; // ill-formed: get() not defined here. > }; // get() is defined here. It makes sense to me that the following would not work either: void f() { struct X { > static constexpr int get() { return 42; } > int arr[get()]; > } > } Given that the class template case works (again, not sure about the standardese): > template <typename> struct X { static constexpr int get() { return 42; } int arr[get()]; }; template class X<void>; I think the following should work also: template <typename> void f() { struct X { > static constexpr int get() { return 42; } > int arr[get()]; > } > } I think we need to distinguish the 2 cases (1) a local class enclosed in a non-template function and (2) a local class enclosed in a function template. A local class within a non-template function would behave similarly to a non-template class whereas a local class within a function template would behave similarly to a class template. Currently we seem to treat a local class similar to a non-template class whether it's enclosed in a non-template function or a function template.
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
