That concern plus prior comments and help from clang -ast-dump led me to develop this new approach based entirely on the AST that completely eliminates manual parsing. It now handles typedefs that include comma-separated multiple types, and handles embedded struct definitions, which previously could not be automatically converted.
For example, with this patch modernize-use-using now can convert:
typedef struct { int a; } R_t, *R_p;
to:
using R_t = struct { int a; }; using R_p = R_t*;
-ast-dump showed that the CXXRecordDecl definitions and multiple TypedefDecls come consecutively in the tree, so check() stores information between calls to determine when it is receiving a second or additional TypedefDecl within a single typedef, or when the current TypedefDecl refers to an embedded CXXRecordDecl like a struct.
This patch fully replaces D67460 though it builds on its extended set of tests. All those tests pass, plus several that previously remained as typedef are now modernized to use using.
It's unfortunate that we can't restrict this matcher more -- there tend to be a lot of struct declarations, so I am a bit worried about the performance of this matching on so many of them. At a minimum, I think you can restrict it to non-implicit structs here and simplify the code in check() a bit.