/// 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; }
/// 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; }
/// 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);
}
/// 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);
}
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)