From: Peter Collingbourne Date: Mon, 5 Mar 2012 16:02:06 +0000 (+0000) Subject: Properly handle non-canonical underlying types in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=12fc4b0624706b474fa10308631fa8daf92f340f;p=clang Properly handle non-canonical underlying types in ASTContext::getUnaryTransformType. This can happen if, for example, an enumeration's underlying type is a typedef. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152031 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 9424bc3006..5122c21c9a 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -2962,7 +2962,7 @@ QualType ASTContext::getUnaryTransformType(QualType BaseType, new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType, Kind, UnderlyingType->isDependentType() ? - QualType() : UnderlyingType); + QualType() : getCanonicalType(UnderlyingType)); Types.push_back(Ty); return QualType(Ty, 0); } diff --git a/test/SemaCXX/underlying_type.cpp b/test/SemaCXX/underlying_type.cpp index dcfaab3c8b..7bca06bf07 100644 --- a/test/SemaCXX/underlying_type.cpp +++ b/test/SemaCXX/underlying_type.cpp @@ -35,3 +35,9 @@ static_assert(is_same_type::type, char>::value, "f has the wrong underlying type in the template"); underlying_type::type e; // expected-note {{requested here}} + +using uint = unsigned; +enum class foo : uint { bar }; + +static_assert(is_same_type::type, unsigned>::value, + "foo has the wrong underlying type");