forked from OSchip/llvm-project
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:
parent
f0080b734a
commit
abd6813ff9
|
@ -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; }
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue