forked from OSchip/llvm-project
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
This commit is contained in:
parent
722289f311
commit
dadefde294
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
// FIXME: These templates should trigger errors in C++11 mode.
|
||||
|
||||
template <char const *p>
|
||||
class A {
|
||||
char const *get_p() { return *p; }
|
||||
};
|
||||
template <int p>
|
||||
class B {
|
||||
char const *get_p() { return p; }
|
||||
};
|
||||
|
Loading…
Reference in New Issue