summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/redundantcast.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/redundantcast.cxx')
-rw-r--r--compilerplugins/clang/redundantcast.cxx9
1 files changed, 6 insertions, 3 deletions
diff --git a/compilerplugins/clang/redundantcast.cxx b/compilerplugins/clang/redundantcast.cxx
index 6d740ddca883..9604365dc945 100644
--- a/compilerplugins/clang/redundantcast.cxx
+++ b/compilerplugins/clang/redundantcast.cxx
@@ -539,9 +539,12 @@ bool RedundantCast::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr const * exp
//
// std::initializer_list<Foo>{bar, baz}
//
- // ), at least for now:
+ // ), and only to cases where the sub-expression already is a prvalue (and
+ // thus the cast is unlikely meant to create a temporary):
auto const sub = compat::getSubExprAsWritten(expr);
- if (isa<InitListExpr>(sub) || isa<CXXStdInitializerListExpr>(sub)) {
+ if (sub->getValueKind() != VK_RValue || isa<InitListExpr>(sub)
+ || isa<CXXStdInitializerListExpr>(sub))
+ {
return true;
}
@@ -580,7 +583,7 @@ bool RedundantCast::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr const * exp
}
auto const t1 = expr->getTypeAsWritten();
- auto const t2 = compat::getSubExprAsWritten(expr)->getType();
+ auto const t2 = sub->getType();
if (t1 != t2)
return true;
if (!isOkToRemoveArithmeticCast(t1, t2, expr->getSubExpr()))