Skip to content

[clang][test] Improve unit tests for Fixed point AST matchers. #134398

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions clang/include/clang/AST/Expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -1564,6 +1564,9 @@ class FixedPointLiteral : public Expr, public APIntStorage {
/// Returns an empty fixed-point literal.
static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty);

/// Returns an internal integer representation of the literal.
llvm::APInt getValue() const { return APIntStorage::getValue(); }

SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }

Expand Down
7 changes: 4 additions & 3 deletions clang/include/clang/ASTMatchers/ASTMatchersInternal.h
Original file line number Diff line number Diff line change
Expand Up @@ -1733,9 +1733,10 @@ class ForEachDescendantMatcher : public MatcherInterface<T> {
template <typename T, typename ValueT>
class ValueEqualsMatcher : public SingleNodeMatcherInterface<T> {
static_assert(std::is_base_of<CharacterLiteral, T>::value ||
std::is_base_of<CXXBoolLiteralExpr, T>::value ||
std::is_base_of<FloatingLiteral, T>::value ||
std::is_base_of<IntegerLiteral, T>::value,
std::is_base_of<CXXBoolLiteralExpr, T>::value ||
std::is_base_of<FloatingLiteral, T>::value ||
std::is_base_of<IntegerLiteral, T>::value ||
std::is_base_of<FixedPointLiteral, T>::value,
"the node must have a getValue method");

public:
Expand Down
61 changes: 61 additions & 0 deletions clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1017,6 +1017,67 @@ TEST_P(ASTMatchersTest, FloatLiteral) {
notMatches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(6.0)))));
}

TEST_P(ASTMatchersTest, FixedPointLiterals) {
StatementMatcher HasFixedPointLiteral = fixedPointLiteral();
EXPECT_TRUE(matchesWithFixedpoint("_Fract i = 0.25r;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Fract i = 0.25hr;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Fract i = 0.25uhr;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Fract i = 0.25ur;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Fract i = 0.25lr;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Fract i = 0.25ulr;", HasFixedPointLiteral));
EXPECT_TRUE(matchesWithFixedpoint("_Accum i = 1.25k;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Accum i = 1.25hk;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Accum i = 1.25uhk;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Accum i = 1.25uk;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Accum i = 1.25lk;", HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Accum i = 1.25ulk;", HasFixedPointLiteral));
EXPECT_TRUE(matchesWithFixedpoint("_Accum decexp1 = 1.575e1k;",
HasFixedPointLiteral));
EXPECT_TRUE(
matchesWithFixedpoint("_Accum hex = 0x1.25fp2k;", HasFixedPointLiteral));
EXPECT_TRUE(matchesWithFixedpoint("_Sat long _Fract i = 0.25r;",
HasFixedPointLiteral));
EXPECT_TRUE(matchesWithFixedpoint("_Sat short _Accum i = 256.0k;",
HasFixedPointLiteral));
EXPECT_TRUE(matchesWithFixedpoint(
"_Accum i = 256.0k;",
fixedPointLiteral(equals(llvm::APInt(32, 0x800000, true)))));
EXPECT_TRUE(matchesWithFixedpoint(
"_Fract i = 0.25ulr;",
fixedPointLiteral(equals(llvm::APInt(32, 0x40000000, false)))));
EXPECT_TRUE(matchesWithFixedpoint(
"_Fract i = 0.5hr;",
fixedPointLiteral(equals(llvm::APInt(8, 0x40, true)))));

EXPECT_TRUE(
notMatchesWithFixedpoint("short _Accum i = 2u;", HasFixedPointLiteral));
EXPECT_TRUE(
notMatchesWithFixedpoint("short _Accum i = 2;", HasFixedPointLiteral));
EXPECT_TRUE(
notMatchesWithFixedpoint("_Accum i = 1.25;", HasFixedPointLiteral));
EXPECT_TRUE(notMatchesWithFixedpoint("_Accum i = (double)(1.25 * 4.5i);",
HasFixedPointLiteral));
EXPECT_TRUE(notMatchesWithFixedpoint(
"_Accum i = 256.0k;",
fixedPointLiteral(equals(llvm::APInt(32, 0x800001, true)))));
EXPECT_TRUE(notMatchesWithFixedpoint(
"_Fract i = 0.25ulr;",
fixedPointLiteral(equals(llvm::APInt(32, 0x40000001, false)))));
EXPECT_TRUE(notMatchesWithFixedpoint(
"_Fract i = 0.5hr;",
fixedPointLiteral(equals(llvm::APInt(8, 0x41, true)))));
}

TEST_P(ASTMatchersTest, CXXNullPtrLiteralExpr) {
if (!GetParam().isCXX11OrLater()) {
return;
Expand Down
14 changes: 14 additions & 0 deletions clang/unittests/ASTMatchers/ASTMatchersTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,20 @@ testing::AssertionResult notMatchesWithOpenMP51(const Twine &Code,
{"-fopenmp=libomp", "-fopenmp-version=51"});
}

template <typename T>
testing::AssertionResult matchesWithFixedpoint(const std::string &Code,
const T &AMatcher) {
return matchesConditionally(Code, AMatcher, true, {"-ffixed-point"},
FileContentMappings(), "input.c");
}

template <typename T>
testing::AssertionResult notMatchesWithFixedpoint(const std::string &Code,
const T &AMatcher) {
return matchesConditionally(Code, AMatcher, false, {"-ffixed-point"},
FileContentMappings(), "input.c");
}

template <typename T>
testing::AssertionResult matchAndVerifyResultConditionally(
const Twine &Code, const T &AMatcher,
Expand Down