BinaryOperatorExpression,
CxxNullPtrExpression,
IntegerLiteralExpression,
+ BoolLiteralExpression,
IdExpression,
// Statements.
syntax::Leaf *literalToken();
};
+/// Expression for boolean literals. C++ [lex.bool]
+class BoolLiteralExpression final : public Expression {
+public:
+ BoolLiteralExpression() : Expression(NodeKind::BoolLiteralExpression) {}
+ static bool classof(const Node *N) {
+ return N->kind() == NodeKind::BoolLiteralExpression;
+ }
+ syntax::Leaf *literalToken();
+};
+
/// An abstract class for prefix and postfix unary operators.
class UnaryOperatorExpression : public Expression {
public:
return true;
}
+ bool WalkUpFromCXXBoolLiteralExpr(CXXBoolLiteralExpr *S) {
+ Builder.markChildToken(S->getLocation(), syntax::NodeRole::LiteralToken);
+ Builder.foldNode(Builder.getExprRange(S),
+ new (allocator()) syntax::BoolLiteralExpression, S);
+ return true;
+ }
+
bool WalkUpFromCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *S) {
Builder.markChildToken(S->getLocation(), syntax::NodeRole::LiteralToken);
Builder.foldNode(Builder.getExprRange(S),
return OS << "CxxNullPtrExpression";
case NodeKind::IntegerLiteralExpression:
return OS << "IntegerLiteralExpression";
+ case NodeKind::BoolLiteralExpression:
+ return OS << "BoolLiteralExpression";
case NodeKind::PrefixUnaryOperatorExpression:
return OS << "PrefixUnaryOperatorExpression";
case NodeKind::PostfixUnaryOperatorExpression:
findChild(syntax::NodeRole::LiteralToken));
}
+syntax::Leaf *syntax::BoolLiteralExpression::literalToken() {
+ return llvm::cast_or_null<syntax::Leaf>(
+ findChild(syntax::NodeRole::LiteralToken));
+}
+
syntax::Leaf *syntax::CxxNullPtrExpression::nullPtrKeyword() {
return llvm::cast_or_null<syntax::Leaf>(
findChild(syntax::NodeRole::LiteralToken));
Language == Lang_CXX20;
}
+ bool hasBoolType() const {
+ return Language == Lang_C89 || Language == Lang_C99;
+ }
+
bool supportsCXXDynamicExceptionSpecification() const {
return Language == Lang_CXX03 || Language == Lang_CXX11 ||
Language == Lang_CXX14;
)txt"));
}
+TEST_P(SyntaxTreeTest, BoolLiteral) {
+ if (GetParam().hasBoolType()) {
+ return;
+ }
+ EXPECT_TRUE(treeDumpEqual(
+ R"cpp(
+void test() {
+ true;
+ false;
+}
+)cpp",
+ R"txt(
+*: TranslationUnit
+`-SimpleDeclaration
+ |-void
+ |-SimpleDeclarator
+ | |-test
+ | `-ParametersAndQualifiers
+ | |-(
+ | `-)
+ `-CompoundStatement
+ |-{
+ |-ExpressionStatement
+ | |-BoolLiteralExpression
+ | | `-true
+ | `-;
+ |-ExpressionStatement
+ | |-BoolLiteralExpression
+ | | `-false
+ | `-;
+ `-}
+)txt"));
+}
+
TEST_P(SyntaxTreeTest, IntegerLiteral) {
EXPECT_TRUE(treeDumpEqual(
R"cpp(
|-{
|-ExpressionStatement
| |-BinaryOperatorExpression
- | | |-UnknownExpression
+ | | |-BoolLiteralExpression
| | | `-true
| | |-||
- | | `-UnknownExpression
+ | | `-BoolLiteralExpression
| | `-false
| `-;
|-ExpressionStatement
| |-BinaryOperatorExpression
- | | |-UnknownExpression
+ | | |-BoolLiteralExpression
| | | `-true
| | |-or
- | | `-UnknownExpression
+ | | `-BoolLiteralExpression
| | `-false
| `-;
|-ExpressionStatement
|-StaticAssertDeclaration
| |-static_assert
| |-(
-| |-UnknownExpression
+| |-BoolLiteralExpression
| | `-true
| |-,
| |-UnknownExpression
`-StaticAssertDeclaration
|-static_assert
|-(
- |-UnknownExpression
+ |-BoolLiteralExpression
| `-true
|-)
`-;
| |-)
| |-noexcept
| |-(
- | |-UnknownExpression
+ | |-BoolLiteralExpression
| | `-true
| `-)
`-;