Simplify getTypeInfoImpl handling of 'non-canonical unless dependent' types.

These types are not dependent in this context, so just look through
the sugar.

Review by Richard Smith & Eli Friedman.

llvm-svn: 186260
This commit is contained in:
David Blaikie 2013-07-13 21:08:03 +00:00
parent b58f6a4211
commit ab277d6400
1 changed files with 4 additions and 26 deletions

View File

@ -1394,6 +1394,10 @@ ASTContext::getTypeInfoImpl(const Type *T) const {
#define ABSTRACT_TYPE(Class, Base) #define ABSTRACT_TYPE(Class, Base)
#define NON_CANONICAL_TYPE(Class, Base) #define NON_CANONICAL_TYPE(Class, Base)
#define DEPENDENT_TYPE(Class, Base) case Type::Class: #define DEPENDENT_TYPE(Class, Base) case Type::Class:
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
case Type::Class: \
assert(!T->isDependentType() && "should not see dependent types here"); \
return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
#include "clang/AST/TypeNodes.def" #include "clang/AST/TypeNodes.def"
llvm_unreachable("Should not see dependent types"); llvm_unreachable("Should not see dependent types");
@ -1644,20 +1648,6 @@ ASTContext::getTypeInfoImpl(const Type *T) const {
break; break;
} }
case Type::TypeOfExpr:
return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType()
.getTypePtr());
case Type::TypeOf:
return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr());
case Type::Decltype:
return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType()
.getTypePtr());
case Type::UnaryTransform:
return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType());
case Type::Elaborated: case Type::Elaborated:
return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr()); return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr());
@ -1665,18 +1655,6 @@ ASTContext::getTypeInfoImpl(const Type *T) const {
return getTypeInfo( return getTypeInfo(
cast<AttributedType>(T)->getEquivalentType().getTypePtr()); cast<AttributedType>(T)->getEquivalentType().getTypePtr());
case Type::TemplateSpecialization: {
assert(getCanonicalType(T) != T &&
"Cannot request the size of a dependent type");
const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T);
// A type alias template specialization may refer to a typedef with the
// aligned attribute on it.
if (TST->isTypeAlias())
return getTypeInfo(TST->getAliasedType().getTypePtr());
else
return getTypeInfo(getCanonicalType(T));
}
case Type::Atomic: { case Type::Atomic: {
// Start with the base type information. // Start with the base type information.
std::pair<uint64_t, unsigned> Info std::pair<uint64_t, unsigned> Info