================ @@ -6998,6 +7007,31 @@ namespace { else return C.getRValueReferenceType(New); } + case Elaborated: { + auto *ET = cast<ElaboratedType>(Old); + return C.getElaboratedType(ET->getKeyword(), ET->getQualifier(), + wrap(C, ET->getNamedType(), I)); + } + case TypeAlias: { + auto *ET = cast<TypedefType>(Old); + QualType Underlying = wrap(C, ET->desugar(), I); + TypedefNameDecl *Typedef; + if (auto *TD = dyn_cast<TypedefDecl>(ET->getDecl())) { + Typedef = TypedefDecl::Create(C, TD->getDeclContext(), + TD->getBeginLoc(), TD->getLocation(), + TD->getIdentifier(), nullptr); + Typedef->setModedTypeSourceInfo(TD->getTypeSourceInfo(), Underlying); + } else { + auto *Alias = cast<TypeAliasDecl>(ET->getDecl()); + Typedef = TypedefDecl::Create( + C, Alias->getDeclContext(), Alias->getBeginLoc(), + Alias->getLocation(), Alias->getIdentifier(), nullptr); + Typedef->setModedTypeSourceInfo(Alias->getTypeSourceInfo(), + Underlying); + } + Typedef->setPreviousDecl(ET->getDecl()); + return C.getTypedefType(Typedef, Underlying); ---------------- mizvekov wrote:
In both cases, either divergent typedef or creating a new decl, if the types are not the same, you have to deal with these consequences. For example, getCommonSugaredType expects all TypedefTypes of the same typedef declaration to be the same type. https://github.com/llvm/llvm-project/pull/143143 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits