Suppose there is a code like this:
template <typename T>
CLASS_KEY1 X{};
PREFIX template CLASS_KEY2 X<int>;
where CLASS_KEY1, CLASS_KEY2 and PREFIX are macros. CLASS_KEY1 and CLASS_KEY2 may be expanded to class, struct or union keywords. PREFIX may be expanded to empty set of characters or extern keyword.
Here is the table which shows when such code compiles (Yes - compiles, No - does not compile) for all combinations of macros values (compiler gcc-4.8.1, option -std=c++11):
PREFIX extern extern extern
CLASS_KEY1\CLASS_KEY2 class struct union class struct union
class Yes Yes? No Yes Yes? No
struct Yes? Yes No Yes? Yes No
union No No Yes No No Yes
Is it a bug in gcc or standard requirement (strange cases are labeled with question marks)? What about other compilers?