From: Richard Trieu Date: Thu, 12 Apr 2018 02:26:49 +0000 (+0000) Subject: [ODRHash] Skip more types hashing TypedefType X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=69e2ab36db8a6e6c2ab255946de16074eb0f5616;p=clang [ODRHash] Skip more types hashing TypedefType To get the underlying type for TypedefType's, also skip ElaboratedType's. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@329869 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ODRHash.cpp b/lib/AST/ODRHash.cpp index 528e32aaba..0ee30fbd9b 100644 --- a/lib/AST/ODRHash.cpp +++ b/lib/AST/ODRHash.cpp @@ -646,9 +646,19 @@ public: AddDecl(T->getDecl()); QualType UnderlyingType = T->getDecl()->getUnderlyingType(); VisitQualifiers(UnderlyingType.getQualifiers()); - while (const TypedefType *Underlying = - dyn_cast(UnderlyingType.getTypePtr())) { - UnderlyingType = Underlying->getDecl()->getUnderlyingType(); + while (true) { + if (const TypedefType *Underlying = + dyn_cast(UnderlyingType.getTypePtr())) { + UnderlyingType = Underlying->getDecl()->getUnderlyingType(); + continue; + } + if (const ElaboratedType *Underlying = + dyn_cast(UnderlyingType.getTypePtr())) { + UnderlyingType = Underlying->getNamedType(); + continue; + } + + break; } AddType(UnderlyingType.getTypePtr()); VisitType(T); diff --git a/test/Modules/odr_hash.cpp b/test/Modules/odr_hash.cpp index 5991dd0a73..b22ccdd0c8 100644 --- a/test/Modules/odr_hash.cpp +++ b/test/Modules/odr_hash.cpp @@ -2744,6 +2744,38 @@ struct S3 { #else S3 s3; #endif + +#if defined(FIRST) +using A4 = int; +using B4 = A4; +struct S4 { + B4 x; +}; +#elif defined(SECOND) +using A4 = int; +using B4 = ::MultipleTypedefs::A4; +struct S4 { + B4 x; +}; +#else +S4 s4; +#endif + +#if defined(FIRST) +using A5 = int; +using B5 = MultipleTypedefs::A5; +struct S5 { + B5 x; +}; +#elif defined(SECOND) +using A5 = int; +using B5 = ::MultipleTypedefs::A5; +struct S5 { + B5 x; +}; +#else +S5 s5; +#endif } // MultipleTypedefs namespace DefaultArguments {