For example, given:
void fn() { enum __attribute__((deprecated)) T *p; }
-ast-print produced:
void fn() { enum T __attribute__((deprecated(""))) *p; }
-ast-print on that produced:
void fn() { enum T *p __attribute__((deprecated(""))); }
The attribute is on enum T in the first case, but it's on p in the
other cases.
Details:
Within enum declarations, enum attributes were always printed after
the tag and any member list. When no member list was present but the
enum was a type specifier in a variable declaration, the attribute
then applied to the variable not the enum, changing the semantics.
This patch fixes that by always printing attributes between the enum's
keyword and tag, as clang already does for structs, unions, and
classes.