diff options
| -rw-r--r-- | clang/clang.xcodeproj/project.pbxproj | 10 | ||||
| -rw-r--r-- | clang/include/clang/AST/Expr.h | 38 | ||||
| -rw-r--r-- | clang/include/clang/AST/ExprCXX.h | 27 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHReaderStmt.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriterStmt.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Frontend/RewriteObjC.cpp | 83 | ||||
| -rw-r--r-- | clang/lib/Sema/Sema.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 1 | 
13 files changed, 128 insertions, 57 deletions
diff --git a/clang/clang.xcodeproj/project.pbxproj b/clang/clang.xcodeproj/project.pbxproj index 188d3b3dff2..382c39710c6 100644 --- a/clang/clang.xcodeproj/project.pbxproj +++ b/clang/clang.xcodeproj/project.pbxproj @@ -94,7 +94,7 @@  		35D55B270D81D8C60092E734 /* BasicValueFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35D55B240D81D8C60092E734 /* BasicValueFactory.cpp */; };  		35D55B280D81D8C60092E734 /* CFRefCount.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35D55B250D81D8C60092E734 /* CFRefCount.cpp */; };  		35E194690ECB82FB00F21733 /* SemaCXXScopeSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35E194670ECB82FB00F21733 /* SemaCXXScopeSpec.cpp */; }; -		35E1946A0ECB82FB00F21733 /* SemaNamedCast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35E194680ECB82FB00F21733 /* SemaNamedCast.cpp */; }; +		35E1946A0ECB82FB00F21733 /* SemaCXXCast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35E194680ECB82FB00F21733 /* SemaCXXCast.cpp */; };  		35E1946D0ECB83C100F21733 /* PTHLexer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35E1946C0ECB83C100F21733 /* PTHLexer.cpp */; };  		35EE48B10E0C4CCA00715C54 /* DeclCXX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35EE48AF0E0C4CCA00715C54 /* DeclCXX.cpp */; };  		35EE48B20E0C4CCA00715C54 /* ParentMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35EE48B00E0C4CCA00715C54 /* ParentMap.cpp */; }; @@ -337,7 +337,7 @@  		1A2A54AE0FD1DD1C00F4CE45 /* PrintPreprocessedOutput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PrintPreprocessedOutput.cpp; path = lib/Frontend/PrintPreprocessedOutput.cpp; sourceTree = "<group>"; };  		1A2A54AF0FD1DD1C00F4CE45 /* RewriteBlocks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RewriteBlocks.cpp; path = lib/Frontend/RewriteBlocks.cpp; sourceTree = "<group>"; };  		1A2A54B00FD1DD1C00F4CE45 /* RewriteMacros.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RewriteMacros.cpp; path = lib/Frontend/RewriteMacros.cpp; sourceTree = "<group>"; }; -		1A2A54B10FD1DD1C00F4CE45 /* RewriteObjC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RewriteObjC.cpp; path = lib/Frontend/RewriteObjC.cpp; sourceTree = "<group>"; }; +		1A2A54B10FD1DD1C00F4CE45 /* RewriteObjC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = RewriteObjC.cpp; path = lib/Frontend/RewriteObjC.cpp; sourceTree = "<group>"; tabWidth = 2; };  		1A2A54B20FD1DD1C00F4CE45 /* RewriteTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RewriteTest.cpp; path = lib/Frontend/RewriteTest.cpp; sourceTree = "<group>"; };  		1A2A54B30FD1DD1C00F4CE45 /* StmtXML.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StmtXML.cpp; path = lib/Frontend/StmtXML.cpp; sourceTree = "<group>"; };  		1A2A54B40FD1DD1C00F4CE45 /* Warnings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Warnings.cpp; path = lib/Frontend/Warnings.cpp; sourceTree = "<group>"; }; @@ -458,7 +458,7 @@  		35D55B250D81D8C60092E734 /* CFRefCount.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CFRefCount.cpp; path = lib/Analysis/CFRefCount.cpp; sourceTree = "<group>"; };  		35D55B290D81D8E50092E734 /* BasicValueFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BasicValueFactory.h; path = clang/Analysis/PathSensitive/BasicValueFactory.h; sourceTree = "<group>"; };  		35E194670ECB82FB00F21733 /* SemaCXXScopeSpec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = SemaCXXScopeSpec.cpp; path = lib/Sema/SemaCXXScopeSpec.cpp; sourceTree = "<group>"; tabWidth = 2; }; -		35E194680ECB82FB00F21733 /* SemaNamedCast.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = SemaNamedCast.cpp; path = lib/Sema/SemaNamedCast.cpp; sourceTree = "<group>"; tabWidth = 2; }; +		35E194680ECB82FB00F21733 /* SemaCXXCast.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = SemaCXXCast.cpp; path = lib/Sema/SemaCXXCast.cpp; sourceTree = "<group>"; tabWidth = 2; };  		35E1946C0ECB83C100F21733 /* PTHLexer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PTHLexer.cpp; sourceTree = "<group>"; };  		35EE48AD0E0C4CB200715C54 /* DeclCXX.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = DeclCXX.h; path = clang/AST/DeclCXX.h; sourceTree = "<group>"; tabWidth = 2; };  		35EE48AE0E0C4CB200715C54 /* ParentMap.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = ParentMap.h; path = clang/AST/ParentMap.h; sourceTree = "<group>"; tabWidth = 2; }; @@ -1062,7 +1062,7 @@  				DE67E70E0C020ECF00F66BC5 /* SemaExprCXX.cpp */,  				3599299A0DE2425300A8A33E /* SemaInit.cpp */,  				357EA27C0F2526F300439B60 /* SemaLookup.cpp */, -				35E194680ECB82FB00F21733 /* SemaNamedCast.cpp */, +				35E194680ECB82FB00F21733 /* SemaCXXCast.cpp */,  				35585DBE0EAFBC4500D0A97A /* SemaOverload.cpp */,  				35585DBF0EAFBC4500D0A97A /* SemaOverload.h */,  				DE67E70C0C020ECA00F66BC5 /* SemaStmt.cpp */, @@ -1625,7 +1625,7 @@  				3557D1A90EB136B100C59739 /* InheritViz.cpp in Sources */,  				3557D1F00EB13BB700C59739 /* SemaInherit.cpp in Sources */,  				35E194690ECB82FB00F21733 /* SemaCXXScopeSpec.cpp in Sources */, -				35E1946A0ECB82FB00F21733 /* SemaNamedCast.cpp in Sources */, +				35E1946A0ECB82FB00F21733 /* SemaCXXCast.cpp in Sources */,  				35E1946D0ECB83C100F21733 /* PTHLexer.cpp in Sources */,  				3537AA0E0ECD08A4008F7CDC /* PreprocessorLexer.cpp in Sources */,  				DE8823CB0ED0046600CBC30A /* APValue.cpp in Sources */, diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index c25a66aa423..33450866ae2 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -1154,9 +1154,27 @@ public:  /// representation in the source code (ExplicitCastExpr's derived  /// classes).  class CastExpr : public Expr { +public: +  /// CastKind - the kind of cast this represents. +  enum CastKind { +    /// CK_Unknown - Unknown cast kind. +    /// FIXME: The goal is to get rid of this and make all casts have a  +    /// kind so that the AST client doesn't have to try to figure out what's +    /// going on. +    CK_Unknown, +     +    /// CK_BitCast - Used for reinterpret_cast. +    CK_BitCast, +     +    /// CK_NoOp - Used for const_cast. +    CK_NoOp +  }; +   +private: +  CastKind Kind;    Stmt *Op;  protected: -  CastExpr(StmtClass SC, QualType ty, Expr *op) :  +  CastExpr(StmtClass SC, QualType ty, CastKind kind, Expr *op) :       Expr(SC, ty,           // Cast expressions are type-dependent if the type is           // dependent (C++ [temp.dep.expr]p3). @@ -1164,13 +1182,16 @@ protected:           // Cast expressions are value-dependent if the type is           // dependent or if the subexpression is value-dependent.           ty->isDependentType() || (op && op->isValueDependent())),  -    Op(op) {} +    Kind(kind), Op(op) {}    /// \brief Construct an empty cast.    CastExpr(StmtClass SC, EmptyShell Empty)       : Expr(SC, Empty) { }  public: +  CastKind getCastKind() const { return Kind; } +  void setCastKind(CastKind K) { Kind = K; } +      Expr *getSubExpr() { return cast<Expr>(Op); }    const Expr *getSubExpr() const { return cast<Expr>(Op); }    void setSubExpr(Expr *E) { Op = E; } @@ -1213,8 +1234,8 @@ class ImplicitCastExpr : public CastExpr {    bool LvalueCast;  public: -  ImplicitCastExpr(QualType ty, Expr *op, bool Lvalue) :  -    CastExpr(ImplicitCastExprClass, ty, op), LvalueCast(Lvalue) { } +  ImplicitCastExpr(QualType ty, CastKind kind, Expr *op, bool Lvalue) :  +    CastExpr(ImplicitCastExprClass, ty, kind, op), LvalueCast(Lvalue) { }    /// \brief Construct an empty implicit cast.    explicit ImplicitCastExpr(EmptyShell Shell)  @@ -1259,8 +1280,9 @@ class ExplicitCastExpr : public CastExpr {    QualType TypeAsWritten;  protected: -  ExplicitCastExpr(StmtClass SC, QualType exprTy, Expr *op, QualType writtenTy)  -    : CastExpr(SC, exprTy, op), TypeAsWritten(writtenTy) {} +  ExplicitCastExpr(StmtClass SC, QualType exprTy, CastKind kind, Expr *op,  +                   QualType writtenTy)  +    : CastExpr(SC, exprTy, kind, op), TypeAsWritten(writtenTy) {}    /// \brief Construct an empty explicit cast.    ExplicitCastExpr(StmtClass SC, EmptyShell Shell)  @@ -1291,9 +1313,9 @@ class CStyleCastExpr : public ExplicitCastExpr {    SourceLocation LPLoc; // the location of the left paren    SourceLocation RPLoc; // the location of the right paren  public: -  CStyleCastExpr(QualType exprTy, Expr *op, QualType writtenTy,  +  CStyleCastExpr(QualType exprTy, CastKind kind, Expr *op, QualType writtenTy,                       SourceLocation l, SourceLocation r) :  -    ExplicitCastExpr(CStyleCastExprClass, exprTy, op, writtenTy),  +    ExplicitCastExpr(CStyleCastExprClass, exprTy, kind, op, writtenTy),       LPLoc(l), RPLoc(r) {}    /// \brief Construct an empty C-style explicit cast. diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 86f2d597801..ae1c04a175a 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -112,9 +112,9 @@ private:    SourceLocation Loc; // the location of the casting op  protected: -  CXXNamedCastExpr(StmtClass SC, QualType ty, Expr *op, QualType writtenTy,  -                   SourceLocation l) -    : ExplicitCastExpr(SC, ty, op, writtenTy), Loc(l) {} +  CXXNamedCastExpr(StmtClass SC, QualType ty, CastKind kind, Expr *op,  +                   QualType writtenTy, SourceLocation l) +    : ExplicitCastExpr(SC, ty, kind, op, writtenTy), Loc(l) {}  public:    const char *getCastName() const; @@ -148,8 +148,9 @@ public:  /// @c static_cast<int>(1.0).  class CXXStaticCastExpr : public CXXNamedCastExpr {  public: -  CXXStaticCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l) -    : CXXNamedCastExpr(CXXStaticCastExprClass, ty, op, writtenTy, l) {} +  CXXStaticCastExpr(QualType ty, CastKind kind, Expr *op, QualType writtenTy,  +                    SourceLocation l) +    : CXXNamedCastExpr(CXXStaticCastExprClass, ty, kind, op, writtenTy, l) {}    static bool classof(const Stmt *T) {       return T->getStmtClass() == CXXStaticCastExprClass; @@ -165,8 +166,9 @@ public:  /// @c dynamic_cast<Derived*>(BasePtr).  class CXXDynamicCastExpr : public CXXNamedCastExpr {  public: -  CXXDynamicCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l) -    : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, op, writtenTy, l) {} +  CXXDynamicCastExpr(QualType ty, CastKind kind, Expr *op, QualType writtenTy,  +                     SourceLocation l) +    : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, kind, op, writtenTy, l) {}    static bool classof(const Stmt *T) {       return T->getStmtClass() == CXXDynamicCastExprClass; @@ -184,7 +186,8 @@ class CXXReinterpretCastExpr : public CXXNamedCastExpr {  public:    CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy,                            SourceLocation l) -    : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, op, writtenTy, l) {} +    : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, CK_BitCast, op,  +                       writtenTy, l) {}    static bool classof(const Stmt *T) {       return T->getStmtClass() == CXXReinterpretCastExprClass; @@ -201,7 +204,7 @@ class CXXConstCastExpr : public CXXNamedCastExpr {  public:    CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy,                      SourceLocation l) -    : CXXNamedCastExpr(CXXConstCastExprClass, ty, op, writtenTy, l) {} +    : CXXNamedCastExpr(CXXConstCastExprClass, ty, CK_NoOp, op, writtenTy, l) {}    static bool classof(const Stmt *T) {       return T->getStmtClass() == CXXConstCastExprClass; @@ -529,9 +532,9 @@ class CXXFunctionalCastExpr : public ExplicitCastExpr {    SourceLocation RParenLoc;  public:    CXXFunctionalCastExpr(QualType ty, QualType writtenTy,  -                        SourceLocation tyBeginLoc, Expr *castExpr, -                        SourceLocation rParenLoc) :  -    ExplicitCastExpr(CXXFunctionalCastExprClass, ty, castExpr, writtenTy), +                        SourceLocation tyBeginLoc, CastKind kind,  +                        Expr *castExpr, SourceLocation rParenLoc) :  +    ExplicitCastExpr(CXXFunctionalCastExprClass, ty, kind, castExpr, writtenTy),      TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}    SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp index 16c0e79f4e7..6b97e610f57 100644 --- a/clang/lib/Frontend/PCHReaderStmt.cpp +++ b/clang/lib/Frontend/PCHReaderStmt.cpp @@ -460,6 +460,8 @@ unsigned PCHStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {  unsigned PCHStmtReader::VisitCastExpr(CastExpr *E) {    VisitExpr(E);    E->setSubExpr(cast<Expr>(StmtStack.back())); +  E->setCastKind((CastExpr::CastKind)Record[Idx++]); +    return 1;  } diff --git a/clang/lib/Frontend/PCHWriterStmt.cpp b/clang/lib/Frontend/PCHWriterStmt.cpp index 3e4c6f5fedf..775834b502d 100644 --- a/clang/lib/Frontend/PCHWriterStmt.cpp +++ b/clang/lib/Frontend/PCHWriterStmt.cpp @@ -428,6 +428,7 @@ void PCHStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {  void PCHStmtWriter::VisitCastExpr(CastExpr *E) {    VisitExpr(E);    Writer.WriteSubStmt(E->getSubExpr()); +  Record.push_back(E->getCastKind()); // FIXME: stable encoding  }  void PCHStmtWriter::VisitBinaryOperator(BinaryOperator *E) { diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 523e911be40..1d9f0fa86ca 100644 --- a/clang/lib/Frontend/RewriteObjC.cpp +++ b/clang/lib/Frontend/RewriteObjC.cpp @@ -1155,9 +1155,11 @@ Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV,                                            SourceLocation(), II);        assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");        QualType castT = Context->getPointerType(Context->getTagDeclType(RD)); -      CastExpr *castExpr = new (Context) CStyleCastExpr(castT, IV->getBase(), -                                                         castT,SourceLocation(), -                                                         SourceLocation()); +      CastExpr *castExpr = new (Context) CStyleCastExpr(castT,  +                                                        CastExpr::CK_Unknown, +                                                        IV->getBase(), +                                                        castT,SourceLocation(), +                                                        SourceLocation());        // Don't forget the parens to enforce the proper binding.        ParenExpr *PE = new (Context) ParenExpr(IV->getBase()->getLocStart(),                                                 IV->getBase()->getLocEnd(), @@ -1200,7 +1202,9 @@ Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV,                                            SourceLocation(), II);        assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");        QualType castT = Context->getPointerType(Context->getTagDeclType(RD)); -      CastExpr *castExpr = new (Context) CStyleCastExpr(castT, IV->getBase(), +      CastExpr *castExpr = new (Context) CStyleCastExpr(castT,  +                                                        CastExpr::CK_Unknown, +                                                        IV->getBase(),                                                          castT, SourceLocation(),                                                          SourceLocation());        // Don't forget the parens to enforce the proper binding. @@ -1500,6 +1504,7 @@ Stmt *RewriteObjC::RewriteObjCSynchronizedStmt(ObjCAtSynchronizedStmt *S) {    buf += "  if (!_rethrow) objc_exception_try_exit(&_stack);\n";    buf += "  objc_sync_exit(";    Expr *syncExpr = new (Context) CStyleCastExpr(Context->getObjCIdType(),  +                                                CastExpr::CK_Unknown,                                                  S->getSynchExpr(),                                                   Context->getObjCIdType(),                                                  SourceLocation(), @@ -1781,7 +1786,9 @@ CallExpr *RewriteObjC::SynthesizeCallToFunctionDecl(    // Now, we cast the reference to a pointer to the objc_msgSend type.    QualType pToFunc = Context->getPointerType(msgSendType); -  ImplicitCastExpr *ICE = new (Context) ImplicitCastExpr(pToFunc, DRE,  +  ImplicitCastExpr *ICE = new (Context) ImplicitCastExpr(pToFunc,  +                                                         CastExpr::CK_Unknown, +                                                         DRE,                                                  /*isLvalue=*/false);    const FunctionType *FT = msgSendType->getAsFunctionType(); @@ -2142,8 +2149,11 @@ Stmt *RewriteObjC::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) {                                   Context->getPointerType(DRE->getType()),                                    SourceLocation());    // cast to NSConstantString * -  CastExpr *cast = new (Context) CStyleCastExpr(Exp->getType(), Unop,  -                                         Exp->getType(), SourceLocation(), SourceLocation()); +  CastExpr *cast = new (Context) CStyleCastExpr(Exp->getType(),  +                                                CastExpr::CK_Unknown, +                                                Unop, Exp->getType(),  +                                                SourceLocation(),  +                                                SourceLocation());    ReplaceStmt(Exp, cast);    // delete Exp; leak for now, see RewritePropertySetter() usage for more info.    return cast; @@ -2272,6 +2282,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {        // set the receiver to self, the first argument to all methods.        InitExprs.push_back(          new (Context) CStyleCastExpr(Context->getObjCIdType(),  +                                     CastExpr::CK_Unknown,                       new (Context) DeclRefExpr(CurMethodDef->getSelfDecl(),                                        Context->getObjCIdType(),                                       SourceLocation()), @@ -2290,6 +2301,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {        // To turn off a warning, type-cast to 'id'        InitExprs.push_back( // set 'super class', using objc_getClass().          new (Context) CStyleCastExpr(Context->getObjCIdType(),  +                                     CastExpr::CK_Unknown,                                Cls, Context->getObjCIdType(),                                SourceLocation(), SourceLocation()));         // struct objc_super @@ -2314,7 +2326,8 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {                                   Context->getPointerType(SuperRep->getType()),                                    SourceLocation());          SuperRep = new (Context) CStyleCastExpr(Context->getPointerType(superType),  -                                 SuperRep, Context->getPointerType(superType), +                                 CastExpr::CK_Unknown, SuperRep,  +                                 Context->getPointerType(superType),                                   SourceLocation(), SourceLocation());         } else {                // (struct objc_super) { <exprs from above> } @@ -2355,6 +2368,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {        InitExprs.push_back(          new (Context) CStyleCastExpr(Context->getObjCIdType(),  +                                     CastExpr::CK_Unknown,                       new (Context) DeclRefExpr(CurMethodDef->getSelfDecl(),                                        Context->getObjCIdType(),                                       SourceLocation()), @@ -2374,6 +2388,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {        InitExprs.push_back(          // set 'super class', using objc_getClass().          new (Context) CStyleCastExpr(Context->getObjCIdType(),  +                                     CastExpr::CK_Unknown,          Cls, Context->getObjCIdType(), SourceLocation(), SourceLocation()));         // struct objc_super        QualType superType = getSuperStructType(); @@ -2397,6 +2412,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {                                   Context->getPointerType(SuperRep->getType()),                                    SourceLocation());          SuperRep = new (Context) CStyleCastExpr(Context->getPointerType(superType),  +                                 CastExpr::CK_Unknown,                                   SuperRep, Context->getPointerType(superType),                                   SourceLocation(), SourceLocation());         } else { @@ -2412,7 +2428,8 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {        // Foo<Proto> *.        while (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(recExpr))          recExpr = CE->getSubExpr(); -      recExpr = new (Context) CStyleCastExpr(Context->getObjCIdType(), recExpr, +      recExpr = new (Context) CStyleCastExpr(Context->getObjCIdType(),  +                                      CastExpr::CK_Unknown, recExpr,                                        Context->getObjCIdType(),                                         SourceLocation(), SourceLocation());        MsgExprs.push_back(recExpr); @@ -2438,7 +2455,9 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {        QualType type = ICE->getType()->isObjCQualifiedIdType()                                  ? Context->getObjCIdType()                                  : ICE->getType(); -      userExpr = new (Context) CStyleCastExpr(type, userExpr, type, SourceLocation(), SourceLocation()); +      userExpr = new (Context) CStyleCastExpr(type, CastExpr::CK_Unknown, +                                              userExpr, type, SourceLocation(),  +                                              SourceLocation());      }      // Make id<P...> cast into an 'id' cast.      else if (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(userExpr)) { @@ -2446,6 +2465,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {          while ((CE = dyn_cast<CStyleCastExpr>(userExpr)))            userExpr = CE->getSubExpr();          userExpr = new (Context) CStyleCastExpr(Context->getObjCIdType(),  +                                                CastExpr::CK_Unknown,                                  userExpr, Context->getObjCIdType(),                                   SourceLocation(), SourceLocation());        } @@ -2497,7 +2517,8 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {    // If we don't do this cast, we get the following bizarre warning/note:    // xx.m:13: warning: function called through a non-compatible type    // xx.m:13: note: if this code is reached, the program will abort -  cast = new (Context) CStyleCastExpr(Context->getPointerType(Context->VoidTy), DRE,  +  cast = new (Context) CStyleCastExpr(Context->getPointerType(Context->VoidTy),  +                                      CastExpr::CK_Unknown, DRE,                                  Context->getPointerType(Context->VoidTy),                                 SourceLocation(), SourceLocation()); @@ -2507,7 +2528,9 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {      // If we don't have a method decl, force a variadic cast.      Exp->getMethodDecl() ? Exp->getMethodDecl()->isVariadic() : true, 0);    castType = Context->getPointerType(castType); -  cast = new (Context) CStyleCastExpr(castType, cast, castType, SourceLocation(), SourceLocation()); +  cast = new (Context) CStyleCastExpr(castType, CastExpr::CK_Unknown, cast,  +                                      castType, SourceLocation(),  +                                      SourceLocation());    // Don't forget the parens to enforce the proper binding.    ParenExpr *PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), cast); @@ -2527,7 +2550,8 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {      DeclRefExpr *STDRE = new (Context) DeclRefExpr(MsgSendStretFlavor, msgSendType,                                            SourceLocation());      // Need to cast objc_msgSend_stret to "void *" (see above comment). -    cast = new (Context) CStyleCastExpr(Context->getPointerType(Context->VoidTy), STDRE,  +    cast = new (Context) CStyleCastExpr(Context->getPointerType(Context->VoidTy),  +                                        CastExpr::CK_Unknown, STDRE,                                    Context->getPointerType(Context->VoidTy),                                   SourceLocation(), SourceLocation());      // Now do the "normal" pointer to function cast. @@ -2535,7 +2559,8 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {        &ArgTypes[0], ArgTypes.size(),        Exp->getMethodDecl() ? Exp->getMethodDecl()->isVariadic() : false, 0);      castType = Context->getPointerType(castType); -    cast = new (Context) CStyleCastExpr(castType, cast, castType, SourceLocation(), SourceLocation()); +    cast = new (Context) CStyleCastExpr(castType, CastExpr::CK_Unknown, +                                        cast, castType, SourceLocation(), SourceLocation());      // Don't forget the parens to enforce the proper binding.      PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), cast); @@ -2606,8 +2631,9 @@ Stmt *RewriteObjC::RewriteObjCProtocolExpr(ObjCProtocolExpr *Exp) {    Expr *DerefExpr = new (Context) UnaryOperator(DRE, UnaryOperator::AddrOf,                               Context->getPointerType(DRE->getType()),                               SourceLocation()); -  CastExpr *castExpr = new (Context) CStyleCastExpr(DerefExpr->getType(), DerefExpr,  -                                          DerefExpr->getType(),  +  CastExpr *castExpr = new (Context) CStyleCastExpr(DerefExpr->getType(),  +                                                    CastExpr::CK_Unknown,  +                                          DerefExpr, DerefExpr->getType(),                                             SourceLocation(), SourceLocation());    ReplaceStmt(Exp, castExpr);    ProtocolExprDecls.insert(Exp->getProtocol()); @@ -3925,7 +3951,9 @@ Stmt *RewriteObjC::SynthesizeBlockCall(CallExpr *Exp) {    PtrToFuncCastType = Context->getPointerType(PtrToFuncCastType); -  CastExpr *BlkCast = new (Context) CStyleCastExpr(PtrBlock, Exp->getCallee(), +  CastExpr *BlkCast = new (Context) CStyleCastExpr(PtrBlock,  +                                                   CastExpr::CK_Unknown, +                                                   Exp->getCallee(),                                                     PtrBlock, SourceLocation(),                                                     SourceLocation());    // Don't forget the parens to enforce the proper binding. @@ -3939,7 +3967,8 @@ Stmt *RewriteObjC::SynthesizeBlockCall(CallExpr *Exp) {    MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),                                              FD->getType()); -  CastExpr *FunkCast = new (Context) CStyleCastExpr(PtrToFuncCastType, ME, +  CastExpr *FunkCast = new (Context) CStyleCastExpr(PtrToFuncCastType, +                                                    CastExpr::CK_Unknown, ME,                                                      PtrToFuncCastType,                                                      SourceLocation(),                                                      SourceLocation()); @@ -4207,7 +4236,8 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {    FD = SynthBlockInitFunctionDecl(Func.c_str());    DeclRefExpr *Arg = new (Context) DeclRefExpr(FD, FD->getType(),                                                 SourceLocation()); -  CastExpr *castExpr = new (Context) CStyleCastExpr(Context->VoidPtrTy, Arg,  +  CastExpr *castExpr = new (Context) CStyleCastExpr(Context->VoidPtrTy,  +                                          CastExpr::CK_Unknown, Arg,                                             Context->VoidPtrTy, SourceLocation(),                                                      SourceLocation());    InitExprs.push_back(castExpr);  @@ -4216,7 +4246,8 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {      std::string Buf = "__" + FuncName + "_block_copy_" + BlockNumber;      FD = SynthBlockInitFunctionDecl(Buf.c_str());      Arg = new (Context) DeclRefExpr(FD, FD->getType(), SourceLocation()); -    castExpr = new (Context) CStyleCastExpr(Context->VoidPtrTy, Arg,  +    castExpr = new (Context) CStyleCastExpr(Context->VoidPtrTy,  +                                            CastExpr::CK_Unknown, Arg,                                     Context->VoidPtrTy, SourceLocation(),                                              SourceLocation());      InitExprs.push_back(castExpr);  @@ -4224,7 +4255,8 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {      Buf = "__" + FuncName + "_block_dispose_" + BlockNumber;      FD = SynthBlockInitFunctionDecl(Buf.c_str());      Arg = new (Context) DeclRefExpr(FD, FD->getType(), SourceLocation()); -    castExpr = new (Context) CStyleCastExpr(Context->VoidPtrTy, Arg,  +    castExpr = new (Context) CStyleCastExpr(Context->VoidPtrTy,  +                                            CastExpr::CK_Unknown, Arg,                                     Context->VoidPtrTy, SourceLocation(),                                              SourceLocation());      InitExprs.push_back(castExpr);  @@ -4242,8 +4274,10 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {        } else if (isTopLevelBlockPointerType((*I)->getType())) {          FD = SynthBlockInitFunctionDecl((*I)->getNameAsCString());          Arg = new (Context) DeclRefExpr(FD, FD->getType(), SourceLocation()); -        Exp = new (Context) CStyleCastExpr(Context->VoidPtrTy, Arg,  -                                 Context->VoidPtrTy, SourceLocation(), +        Exp = new (Context) CStyleCastExpr(Context->VoidPtrTy,  +                                           CastExpr::CK_Unknown, Arg,  +                                           Context->VoidPtrTy,  +                                           SourceLocation(),                                             SourceLocation());        } else {          FD = SynthBlockInitFunctionDecl((*I)->getNameAsCString()); @@ -4267,7 +4301,8 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {    NewRep = new (Context) UnaryOperator(NewRep, UnaryOperator::AddrOf,                               Context->getPointerType(NewRep->getType()),                                SourceLocation()); -  NewRep = new (Context) CStyleCastExpr(FType, NewRep, FType, SourceLocation(), +  NewRep = new (Context) CStyleCastExpr(FType, CastExpr::CK_Unknown, NewRep,  +                                        FType, SourceLocation(),                                          SourceLocation());    BlockDeclRefs.clear();    BlockByRefDecls.clear(); diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index f0aea430477..f7fce8527a2 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -217,7 +217,8 @@ void Sema::ImpCastExprToType(Expr *&Expr, QualType Ty, bool isLvalue) {      ImpCast->setType(Ty);      ImpCast->setLvalueCast(isLvalue);    } else  -    Expr = new (Context) ImplicitCastExpr(Ty, Expr, isLvalue); +    Expr = new (Context) ImplicitCastExpr(Ty, CastExpr::CK_Unknown, Expr,  +                                          isLvalue);  }  void Sema::DeleteExpr(ExprTy *E) { diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index e1684ae40ce..afe539cd465 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/lib/Sema/SemaCXXCast.cpp @@ -123,7 +123,8 @@ Sema::ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind,      if (!TypeDependent)        CheckDynamicCast(*this, Ex, DestType, OpRange, DestRange);      return Owned(new (Context)CXXDynamicCastExpr(DestType.getNonReferenceType(), -                                                 Ex, DestType, OpLoc)); +                                                 CastExpr::CK_Unknown, Ex,  +                                                 DestType, OpLoc));    case tok::kw_reinterpret_cast:      if (!TypeDependent) @@ -136,7 +137,8 @@ Sema::ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind,      if (!TypeDependent)        CheckStaticCast(*this, Ex, DestType, OpRange);      return Owned(new (Context) CXXStaticCastExpr(DestType.getNonReferenceType(), -                                                 Ex, DestType, OpLoc)); +                                                 CastExpr::CK_Unknown, Ex,  +                                                 DestType, OpLoc));    }    return ExprError(); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 01875bbcdf2..4c310aaa072 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5169,7 +5169,9 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,      // Adjust the Expr initializer and type.      if (ECD->getInitExpr()) -      ECD->setInitExpr(new (Context) ImplicitCastExpr(NewTy, ECD->getInitExpr(),  +      ECD->setInitExpr(new (Context) ImplicitCastExpr(NewTy,  +                                                      CastExpr::CK_Unknown,  +                                                      ECD->getInitExpr(),                                                         /*isLvalue=*/false));      if (getLangOptions().CPlusPlus)        // C++ [dcl.enum]p4: Following the closing brace of an diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 9edf259ae61..b311cf74388 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3075,8 +3075,8 @@ Sema::ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,    if (CheckCastTypes(SourceRange(LParenLoc, RParenLoc), castType, castExpr))      return ExprError();    return Owned(new (Context) CStyleCastExpr(castType.getNonReferenceType(), -                                            castExpr, castType, -                                            LParenLoc, RParenLoc)); +                                            CastExpr::CK_Unknown, castExpr,  +                                            castType, LParenLoc, RParenLoc));  }  /// Note that lhs is not null here, even if this is the gnu "x ?: y" extension. diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index dc16dda9feb..8ff28405e8e 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -207,8 +207,9 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep,        return ExprError();      exprs.release();      return Owned(new (Context) CXXFunctionalCastExpr(Ty.getNonReferenceType(), -                                                     Ty, TyBeginLoc, Exprs[0], -                                                     RParenLoc)); +                                                     Ty, TyBeginLoc,  +                                                     CastExpr::CK_Unknown,  +                                                     Exprs[0], RParenLoc));    }    if (const RecordType *RT = Ty->getAs<RecordType>()) { diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 2ec318c48d5..ff3b4efe99f 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -2335,6 +2335,7 @@ Sema::AddConversionCandidate(CXXConversionDecl *Conversion,    DeclRefExpr ConversionRef(Conversion, Conversion->getType(),                               SourceLocation());    ImplicitCastExpr ConversionFn(Context.getPointerType(Conversion->getType()), +                                CastExpr::CK_Unknown,                                  &ConversionRef, false);    // Note that it is safe to allocate CallExpr on the stack here because  diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index 31c184fbc28..a09e24acf47 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -856,6 +856,7 @@ Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(    ImplicitCastExpr *ICE =       new (SemaRef.Context) ImplicitCastExpr(E->getType(), +                                           E->getCastKind(),                                             (Expr *)SubExpr.release(),                                             E->isLvalueCast());    return SemaRef.Owned(ICE);  | 

