[cfe-commits] r132612 - in /cfe/trunk: include/clang/AST/ include/clang/Basic/ include/clang/Sema/ include/clang/Serialization/ lib/AST/ lib/CodeGen/ lib/Parse/ lib/Sema/ lib/Serialization/ lib/StaticAnalyzer/Core/ test/Parser/ tools/libclang/

Tanya Lattner tonic at nondot.org
Fri Jun 3 22:19:03 PDT 2011


Thanks. My apologies as it compiled and passed all the tests on my side.

-Tanya

On Jun 3, 2011, at 6:59 PM, Nick Lewycky wrote:

> Hi Tanya,
> 
> This is causing a build failure for us:
> 
> From Compiling third_party/llvm/trunk/tools/clang/lib/CodeGen/CGBlocks.cpp:
> In file included from third_party/llvm/trunk/tools/clang/lib/CodeGen/CGBlocks.cpp:14:
> In file included from third_party/llvm/trunk/tools/clang/lib/CodeGen/CGDebugInfo.h:18:
> third_party/llvm/trunk/tools/clang/include/clang/AST/Expr.h:4049:3: error: 'clang::AsTypeExpr' has virtual functions but non-virtual destructor [-Werror,-Wnon-virtual-dtor]
>   ~AsTypeExpr() { }
>   ^
> 1 error generated.
> 
> If it passes tests, I'm going to remove the destructor and the sole virtual function in the Expr hierarchy that you added in this commit. If that's wrong, please go ahead and revert my commit!
> Nick
> 
> On 3 June 2011 17:47, Tanya Lattner <tonic at nondot.org> wrote:
> Author: tbrethou
> Date: Fri Jun  3 19:47:47 2011
> New Revision: 132612
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=132612&view=rev
> Log:
> Add support for builtin astype:
> __builtin_astype(): Used to reinterpreted as another data type of the same size using for both scalar and vector data types.
> Added test case.
> 
> Added:
>    cfe/trunk/test/Parser/opencl-astype.cl
> Modified:
>    cfe/trunk/include/clang/AST/Expr.h
>    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>    cfe/trunk/include/clang/Basic/StmtNodes.td
>    cfe/trunk/include/clang/Basic/TokenKinds.def
>    cfe/trunk/include/clang/Sema/Sema.h
>    cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>    cfe/trunk/lib/AST/ExprClassification.cpp
>    cfe/trunk/lib/AST/ExprConstant.cpp
>    cfe/trunk/lib/AST/ItaniumMangle.cpp
>    cfe/trunk/lib/AST/StmtPrinter.cpp
>    cfe/trunk/lib/AST/StmtProfile.cpp
>    cfe/trunk/lib/CodeGen/CGExprScalar.cpp
>    cfe/trunk/lib/Parse/ParseExpr.cpp
>    cfe/trunk/lib/Sema/SemaExpr.cpp
>    cfe/trunk/lib/Sema/TreeTransform.h
>    cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>    cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>    cfe/trunk/tools/libclang/CXCursor.cpp
> 
> Modified: cfe/trunk/include/clang/AST/Expr.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Expr.h (original)
> +++ cfe/trunk/include/clang/AST/Expr.h Fri Jun  3 19:47:47 2011
> @@ -4026,6 +4026,44 @@
>   child_range children() { return child_range(); }
>  };
> 
> +/// 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 {
> +private:
> +  Expr* SrcExpr;
> +  QualType DstType;
> +  SourceLocation BuiltinLoc, RParenLoc;
> +
> +public:
> +  AsTypeExpr(Expr* SrcExpr, QualType DstType,
> +             ExprValueKind VK, ExprObjectKind OK,
> +             SourceLocation BuiltinLoc, SourceLocation RParenLoc)
> +  : Expr(AsTypeExprClass, DstType, VK, OK, false, false, false),
> +  SrcExpr(SrcExpr), DstType(DstType),
> +  BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {}
> +
> +  /// \brief Build an empty __builtin_astype
> +  explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {}
> +
> +  ~AsTypeExpr() { }
> +
> +  /// getSrcExpr - Return the Expr to be converted.
> +  Expr *getSrcExpr() const { return SrcExpr; }
> +  QualType getDstType() const { return DstType; }
> +
> +  virtual SourceRange getSourceRange() const {
> +    return SourceRange(BuiltinLoc, RParenLoc);
> +  }
> +
> +  static bool classof(const Stmt *T) {
> +    return T->getStmtClass() == AsTypeExprClass;
> +  }
> +  static bool classof(const AsTypeExpr *) { return true; }
> +
> +  // Iterators
> +  child_range children() { return child_range(); }
> +};
>  }  // end namespace clang
> 
>  #endif
> 
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Fri Jun  3 19:47:47 2011
> @@ -1981,6 +1981,9 @@
>  DEF_TRAVERSE_STMT(ImaginaryLiteral, { })
>  DEF_TRAVERSE_STMT(StringLiteral, { })
>  DEF_TRAVERSE_STMT(ObjCStringLiteral, { })
> +
> +// Traverse OpenCL: AsType, Convert.
> +DEF_TRAVERSE_STMT(AsTypeExpr, { })
> 
>  // FIXME: look at the following tricky-seeming exprs to see if we
>  // need to recurse on anything.  These are ones that have methods
> 
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Jun  3 19:47:47 2011
> @@ -4097,6 +4097,10 @@
>  def err_filter_expression_integral : Error<
>   "filter expression type should be an integral value not %0">;
> 
> +// OpenCL warnings and errors.
> +def err_invalid_astype_of_different_size : Error<
> +  "invalid reinterpretation: sizes of %0 and %1 must match">;
> +
>  } // end of sema category
> 
>  } // end of sema component.
> 
> Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
> +++ cfe/trunk/include/clang/Basic/StmtNodes.td Fri Jun  3 19:47:47 2011
> @@ -146,3 +146,5 @@
>  def SEHExceptStmt : Stmt;
>  def SEHFinallyStmt : Stmt;
> 
> +// OpenCL Extensions.
> +def AsTypeExpr : DStmt<Expr>;
> 
> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Fri Jun  3 19:47:47 2011
> @@ -413,6 +413,7 @@
>  ALIAS("read_only", __read_only      , KEYOPENCL)
>  ALIAS("write_only", __write_only    , KEYOPENCL)
>  ALIAS("read_write", __read_write    , KEYOPENCL)
> +KEYWORD(__builtin_astype            , KEYOPENCL)
> 
>  // Borland Extensions.
>  KEYWORD(__pascal                    , KEYALL)
> 
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jun  3 19:47:47 2011
> @@ -2424,6 +2424,13 @@
>   ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc,
>                                         Stmt *Body, Scope *CurScope);
> 
> +  //===---------------------------- OpenCL Features -----------------------===//
> +
> +  /// __builtin_astype(...)
> +  ExprResult ActOnAsTypeExpr(Expr *expr, ParsedType DestTy,
> +                             SourceLocation BuiltinLoc,
> +                             SourceLocation RParenLoc);
> +
>   //===---------------------------- C++ Features --------------------------===//
> 
>   // Act on C++ namespaces
> 
> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Fri Jun  3 19:47:47 2011
> @@ -1003,7 +1003,10 @@
> 
>       // CUDA
> 
> -      EXPR_CUDA_KERNEL_CALL       // CUDAKernelCallExpr
> +      EXPR_CUDA_KERNEL_CALL,       // CUDAKernelCallExpr
> +
> +      // OpenCL
> +      EXPR_ASTYPE // An AsTypeExpr record.
>     };
> 
>     /// \brief The kinds of designators that can occur in a
> 
> Modified: cfe/trunk/lib/AST/ExprClassification.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprClassification.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprClassification.cpp (original)
> +++ cfe/trunk/lib/AST/ExprClassification.cpp Fri Jun  3 19:47:47 2011
> @@ -161,6 +161,7 @@
>   case Expr::InitListExprClass:
>   case Expr::SizeOfPackExprClass:
>   case Expr::SubstNonTypeTemplateParmPackExprClass:
> +  case Expr::AsTypeExprClass:
>     return Cl::CL_PRValue;
> 
>     // Next come the complicated cases.
> 
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Fri Jun  3 19:47:47 2011
> @@ -2770,6 +2770,7 @@
>   case Expr::OpaqueValueExprClass:
>   case Expr::PackExpansionExprClass:
>   case Expr::SubstNonTypeTemplateParmPackExprClass:
> +  case Expr::AsTypeExprClass:
>     return ICEDiag(2, E->getLocStart());
> 
>   case Expr::SizeOfPackExprClass:
> 
> Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)
> +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Fri Jun  3 19:47:47 2011
> @@ -2093,7 +2093,9 @@
>   case Expr::VAArgExprClass:
>   case Expr::CXXUuidofExprClass:
>   case Expr::CXXNoexceptExprClass:
> -  case Expr::CUDAKernelCallExprClass: {
> +  case Expr::CUDAKernelCallExprClass:
> +  case Expr::AsTypeExprClass:
> +  {
>     // As bad as this diagnostic is, it's better than crashing.
>     Diagnostic &Diags = Context.getDiags();
>     unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error,
> 
> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Fri Jun  3 19:47:47 2011
> @@ -1499,6 +1499,13 @@
> 
>  void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {}
> 
> +void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
> +  OS << "__builtin_astype(";
> +  PrintExpr(Node->getSrcExpr());
> +  OS << ", " << Node->getType().getAsString();
> +  OS << ")";
> +}
> +
>  //===----------------------------------------------------------------------===//
>  // Stmt method implementations
>  //===----------------------------------------------------------------------===//
> 
> Modified: cfe/trunk/lib/AST/StmtProfile.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtProfile.cpp (original)
> +++ cfe/trunk/lib/AST/StmtProfile.cpp Fri Jun  3 19:47:47 2011
> @@ -679,6 +679,10 @@
>   VisitCallExpr(S);
>  }
> 
> +void StmtProfiler::VisitAsTypeExpr(AsTypeExpr *S) {
> +  VisitExpr(S);
> +}
> +
>  void StmtProfiler::VisitCXXNamedCastExpr(CXXNamedCastExpr *S) {
>   VisitExplicitCastExpr(S);
>  }
> 
> Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Fri Jun  3 19:47:47 2011
> @@ -508,6 +508,7 @@
>   Value *VisitObjCStringLiteral(const ObjCStringLiteral *E) {
>     return CGF.EmitObjCStringLiteral(E);
>   }
> +  Value *VisitAsTypeExpr(AsTypeExpr *CE);
>  };
>  }  // end anonymous namespace.
> 
> @@ -2545,6 +2546,56 @@
>   return CGF.EmitBlockLiteral(block);
>  }
> 
> +Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) {
> +  Value *Src  = CGF.EmitScalarExpr(E->getSrcExpr());
> +  const llvm::Type * DstTy = ConvertType(E->getDstType());
> +
> +  // Going from vec4->vec3 or vec3->vec4 is a special case and requires
> +  // a shuffle vector instead of a bitcast.
> +  const llvm::Type *SrcTy = Src->getType();
> +  if (isa<llvm::VectorType>(DstTy) && isa<llvm::VectorType>(SrcTy)) {
> +    unsigned numElementsDst = cast<llvm::VectorType>(DstTy)->getNumElements();
> +    unsigned numElementsSrc = cast<llvm::VectorType>(SrcTy)->getNumElements();
> +    if ((numElementsDst == 3 && numElementsSrc == 4)
> +        || (numElementsDst == 4 && numElementsSrc == 3)) {
> +
> +
> +      // In the case of going from int4->float3, a bitcast is needed before
> +      // doing a shuffle.
> +      const llvm::Type *srcElemTy =
> +      cast<llvm::VectorType>(SrcTy)->getElementType();
> +      const llvm::Type *dstElemTy =
> +      cast<llvm::VectorType>(DstTy)->getElementType();
> +
> +      if ((srcElemTy->isIntegerTy() && dstElemTy->isFloatTy())
> +          || (srcElemTy->isFloatTy() && dstElemTy->isIntegerTy())) {
> +        // Create a float type of the same size as the source or destination.
> +        const llvm::VectorType *newSrcTy = llvm::VectorType::get(dstElemTy,
> +                                                                 numElementsSrc);
> +
> +        Src = Builder.CreateBitCast(Src, newSrcTy, "astypeCast");
> +      }
> +
> +      llvm::Value *UnV = llvm::UndefValue::get(Src->getType());
> +
> +      llvm::SmallVector<llvm::Constant*, 3> Args;
> +      Args.push_back(Builder.getInt32(0));
> +      Args.push_back(Builder.getInt32(1));
> +      Args.push_back(Builder.getInt32(2));
> +
> +      if (numElementsDst == 4)
> +        Args.push_back(llvm::UndefValue::get(
> +                                             llvm::Type::getInt32Ty(CGF.getLLVMContext())));
> +
> +      llvm::Constant *Mask = llvm::ConstantVector::get(Args);
> +
> +      return Builder.CreateShuffleVector(Src, UnV, Mask, "astype");
> +    }
> +  }
> +
> +  return Builder.CreateBitCast(Src, DstTy, "astype");
> +}
> +
>  //===----------------------------------------------------------------------===//
>  //                         Entry Point into this File
>  //===----------------------------------------------------------------------===//
> 
> Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExpr.cpp Fri Jun  3 19:47:47 2011
> @@ -785,6 +785,7 @@
>   case tok::kw___builtin_va_arg:
>   case tok::kw___builtin_offsetof:
>   case tok::kw___builtin_choose_expr:
> +  case tok::kw___builtin_astype: // primary-expression: [OCL] as_type()
>     return ParseBuiltinPrimaryExpression();
>   case tok::kw___null:
>     return Actions.ActOnGNUNullExpr(ConsumeToken());
> @@ -1533,6 +1534,7 @@
>  /// [GNU]   '__builtin_choose_expr' '(' assign-expr ',' assign-expr ','
>  ///                                     assign-expr ')'
>  /// [GNU]   '__builtin_types_compatible_p' '(' type-name ',' type-name ')'
> +/// [OCL]   '__builtin_astype' '(' type-name expr ')'
>  ///
>  /// [GNU] offsetof-member-designator:
>  /// [GNU]   identifier
> @@ -1677,7 +1679,35 @@
>                                   Expr2.take(), ConsumeParen());
>     break;
>   }
> +  case tok::kw___builtin_astype: {
> +    // The first argument is an expression to be converted, followed by a comma.
> +    ExprResult Expr(ParseAssignmentExpression());
> +    if (Expr.isInvalid()) {
> +      SkipUntil(tok::r_paren);
> +      return ExprError();
> +    }
> +
> +    if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",
> +                         tok::r_paren))
> +      return ExprError();
> +
> +    // Second argument is the type to bitcast to.
> +    TypeResult DestTy = ParseTypeName();
> +    if (DestTy.isInvalid())
> +      return ExprError();
> +
> +    // Attempt to consume the r-paren.
> +    if (Tok.isNot(tok::r_paren)) {
> +      Diag(Tok, diag::err_expected_rparen);
> +      SkipUntil(tok::r_paren);
> +      return ExprError();
> +    }
> +
> +    Res = Actions.ActOnAsTypeExpr(Expr.take(), DestTy.get(), StartLoc,
> +                                  ConsumeParen());
> +    break;
>   }
> +}
> 
>   if (Res.isInvalid())
>     return ExprError();
> 
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jun  3 19:47:47 2011
> @@ -4995,6 +4995,26 @@
>   return ActOnCallExpr(S, ConfigDR, LLLLoc, execConfig, GGGLoc, 0);
>  }
> 
> +/// ActOnAsTypeExpr - create a new asType (bitcast) from the arguments.
> +///
> +/// __builtin_astype( value, dst type )
> +///
> +ExprResult Sema::ActOnAsTypeExpr(Expr *expr, ParsedType destty,
> +                                 SourceLocation BuiltinLoc,
> +                                 SourceLocation RParenLoc) {
> +  ExprValueKind VK = VK_RValue;
> +  ExprObjectKind OK = OK_Ordinary;
> +  QualType DstTy = GetTypeFromParser(destty);
> +  QualType SrcTy = expr->getType();
> +  if (Context.getTypeSize(DstTy) != Context.getTypeSize(SrcTy))
> +    return ExprError(Diag(BuiltinLoc,
> +                          diag::err_invalid_astype_of_different_size)
> +                     << DstTy.getAsString().c_str()
> +                     << SrcTy.getAsString().c_str()
> +                     << expr->getSourceRange());
> +  return Owned(new (Context) AsTypeExpr(expr, DstTy, VK, OK, BuiltinLoc, RParenLoc));
> +}
> +
>  /// BuildResolvedCallExpr - Build a call to a resolved expression,
>  /// i.e. an expression not of \p OverloadTy.  The expression should
>  /// unary-convert to an expression of function-pointer or
> 
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Fri Jun  3 19:47:47 2011
> @@ -7877,6 +7877,13 @@
>                                          ND, NameInfo, 0);
>  }
> 
> +template<typename Derived>
> +ExprResult
> +TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
> +  assert(false && "Cannot transform asType expressions yet");
> +  return SemaRef.Owned(E);
> +}
> +
>  //===----------------------------------------------------------------------===//
>  // Type reconstruction
>  //===----------------------------------------------------------------------===//
> 
> Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Fri Jun  3 19:47:47 2011
> @@ -189,7 +189,7 @@
>     void VisitOpaqueValueExpr(OpaqueValueExpr *E);
> 
>     // CUDA Expressions
> -    void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E);
> +    void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E);
>   };
>  }
> 
> @@ -2000,6 +2000,10 @@
>     case EXPR_CUDA_KERNEL_CALL:
>       S = new (Context) CUDAKernelCallExpr(*Context, Empty);
>       break;
> +
> +    case EXPR_ASTYPE:
> +      S = new (Context) AsTypeExpr(Empty);
> +      break;
>     }
> 
>     // We hit a STMT_STOP, so we're done with this expression.
> 
> Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Fri Jun  3 19:47:47 2011
> @@ -165,6 +165,8 @@
> 
>     // CUDA Expressions
>     void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E);
> +
> +    void VisitAsTypeExpr(AsTypeExpr *E);
>   };
>  }
> 
> @@ -1433,6 +1435,15 @@
>  }
> 
>  //===----------------------------------------------------------------------===//
> +// OpenCL Expressions and Statements.
> +//===----------------------------------------------------------------------===//
> +void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
> +  VisitExpr(E);
> +  Writer.AddStmt(E->getSrcExpr());
> +  Code = serialization::EXPR_ASTYPE;
> +}
> +
> +//===----------------------------------------------------------------------===//
>  // ASTWriter Implementation
>  //===----------------------------------------------------------------------===//
> 
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Fri Jun  3 19:47:47 2011
> @@ -539,6 +539,7 @@
>     case Stmt::VAArgExprClass:
>     case Stmt::CUDAKernelCallExprClass:
>     case Stmt::OpaqueValueExprClass:
> +    case Stmt::AsTypeExprClass:
>         // Fall through.
> 
>     // Cases we intentionally don't evaluate, since they don't need
> 
> Added: cfe/trunk/test/Parser/opencl-astype.cl
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/opencl-astype.cl?rev=132612&view=auto
> ==============================================================================
> --- cfe/trunk/test/Parser/opencl-astype.cl (added)
> +++ cfe/trunk/test/Parser/opencl-astype.cl Fri Jun  3 19:47:47 2011
> @@ -0,0 +1,20 @@
> +// RUN: %clang_cc1 -fsyntax-only -verify %s
> +#pragma OPENCL EXTENSION cl_khr_fp64 : enable
> +
> +void test_astype() {
> +  float f = 1.0f;
> +  unsigned int i = __builtin_astype(f, unsigned int);
> +
> +  typedef __attribute__(( ext_vector_type(4) ))  int int4;
> +  typedef __attribute__(( ext_vector_type(3) ))  float float3;
> +  typedef __attribute__(( ext_vector_type(4) ))  float float4;
> +  typedef __attribute__(( ext_vector_type(4) ))  double double4;
> +
> +  float4 f4;
> +  double4 d4 = __builtin_astype(f4, double4); // expected-error{{invalid reinterpretation: sizes of double4 and float4 must match}}
> +
> +  // Verify int4->float3, float3->int4 works.
> +  int4 i4;
> +  float3 f3 = __builtin_astype(i4, float3);
> +  i4 = __builtin_astype(f3, int4);
> +}
> \ No newline at end of file
> 
> Modified: cfe/trunk/tools/libclang/CXCursor.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=132612&r1=132611&r2=132612&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CXCursor.cpp (original)
> +++ cfe/trunk/tools/libclang/CXCursor.cpp Fri Jun  3 19:47:47 2011
> @@ -173,6 +173,7 @@
>   case Stmt::OpaqueValueExprClass:
>   case Stmt::PackExpansionExprClass:
>   case Stmt::SizeOfPackExprClass:
> +  case Stmt::AsTypeExprClass:
>     K = CXCursor_UnexposedExpr;
>     break;
> 
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110603/4e648024/attachment.html>


More information about the cfe-commits mailing list