The canonical type of typeof or decltype with a dependent type is itself,

not Context.DependentTy. I'll let Anders check in the test case for this one...

llvm-svn: 74975
This commit is contained in:
Douglas Gregor 2009-07-08 00:03:05 +00:00
parent f0080b734a
commit abd6813ff9
3 changed files with 16 additions and 10 deletions

View File

@ -1432,7 +1432,7 @@ public:
/// TypeOfExprType (GCC extension).
class TypeOfExprType : public Type {
Expr *TOExpr;
TypeOfExprType(Expr *E, QualType can);
TypeOfExprType(Expr *E, QualType can = QualType());
friend class ASTContext; // ASTContext creates these.
public:
Expr *getUnderlyingExpr() const { return TOExpr; }
@ -1463,7 +1463,7 @@ public:
/// DecltypeType (C++0x)
class DecltypeType : public Type {
Expr *E;
DecltypeType(Expr *E, QualType can);
DecltypeType(Expr *E, QualType can = QualType());
friend class ASTContext; // ASTContext creates these.
public:
Expr *getUnderlyingExpr() const { return E; }

View File

@ -1901,8 +1901,13 @@ QualType ASTContext::getObjCQualifiedInterfaceType(ObjCInterfaceDecl *Decl,
/// DeclRefExpr's. This doesn't effect the type checker, since it operates
/// on canonical type's (which are always unique).
QualType ASTContext::getTypeOfExprType(Expr *tofExpr) {
QualType Canonical = getCanonicalType(tofExpr->getType());
TypeOfExprType *toe = new (*this,8) TypeOfExprType(tofExpr, Canonical);
TypeOfExprType *toe;
if (tofExpr->isTypeDependent())
toe = new (*this, 8) TypeOfExprType(tofExpr);
else {
QualType Canonical = getCanonicalType(tofExpr->getType());
toe = new (*this,8) TypeOfExprType(tofExpr, Canonical);
}
Types.push_back(toe);
return QualType(toe, 0);
}
@ -1957,8 +1962,13 @@ static QualType getDecltypeForExpr(const Expr *e, ASTContext &Context) {
/// an issue. This doesn't effect the type checker, since it operates
/// on canonical type's (which are always unique).
QualType ASTContext::getDecltypeType(Expr *e) {
QualType T = getDecltypeForExpr(e, *this);
DecltypeType *dt = new (*this, 8) DecltypeType(e, getCanonicalType(T));
DecltypeType *dt;
if (e->isTypeDependent()) // FIXME: canonicalize the expression
dt = new (*this, 8) DecltypeType(e);
else {
QualType T = getDecltypeForExpr(e, *this);
dt = new (*this, 8) DecltypeType(e, getCanonicalType(T));
}
Types.push_back(dt);
return QualType(dt, 0);
}

View File

@ -1072,14 +1072,10 @@ QualType TypedefType::LookThroughTypedefs() const {
TypeOfExprType::TypeOfExprType(Expr *E, QualType can)
: Type(TypeOfExpr, can, E->isTypeDependent()), TOExpr(E) {
assert(!isa<TypedefType>(can) && "Invalid canonical type");
}
DecltypeType::DecltypeType(Expr *E, QualType can)
: Type(Decltype, can, E->isTypeDependent()), E(E) {
assert(can->isDependentType() == E->isTypeDependent() &&
"type dependency mismatch!");
assert(!isa<TypedefType>(can) && "Invalid canonical type");
}
TagType::TagType(TypeClass TC, TagDecl *D, QualType can)