diff options
| author | Richard Trieu <rtrieu@google.com> | 2014-07-02 04:39:38 +0000 |
|---|---|---|
| committer | Richard Trieu <rtrieu@google.com> | 2014-07-02 04:39:38 +0000 |
| commit | dadefde29413132a714e4897f24b5425d1a625d1 (patch) | |
| tree | c28b7570481357305e5904750506160c137f1479 /clang/lib | |
| parent | 722289f31139bf6f535cfad248a87cda9ce86cb0 (diff) | |
| download | bcm5719-llvm-dadefde29413132a714e4897f24b5425d1a625d1.tar.gz bcm5719-llvm-dadefde29413132a714e4897f24b5425d1a625d1.zip | |
Prevent Clang from crashing on template code.
Fixes PR20110, where Clang hits an assertion failure when it expects that the
sub-expression of a bit cast to pointer to also be a pointer, but gets a value
instead.
Differential Revision: http://reviews.llvm.org/D4280
llvm-svn: 212160
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 1a49b4ac4fe..cd31f72c65e 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4613,7 +4613,6 @@ static Expr *EvalAddr(Expr *E, SmallVectorImpl<DeclRefExpr *> &refVars, case Stmt::CXXReinterpretCastExprClass: { Expr* SubExpr = cast<CastExpr>(E)->getSubExpr(); switch (cast<CastExpr>(E)->getCastKind()) { - case CK_BitCast: case CK_LValueToRValue: case CK_NoOp: case CK_BaseToDerived: @@ -4628,6 +4627,14 @@ static Expr *EvalAddr(Expr *E, SmallVectorImpl<DeclRefExpr *> &refVars, case CK_ArrayToPointerDecay: return EvalVal(SubExpr, refVars, ParentDecl); + case CK_BitCast: + if (SubExpr->getType()->isAnyPointerType() || + SubExpr->getType()->isBlockPointerType() || + SubExpr->getType()->isObjCQualifiedIdType()) + return EvalAddr(SubExpr, refVars, ParentDecl); + else + return nullptr; + default: return nullptr; } |

