]> granicus.if.org Git - clang/commitdiff
The canonical type of typeof or decltype with a dependent type is itself,
authorDouglas Gregor <dgregor@apple.com>
Wed, 8 Jul 2009 00:03:05 +0000 (00:03 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 8 Jul 2009 00:03:05 +0000 (00:03 +0000)
not Context.DependentTy. I'll let Anders check in the test case for this one...

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74975 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Type.h
lib/AST/ASTContext.cpp
lib/AST/Type.cpp

index ffba78a3c8cc17427e541be4451bc01a5df8f36f..2beaba637c63e59f740de483e771becdcbcb2216 100644 (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; }
index c59a5d703bb6ce2d61637b006d0c52708153f4f0..de4816c503be4f6bad529ef56aa0b2b1de13ed93 100644 (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);
 }
index 2b307c86e38378008190236c687eeb04a949dc50..fa1c9152f443dac4aadf32a32fef00f1477d6f4a 100644 (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)