]> granicus.if.org Git - clang/commitdiff
Fix the definition of AsTypeExpr. I'm still not sure this
authorJohn McCall <rjmccall@apple.com>
Fri, 15 Jul 2011 06:56:33 +0000 (06:56 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 15 Jul 2011 06:56:33 +0000 (06:56 +0000)
is right --- shouldn't there be a TypeLoc in here somewhere? ---
but at least it doesn't have a redundant QualType and a broken
children() method.

Noticed this while doing things in serialization.

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

include/clang/AST/Expr.h
lib/CodeGen/CGExprScalar.cpp

index 5445a9dae5262fa915fc15e08d18b1a56c3dfa57..11e384f5a285151d094cef759f9409f9db2f96bf 100644 (file)
@@ -4149,11 +4149,14 @@ public:
 /// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2]
 /// This AST node provides support for reinterpreting a type to another
 /// type of the same size.
-class AsTypeExpr : public Expr {
+class AsTypeExpr : public Expr { // Should this be an ExplicitCastExpr?
 private:
-  Expr* SrcExpr;
-  QualType DstType;
+  Stmt *SrcExpr;
   SourceLocation BuiltinLoc, RParenLoc;
+
+  friend class ASTReader;
+  friend class ASTStmtReader;
+  explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {}
   
 public:
   AsTypeExpr(Expr* SrcExpr, QualType DstType,
@@ -4166,15 +4169,16 @@ public:
             SrcExpr->isInstantiationDependent()),
            (DstType->containsUnexpandedParameterPack() ||
             SrcExpr->containsUnexpandedParameterPack())),
-  SrcExpr(SrcExpr), DstType(DstType),
-  BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {}
-  
-  /// \brief Build an empty __builtin_astype
-  explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {}
+  SrcExpr(SrcExpr), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {}
   
   /// getSrcExpr - Return the Expr to be converted.
-  Expr *getSrcExpr() const { return SrcExpr; }
-  QualType getDstType() const { return DstType; }
+  Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
+
+  /// getBuiltinLoc - Return the location of the __builtin_astype token.
+  SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
+
+  /// getRParenLoc - Return the location of final right parenthesis.
+  SourceLocation getRParenLoc() const { return RParenLoc; }
   
   SourceRange getSourceRange() const {
     return SourceRange(BuiltinLoc, RParenLoc);
@@ -4186,7 +4190,7 @@ public:
   static bool classof(const AsTypeExpr *) { return true; }
   
   // Iterators
-  child_range children() { return child_range(); }
+  child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
 };
 }  // end namespace clang
 
index 410e9a736bbe774269d45891719d9a0705c7ea4b..a73e667e780e4e955cffe786555426f21169c7df 100644 (file)
@@ -2578,7 +2578,7 @@ Value *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *block) {
 
 Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) {
   Value *Src  = CGF.EmitScalarExpr(E->getSrcExpr());
-  const llvm::Type * DstTy = ConvertType(E->getDstType());
+  const llvm::Type *DstTy = ConvertType(E->getType());
   
   // Going from vec4->vec3 or vec3->vec4 is a special case and requires
   // a shuffle vector instead of a bitcast.