mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-03 19:32:35 +00:00
Add some overloads so that floating point literals can be AST matched properly.
I am not entirely sure whether the implemented sematics are ideal. In particular, should floatLiteral(equals(0.5)) match "0.5f" and should floatLiteral(equals(0.5f)) match "0.5". With the overloads in this patch, the answer to both questions is yes, but I am happy to change that. llvm-svn: 227892
This commit is contained in:
parent
a1c535b5e8
commit
88de3d7284
@ -1456,6 +1456,32 @@ private:
|
||||
const ValueT ExpectedValue;
|
||||
};
|
||||
|
||||
template <>
|
||||
bool ValueEqualsMatcher<FloatingLiteral, double>::matchesNode(
|
||||
const FloatingLiteral &Node) const {
|
||||
if ((&Node.getSemantics()) == &llvm::APFloat::IEEEsingle)
|
||||
return Node.getValue().convertToFloat() == ExpectedValue;
|
||||
if ((&Node.getSemantics()) == &llvm::APFloat::IEEEdouble)
|
||||
return Node.getValue().convertToDouble() == ExpectedValue;
|
||||
return false;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool ValueEqualsMatcher<FloatingLiteral, float>::matchesNode(
|
||||
const FloatingLiteral &Node) const {
|
||||
if ((&Node.getSemantics()) == &llvm::APFloat::IEEEsingle)
|
||||
return Node.getValue().convertToFloat() == ExpectedValue;
|
||||
if ((&Node.getSemantics()) == &llvm::APFloat::IEEEdouble)
|
||||
return Node.getValue().convertToDouble() == ExpectedValue;
|
||||
return false;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool ValueEqualsMatcher<FloatingLiteral, llvm::APFloat>::matchesNode(
|
||||
const FloatingLiteral &Node) const {
|
||||
return ExpectedValue.compare(Node.getValue()) == llvm::APFloat::cmpEqual;
|
||||
}
|
||||
|
||||
/// \brief A VariadicDynCastAllOfMatcher<SourceT, TargetT> object is a
|
||||
/// variadic functor that takes a number of Matcher<TargetT> and returns a
|
||||
/// Matcher<SourceT> that matches TargetT nodes that are matched by all of the
|
||||
|
@ -2104,8 +2104,16 @@ TEST(Matcher, FloatLiterals) {
|
||||
EXPECT_TRUE(matches("double i = 10.0;", HasFloatLiteral));
|
||||
EXPECT_TRUE(matches("double i = 10.0L;", HasFloatLiteral));
|
||||
EXPECT_TRUE(matches("double i = 1e10;", HasFloatLiteral));
|
||||
EXPECT_TRUE(matches("double i = 5.0;", floatLiteral(equals(5.0))));
|
||||
EXPECT_TRUE(matches("double i = 5.0;", floatLiteral(equals(5.0f))));
|
||||
EXPECT_TRUE(
|
||||
matches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(5.0)))));
|
||||
|
||||
EXPECT_TRUE(notMatches("float i = 10;", HasFloatLiteral));
|
||||
EXPECT_TRUE(notMatches("double i = 5.0;", floatLiteral(equals(6.0))));
|
||||
EXPECT_TRUE(notMatches("double i = 5.0;", floatLiteral(equals(6.0f))));
|
||||
EXPECT_TRUE(
|
||||
notMatches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(6.0)))));
|
||||
}
|
||||
|
||||
TEST(Matcher, NullPtrLiteral) {
|
||||
|
Loading…
Reference in New Issue
Block a user