ast: Add 'Expression' suffix to literals (2/2)
Literals are now expressions, so in keeping with all the other
expression types, suffix the class name with Expression.
I'm not overly keen on requiring everything to have an Expression
suffix, but consistency is better than personal preference.
Note: this should have been part of 30848b6
, but I managed to drop
this change instead of squashing it. Opps.
Bug: tint:888
Change-Id: Idfaf96abe165a6bf5028e60a160e7408aa2bf9db
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/68943
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
parent
6595b386b5
commit
5c9a80b6f6
|
@ -30,7 +30,7 @@ std::string SizeExprToString(const Expression* size,
|
||||||
if (auto* ident = size->As<IdentifierExpression>()) {
|
if (auto* ident = size->As<IdentifierExpression>()) {
|
||||||
return symbols.NameFor(ident->symbol);
|
return symbols.NameFor(ident->symbol);
|
||||||
}
|
}
|
||||||
if (auto* literal = size->As<IntLiteral>()) {
|
if (auto* literal = size->As<IntLiteralExpression>()) {
|
||||||
return std::to_string(literal->ValueAsU32());
|
return std::to_string(literal->ValueAsU32());
|
||||||
}
|
}
|
||||||
// This will never be exposed to the user as the Resolver will reject this
|
// This will never be exposed to the user as the Resolver will reject this
|
||||||
|
|
|
@ -16,20 +16,23 @@
|
||||||
|
|
||||||
#include "src/program_builder.h"
|
#include "src/program_builder.h"
|
||||||
|
|
||||||
TINT_INSTANTIATE_TYPEINFO(tint::ast::BoolLiteral);
|
TINT_INSTANTIATE_TYPEINFO(tint::ast::BoolLiteralExpression);
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
BoolLiteral::BoolLiteral(ProgramID pid, const Source& src, bool val)
|
BoolLiteralExpression::BoolLiteralExpression(ProgramID pid,
|
||||||
|
const Source& src,
|
||||||
|
bool val)
|
||||||
: Base(pid, src), value(val) {}
|
: Base(pid, src), value(val) {}
|
||||||
|
|
||||||
BoolLiteral::~BoolLiteral() = default;
|
BoolLiteralExpression::~BoolLiteralExpression() = default;
|
||||||
|
|
||||||
const BoolLiteral* BoolLiteral::Clone(CloneContext* ctx) const {
|
const BoolLiteralExpression* BoolLiteralExpression::Clone(
|
||||||
|
CloneContext* ctx) const {
|
||||||
// Clone arguments outside of create() call to have deterministic ordering
|
// Clone arguments outside of create() call to have deterministic ordering
|
||||||
auto src = ctx->Clone(source);
|
auto src = ctx->Clone(source);
|
||||||
return ctx->dst->create<BoolLiteral>(src, value);
|
return ctx->dst->create<BoolLiteralExpression>(src, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -23,20 +23,21 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// A boolean literal
|
/// A boolean literal
|
||||||
class BoolLiteral : public Castable<BoolLiteral, Literal> {
|
class BoolLiteralExpression
|
||||||
|
: public Castable<BoolLiteralExpression, LiteralExpression> {
|
||||||
public:
|
public:
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param pid the identifier of the program that owns this node
|
/// @param pid the identifier of the program that owns this node
|
||||||
/// @param src the source of this node
|
/// @param src the source of this node
|
||||||
/// @param value the bool literals value
|
/// @param value the bool literals value
|
||||||
BoolLiteral(ProgramID pid, const Source& src, bool value);
|
BoolLiteralExpression(ProgramID pid, const Source& src, bool value);
|
||||||
~BoolLiteral() override;
|
~BoolLiteralExpression() override;
|
||||||
|
|
||||||
/// Clones this node and all transitive child nodes using the `CloneContext`
|
/// Clones this node and all transitive child nodes using the `CloneContext`
|
||||||
/// `ctx`.
|
/// `ctx`.
|
||||||
/// @param ctx the clone context
|
/// @param ctx the clone context
|
||||||
/// @return the newly cloned node
|
/// @return the newly cloned node
|
||||||
const BoolLiteral* Clone(CloneContext* ctx) const override;
|
const BoolLiteralExpression* Clone(CloneContext* ctx) const override;
|
||||||
|
|
||||||
/// The boolean literal value
|
/// The boolean literal value
|
||||||
const bool value;
|
const bool value;
|
||||||
|
|
|
@ -18,17 +18,17 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using BoolLiteralTest = TestHelper;
|
using BoolLiteralExpressionTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(BoolLiteralTest, True) {
|
TEST_F(BoolLiteralExpressionTest, True) {
|
||||||
auto* b = create<BoolLiteral>(true);
|
auto* b = create<BoolLiteralExpression>(true);
|
||||||
ASSERT_TRUE(b->Is<BoolLiteral>());
|
ASSERT_TRUE(b->Is<BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(b->value);
|
ASSERT_TRUE(b->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BoolLiteralTest, False) {
|
TEST_F(BoolLiteralExpressionTest, False) {
|
||||||
auto* b = create<BoolLiteral>(false);
|
auto* b = create<BoolLiteralExpression>(false);
|
||||||
ASSERT_TRUE(b->Is<BoolLiteral>());
|
ASSERT_TRUE(b->Is<BoolLiteralExpression>());
|
||||||
ASSERT_FALSE(b->value);
|
ASSERT_FALSE(b->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// A list of case literals
|
/// A list of case literals
|
||||||
using CaseSelectorList = std::vector<const IntLiteral*>;
|
using CaseSelectorList = std::vector<const IntLiteralExpression*>;
|
||||||
|
|
||||||
/// A case statement
|
/// A case statement
|
||||||
class CaseStatement : public Castable<CaseStatement, Statement> {
|
class CaseStatement : public Castable<CaseStatement, Statement> {
|
||||||
|
|
|
@ -27,7 +27,7 @@ using CaseStatementTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(CaseStatementTest, Creation_i32) {
|
TEST_F(CaseStatementTest, Creation_i32) {
|
||||||
CaseSelectorList b;
|
CaseSelectorList b;
|
||||||
auto* selector = create<SintLiteral>(2);
|
auto* selector = create<SintLiteralExpression>(2);
|
||||||
b.push_back(selector);
|
b.push_back(selector);
|
||||||
|
|
||||||
auto* discard = create<DiscardStatement>();
|
auto* discard = create<DiscardStatement>();
|
||||||
|
@ -42,7 +42,7 @@ TEST_F(CaseStatementTest, Creation_i32) {
|
||||||
|
|
||||||
TEST_F(CaseStatementTest, Creation_u32) {
|
TEST_F(CaseStatementTest, Creation_u32) {
|
||||||
CaseSelectorList b;
|
CaseSelectorList b;
|
||||||
auto* selector = create<UintLiteral>(2u);
|
auto* selector = create<UintLiteralExpression>(2u);
|
||||||
b.push_back(selector);
|
b.push_back(selector);
|
||||||
|
|
||||||
auto* discard = create<DiscardStatement>();
|
auto* discard = create<DiscardStatement>();
|
||||||
|
@ -57,7 +57,7 @@ TEST_F(CaseStatementTest, Creation_u32) {
|
||||||
|
|
||||||
TEST_F(CaseStatementTest, Creation_WithSource) {
|
TEST_F(CaseStatementTest, Creation_WithSource) {
|
||||||
CaseSelectorList b;
|
CaseSelectorList b;
|
||||||
b.push_back(create<SintLiteral>(2));
|
b.push_back(create<SintLiteralExpression>(2));
|
||||||
|
|
||||||
auto* body = create<BlockStatement>(StatementList{
|
auto* body = create<BlockStatement>(StatementList{
|
||||||
create<DiscardStatement>(),
|
create<DiscardStatement>(),
|
||||||
|
@ -78,7 +78,7 @@ TEST_F(CaseStatementTest, IsDefault_WithoutSelectors) {
|
||||||
|
|
||||||
TEST_F(CaseStatementTest, IsDefault_WithSelectors) {
|
TEST_F(CaseStatementTest, IsDefault_WithSelectors) {
|
||||||
CaseSelectorList b;
|
CaseSelectorList b;
|
||||||
b.push_back(create<SintLiteral>(2));
|
b.push_back(create<SintLiteralExpression>(2));
|
||||||
|
|
||||||
auto* c = create<CaseStatement>(b, create<BlockStatement>(StatementList{}));
|
auto* c = create<CaseStatement>(b, create<BlockStatement>(StatementList{}));
|
||||||
EXPECT_FALSE(c->IsDefault());
|
EXPECT_FALSE(c->IsDefault());
|
||||||
|
@ -125,8 +125,9 @@ TEST_F(CaseStatementTest, Assert_DifferentProgramID_Selector) {
|
||||||
{
|
{
|
||||||
ProgramBuilder b1;
|
ProgramBuilder b1;
|
||||||
ProgramBuilder b2;
|
ProgramBuilder b2;
|
||||||
b1.create<CaseStatement>(CaseSelectorList{b2.create<SintLiteral>(2)},
|
b1.create<CaseStatement>(
|
||||||
b1.create<BlockStatement>(StatementList{}));
|
CaseSelectorList{b2.create<SintLiteralExpression>(2)},
|
||||||
|
b1.create<BlockStatement>(StatementList{}));
|
||||||
},
|
},
|
||||||
"internal compiler error");
|
"internal compiler error");
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,20 +18,23 @@
|
||||||
|
|
||||||
#include "src/program_builder.h"
|
#include "src/program_builder.h"
|
||||||
|
|
||||||
TINT_INSTANTIATE_TYPEINFO(tint::ast::FloatLiteral);
|
TINT_INSTANTIATE_TYPEINFO(tint::ast::FloatLiteralExpression);
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
FloatLiteral::FloatLiteral(ProgramID pid, const Source& src, float val)
|
FloatLiteralExpression::FloatLiteralExpression(ProgramID pid,
|
||||||
|
const Source& src,
|
||||||
|
float val)
|
||||||
: Base(pid, src), value(val) {}
|
: Base(pid, src), value(val) {}
|
||||||
|
|
||||||
FloatLiteral::~FloatLiteral() = default;
|
FloatLiteralExpression::~FloatLiteralExpression() = default;
|
||||||
|
|
||||||
const FloatLiteral* FloatLiteral::Clone(CloneContext* ctx) const {
|
const FloatLiteralExpression* FloatLiteralExpression::Clone(
|
||||||
|
CloneContext* ctx) const {
|
||||||
// Clone arguments outside of create() call to have deterministic ordering
|
// Clone arguments outside of create() call to have deterministic ordering
|
||||||
auto src = ctx->Clone(source);
|
auto src = ctx->Clone(source);
|
||||||
return ctx->dst->create<FloatLiteral>(src, value);
|
return ctx->dst->create<FloatLiteralExpression>(src, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -23,20 +23,21 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// A float literal
|
/// A float literal
|
||||||
class FloatLiteral : public Castable<FloatLiteral, Literal> {
|
class FloatLiteralExpression
|
||||||
|
: public Castable<FloatLiteralExpression, LiteralExpression> {
|
||||||
public:
|
public:
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param pid the identifier of the program that owns this node
|
/// @param pid the identifier of the program that owns this node
|
||||||
/// @param src the source of this node
|
/// @param src the source of this node
|
||||||
/// @param value the float literals value
|
/// @param value the float literals value
|
||||||
FloatLiteral(ProgramID pid, const Source& src, float value);
|
FloatLiteralExpression(ProgramID pid, const Source& src, float value);
|
||||||
~FloatLiteral() override;
|
~FloatLiteralExpression() override;
|
||||||
|
|
||||||
/// Clones this node and all transitive child nodes using the `CloneContext`
|
/// Clones this node and all transitive child nodes using the `CloneContext`
|
||||||
/// `ctx`.
|
/// `ctx`.
|
||||||
/// @param ctx the clone context
|
/// @param ctx the clone context
|
||||||
/// @return the newly cloned node
|
/// @return the newly cloned node
|
||||||
const FloatLiteral* Clone(CloneContext* ctx) const override;
|
const FloatLiteralExpression* Clone(CloneContext* ctx) const override;
|
||||||
|
|
||||||
/// The float literal value
|
/// The float literal value
|
||||||
const float value;
|
const float value;
|
||||||
|
|
|
@ -18,11 +18,11 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using FloatLiteralTest = TestHelper;
|
using FloatLiteralExpressionTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(FloatLiteralTest, Value) {
|
TEST_F(FloatLiteralExpressionTest, Value) {
|
||||||
auto* f = create<FloatLiteral>(47.2f);
|
auto* f = create<FloatLiteralExpression>(47.2f);
|
||||||
ASSERT_TRUE(f->Is<FloatLiteral>());
|
ASSERT_TRUE(f->Is<FloatLiteralExpression>());
|
||||||
EXPECT_EQ(f->value, 47.2f);
|
EXPECT_EQ(f->value, 47.2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,14 +14,15 @@
|
||||||
|
|
||||||
#include "src/ast/int_literal_expression.h"
|
#include "src/ast/int_literal_expression.h"
|
||||||
|
|
||||||
TINT_INSTANTIATE_TYPEINFO(tint::ast::IntLiteral);
|
TINT_INSTANTIATE_TYPEINFO(tint::ast::IntLiteralExpression);
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
IntLiteral::IntLiteral(ProgramID pid, const Source& src) : Base(pid, src) {}
|
IntLiteralExpression::IntLiteralExpression(ProgramID pid, const Source& src)
|
||||||
|
: Base(pid, src) {}
|
||||||
|
|
||||||
IntLiteral::~IntLiteral() = default;
|
IntLiteralExpression::~IntLiteralExpression() = default;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
|
@ -21,9 +21,10 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// An integer literal. This could be either signed or unsigned.
|
/// An integer literal. This could be either signed or unsigned.
|
||||||
class IntLiteral : public Castable<IntLiteral, Literal> {
|
class IntLiteralExpression
|
||||||
|
: public Castable<IntLiteralExpression, LiteralExpression> {
|
||||||
public:
|
public:
|
||||||
~IntLiteral() override;
|
~IntLiteralExpression() override;
|
||||||
|
|
||||||
/// @returns the literal value as a u32
|
/// @returns the literal value as a u32
|
||||||
virtual uint32_t ValueAsU32() const = 0;
|
virtual uint32_t ValueAsU32() const = 0;
|
||||||
|
@ -35,7 +36,7 @@ class IntLiteral : public Castable<IntLiteral, Literal> {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param pid the identifier of the program that owns this node
|
/// @param pid the identifier of the program that owns this node
|
||||||
/// @param src the source of this node
|
/// @param src the source of this node
|
||||||
IntLiteral(ProgramID pid, const Source& src);
|
IntLiteralExpression(ProgramID pid, const Source& src);
|
||||||
}; // namespace ast
|
}; // namespace ast
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -18,16 +18,16 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using IntLiteralTest = TestHelper;
|
using IntLiteralExpressionTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(IntLiteralTest, Sint_IsInt) {
|
TEST_F(IntLiteralExpressionTest, Sint_IsInt) {
|
||||||
auto* i = create<SintLiteral>(47);
|
auto* i = create<SintLiteralExpression>(47);
|
||||||
ASSERT_TRUE(i->Is<IntLiteral>());
|
ASSERT_TRUE(i->Is<IntLiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(IntLiteralTest, Uint_IsInt) {
|
TEST_F(IntLiteralExpressionTest, Uint_IsInt) {
|
||||||
auto* i = create<UintLiteral>(42);
|
auto* i = create<UintLiteralExpression>(42);
|
||||||
EXPECT_TRUE(i->Is<IntLiteral>());
|
EXPECT_TRUE(i->Is<IntLiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -14,14 +14,15 @@
|
||||||
|
|
||||||
#include "src/ast/literal_expression.h"
|
#include "src/ast/literal_expression.h"
|
||||||
|
|
||||||
TINT_INSTANTIATE_TYPEINFO(tint::ast::Literal);
|
TINT_INSTANTIATE_TYPEINFO(tint::ast::LiteralExpression);
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
Literal::Literal(ProgramID pid, const Source& src) : Base(pid, src) {}
|
LiteralExpression::LiteralExpression(ProgramID pid, const Source& src)
|
||||||
|
: Base(pid, src) {}
|
||||||
|
|
||||||
Literal::~Literal() = default;
|
LiteralExpression::~LiteralExpression() = default;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
|
@ -23,15 +23,15 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// Base class for a literal value expressions
|
/// Base class for a literal value expressions
|
||||||
class Literal : public Castable<Literal, Expression> {
|
class LiteralExpression : public Castable<LiteralExpression, Expression> {
|
||||||
public:
|
public:
|
||||||
~Literal() override;
|
~LiteralExpression() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param pid the identifier of the program that owns this node
|
/// @param pid the identifier of the program that owns this node
|
||||||
/// @param src the input source
|
/// @param src the input source
|
||||||
Literal(ProgramID pid, const Source& src);
|
LiteralExpression(ProgramID pid, const Source& src);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -16,24 +16,27 @@
|
||||||
|
|
||||||
#include "src/program_builder.h"
|
#include "src/program_builder.h"
|
||||||
|
|
||||||
TINT_INSTANTIATE_TYPEINFO(tint::ast::SintLiteral);
|
TINT_INSTANTIATE_TYPEINFO(tint::ast::SintLiteralExpression);
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
SintLiteral::SintLiteral(ProgramID pid, const Source& src, int32_t val)
|
SintLiteralExpression::SintLiteralExpression(ProgramID pid,
|
||||||
|
const Source& src,
|
||||||
|
int32_t val)
|
||||||
: Base(pid, src), value(val) {}
|
: Base(pid, src), value(val) {}
|
||||||
|
|
||||||
SintLiteral::~SintLiteral() = default;
|
SintLiteralExpression::~SintLiteralExpression() = default;
|
||||||
|
|
||||||
uint32_t SintLiteral::ValueAsU32() const {
|
uint32_t SintLiteralExpression::ValueAsU32() const {
|
||||||
return static_cast<uint32_t>(value);
|
return static_cast<uint32_t>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SintLiteral* SintLiteral::Clone(CloneContext* ctx) const {
|
const SintLiteralExpression* SintLiteralExpression::Clone(
|
||||||
|
CloneContext* ctx) const {
|
||||||
// Clone arguments outside of create() call to have deterministic ordering
|
// Clone arguments outside of create() call to have deterministic ordering
|
||||||
auto src = ctx->Clone(source);
|
auto src = ctx->Clone(source);
|
||||||
return ctx->dst->create<SintLiteral>(src, value);
|
return ctx->dst->create<SintLiteralExpression>(src, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -23,14 +23,15 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// A signed int literal
|
/// A signed int literal
|
||||||
class SintLiteral : public Castable<SintLiteral, IntLiteral> {
|
class SintLiteralExpression
|
||||||
|
: public Castable<SintLiteralExpression, IntLiteralExpression> {
|
||||||
public:
|
public:
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param pid the identifier of the program that owns this node
|
/// @param pid the identifier of the program that owns this node
|
||||||
/// @param src the source of this node
|
/// @param src the source of this node
|
||||||
/// @param value the signed int literals value
|
/// @param value the signed int literals value
|
||||||
SintLiteral(ProgramID pid, const Source& src, int32_t value);
|
SintLiteralExpression(ProgramID pid, const Source& src, int32_t value);
|
||||||
~SintLiteral() override;
|
~SintLiteralExpression() override;
|
||||||
|
|
||||||
/// @returns the literal value as a u32
|
/// @returns the literal value as a u32
|
||||||
uint32_t ValueAsU32() const override;
|
uint32_t ValueAsU32() const override;
|
||||||
|
@ -39,7 +40,7 @@ class SintLiteral : public Castable<SintLiteral, IntLiteral> {
|
||||||
/// `ctx`.
|
/// `ctx`.
|
||||||
/// @param ctx the clone context
|
/// @param ctx the clone context
|
||||||
/// @return the newly cloned node
|
/// @return the newly cloned node
|
||||||
const SintLiteral* Clone(CloneContext* ctx) const override;
|
const SintLiteralExpression* Clone(CloneContext* ctx) const override;
|
||||||
|
|
||||||
/// The int literal value
|
/// The int literal value
|
||||||
const int32_t value;
|
const int32_t value;
|
||||||
|
|
|
@ -18,11 +18,11 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using SintLiteralTest = TestHelper;
|
using SintLiteralExpressionTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(SintLiteralTest, Value) {
|
TEST_F(SintLiteralExpressionTest, Value) {
|
||||||
auto* i = create<SintLiteral>(47);
|
auto* i = create<SintLiteralExpression>(47);
|
||||||
ASSERT_TRUE(i->Is<SintLiteral>());
|
ASSERT_TRUE(i->Is<SintLiteralExpression>());
|
||||||
EXPECT_EQ(i->value, 47);
|
EXPECT_EQ(i->value, 47);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ using SwitchStatementTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(SwitchStatementTest, Creation) {
|
TEST_F(SwitchStatementTest, Creation) {
|
||||||
CaseSelectorList lit;
|
CaseSelectorList lit;
|
||||||
lit.push_back(create<SintLiteral>(1));
|
lit.push_back(create<SintLiteralExpression>(1));
|
||||||
|
|
||||||
auto* ident = Expr("ident");
|
auto* ident = Expr("ident");
|
||||||
CaseStatementList body;
|
CaseStatementList body;
|
||||||
|
@ -50,7 +50,7 @@ TEST_F(SwitchStatementTest, Creation_WithSource) {
|
||||||
|
|
||||||
TEST_F(SwitchStatementTest, IsSwitch) {
|
TEST_F(SwitchStatementTest, IsSwitch) {
|
||||||
CaseSelectorList lit;
|
CaseSelectorList lit;
|
||||||
lit.push_back(create<SintLiteral>(2));
|
lit.push_back(create<SintLiteralExpression>(2));
|
||||||
|
|
||||||
auto* ident = Expr("ident");
|
auto* ident = Expr("ident");
|
||||||
CaseStatementList body;
|
CaseStatementList body;
|
||||||
|
|
|
@ -122,7 +122,7 @@ bool TraverseExpressions(const ast::Expression* root,
|
||||||
to_visit.push_back(member->structure);
|
to_visit.push_back(member->structure);
|
||||||
} else if (auto* unary = expr->As<UnaryOpExpression>()) {
|
} else if (auto* unary = expr->As<UnaryOpExpression>()) {
|
||||||
to_visit.push_back(unary->expr);
|
to_visit.push_back(unary->expr);
|
||||||
} else if (expr->IsAnyOf<Literal, IdentifierExpression,
|
} else if (expr->IsAnyOf<LiteralExpression, IdentifierExpression,
|
||||||
PhonyExpression>()) {
|
PhonyExpression>()) {
|
||||||
// Leaf expression
|
// Leaf expression
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -16,24 +16,27 @@
|
||||||
|
|
||||||
#include "src/program_builder.h"
|
#include "src/program_builder.h"
|
||||||
|
|
||||||
TINT_INSTANTIATE_TYPEINFO(tint::ast::UintLiteral);
|
TINT_INSTANTIATE_TYPEINFO(tint::ast::UintLiteralExpression);
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
UintLiteral::UintLiteral(ProgramID pid, const Source& src, uint32_t val)
|
UintLiteralExpression::UintLiteralExpression(ProgramID pid,
|
||||||
|
const Source& src,
|
||||||
|
uint32_t val)
|
||||||
: Base(pid, src), value(val) {}
|
: Base(pid, src), value(val) {}
|
||||||
|
|
||||||
UintLiteral::~UintLiteral() = default;
|
UintLiteralExpression::~UintLiteralExpression() = default;
|
||||||
|
|
||||||
uint32_t UintLiteral::ValueAsU32() const {
|
uint32_t UintLiteralExpression::ValueAsU32() const {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const UintLiteral* UintLiteral::Clone(CloneContext* ctx) const {
|
const UintLiteralExpression* UintLiteralExpression::Clone(
|
||||||
|
CloneContext* ctx) const {
|
||||||
// Clone arguments outside of create() call to have deterministic ordering
|
// Clone arguments outside of create() call to have deterministic ordering
|
||||||
auto src = ctx->Clone(source);
|
auto src = ctx->Clone(source);
|
||||||
return ctx->dst->create<UintLiteral>(src, value);
|
return ctx->dst->create<UintLiteralExpression>(src, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -23,14 +23,15 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// A uint literal
|
/// A uint literal
|
||||||
class UintLiteral : public Castable<UintLiteral, IntLiteral> {
|
class UintLiteralExpression
|
||||||
|
: public Castable<UintLiteralExpression, IntLiteralExpression> {
|
||||||
public:
|
public:
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param pid the identifier of the program that owns this node
|
/// @param pid the identifier of the program that owns this node
|
||||||
/// @param src the source of this node
|
/// @param src the source of this node
|
||||||
/// @param value the uint literals value
|
/// @param value the uint literals value
|
||||||
UintLiteral(ProgramID pid, const Source& src, uint32_t value);
|
UintLiteralExpression(ProgramID pid, const Source& src, uint32_t value);
|
||||||
~UintLiteral() override;
|
~UintLiteralExpression() override;
|
||||||
|
|
||||||
/// @returns the literal value as a u32
|
/// @returns the literal value as a u32
|
||||||
uint32_t ValueAsU32() const override;
|
uint32_t ValueAsU32() const override;
|
||||||
|
@ -39,7 +40,7 @@ class UintLiteral : public Castable<UintLiteral, IntLiteral> {
|
||||||
/// `ctx`.
|
/// `ctx`.
|
||||||
/// @param ctx the clone context
|
/// @param ctx the clone context
|
||||||
/// @return the newly cloned node
|
/// @return the newly cloned node
|
||||||
const UintLiteral* Clone(CloneContext* ctx) const override;
|
const UintLiteralExpression* Clone(CloneContext* ctx) const override;
|
||||||
|
|
||||||
/// The int literal value
|
/// The int literal value
|
||||||
const uint32_t value;
|
const uint32_t value;
|
||||||
|
|
|
@ -18,11 +18,11 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using UintLiteralTest = TestHelper;
|
using UintLiteralExpressionTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(UintLiteralTest, Value) {
|
TEST_F(UintLiteralExpressionTest, Value) {
|
||||||
auto* u = create<UintLiteral>(47);
|
auto* u = create<UintLiteralExpression>(47);
|
||||||
ASSERT_TRUE(u->Is<UintLiteral>());
|
ASSERT_TRUE(u->Is<UintLiteralExpression>());
|
||||||
EXPECT_EQ(u->value, 47u);
|
EXPECT_EQ(u->value, 47u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,8 @@ TEST_F(WorkgroupDecorationTest, Creation_1param) {
|
||||||
auto* d = WorkgroupSize(2);
|
auto* d = WorkgroupSize(2);
|
||||||
auto values = d->Values();
|
auto values = d->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
EXPECT_EQ(values[1], nullptr);
|
EXPECT_EQ(values[1], nullptr);
|
||||||
EXPECT_EQ(values[2], nullptr);
|
EXPECT_EQ(values[2], nullptr);
|
||||||
|
@ -37,11 +37,11 @@ TEST_F(WorkgroupDecorationTest, Creation_2param) {
|
||||||
auto* d = WorkgroupSize(2, 4);
|
auto* d = WorkgroupSize(2, 4);
|
||||||
auto values = d->Values();
|
auto values = d->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
EXPECT_EQ(values[2], nullptr);
|
EXPECT_EQ(values[2], nullptr);
|
||||||
}
|
}
|
||||||
|
@ -50,25 +50,25 @@ TEST_F(WorkgroupDecorationTest, Creation_3param) {
|
||||||
auto* d = WorkgroupSize(2, 4, 6);
|
auto* d = WorkgroupSize(2, 4, 6);
|
||||||
auto values = d->Values();
|
auto values = d->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[2]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[2]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[2]->As<ast::IntLiteral>()->ValueAsU32(), 6u);
|
EXPECT_EQ(values[2]->As<ast::IntLiteralExpression>()->ValueAsU32(), 6u);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WorkgroupDecorationTest, Creation_WithIdentifier) {
|
TEST_F(WorkgroupDecorationTest, Creation_WithIdentifier) {
|
||||||
auto* d = WorkgroupSize(2, 4, "depth");
|
auto* d = WorkgroupSize(2, 4, "depth");
|
||||||
auto values = d->Values();
|
auto values = d->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
auto* z_ident = As<ast::IdentifierExpression>(values[2]);
|
auto* z_ident = As<ast::IdentifierExpression>(values[2]);
|
||||||
ASSERT_TRUE(z_ident);
|
ASSERT_TRUE(z_ident);
|
||||||
|
|
|
@ -251,10 +251,10 @@ class CloneContext {
|
||||||
/// Example:
|
/// Example:
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// // Replace all ast::UintLiterals with the number 42
|
/// // Replace all ast::UintLiteralExpressions with the number 42
|
||||||
/// CloneCtx ctx(&out, in);
|
/// CloneCtx ctx(&out, in);
|
||||||
/// ctx.ReplaceAll([&] (ast::UintLiteral* l) {
|
/// ctx.ReplaceAll([&] (ast::UintLiteralExpression* l) {
|
||||||
/// return ctx->dst->create<ast::UintLiteral>(
|
/// return ctx->dst->create<ast::UintLiteralExpression>(
|
||||||
/// ctx->Clone(l->source),
|
/// ctx->Clone(l->source),
|
||||||
/// ctx->Clone(l->type),
|
/// ctx->Clone(l->type),
|
||||||
/// 42);
|
/// 42);
|
||||||
|
|
|
@ -263,29 +263,29 @@ std::map<uint32_t, Scalar> Inspector::GetConstantIDs() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* literal = var->constructor->As<ast::Literal>();
|
auto* literal = var->constructor->As<ast::LiteralExpression>();
|
||||||
if (!literal) {
|
if (!literal) {
|
||||||
// This is invalid WGSL, but handling gracefully.
|
// This is invalid WGSL, but handling gracefully.
|
||||||
result[constant_id] = Scalar();
|
result[constant_id] = Scalar();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto* l = literal->As<ast::BoolLiteral>()) {
|
if (auto* l = literal->As<ast::BoolLiteralExpression>()) {
|
||||||
result[constant_id] = Scalar(l->value);
|
result[constant_id] = Scalar(l->value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto* l = literal->As<ast::UintLiteral>()) {
|
if (auto* l = literal->As<ast::UintLiteralExpression>()) {
|
||||||
result[constant_id] = Scalar(l->value);
|
result[constant_id] = Scalar(l->value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto* l = literal->As<ast::SintLiteral>()) {
|
if (auto* l = literal->As<ast::SintLiteralExpression>()) {
|
||||||
result[constant_id] = Scalar(l->value);
|
result[constant_id] = Scalar(l->value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto* l = literal->As<ast::FloatLiteral>()) {
|
if (auto* l = literal->As<ast::FloatLiteralExpression>()) {
|
||||||
result[constant_id] = Scalar(l->value);
|
result[constant_id] = Scalar(l->value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1037,53 +1037,53 @@ class ProgramBuilder {
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param value the boolean value
|
/// @param value the boolean value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::Literal* Expr(const Source& source, bool value) {
|
const ast::LiteralExpression* Expr(const Source& source, bool value) {
|
||||||
return create<ast::BoolLiteral>(source, value);
|
return create<ast::BoolLiteralExpression>(source, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param value the boolean value
|
/// @param value the boolean value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::BoolLiteral* Expr(bool value) {
|
const ast::BoolLiteralExpression* Expr(bool value) {
|
||||||
return create<ast::BoolLiteral>(value);
|
return create<ast::BoolLiteralExpression>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param value the float value
|
/// @param value the float value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::FloatLiteral* Expr(const Source& source, f32 value) {
|
const ast::FloatLiteralExpression* Expr(const Source& source, f32 value) {
|
||||||
return create<ast::FloatLiteral>(source, value);
|
return create<ast::FloatLiteralExpression>(source, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param value the float value
|
/// @param value the float value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::FloatLiteral* Expr(f32 value) {
|
const ast::FloatLiteralExpression* Expr(f32 value) {
|
||||||
return create<ast::FloatLiteral>(value);
|
return create<ast::FloatLiteralExpression>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param value the integer value
|
/// @param value the integer value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::Literal* Expr(const Source& source, i32 value) {
|
const ast::LiteralExpression* Expr(const Source& source, i32 value) {
|
||||||
return create<ast::SintLiteral>(source, value);
|
return create<ast::SintLiteralExpression>(source, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param value the integer value
|
/// @param value the integer value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::SintLiteral* Expr(i32 value) {
|
const ast::SintLiteralExpression* Expr(i32 value) {
|
||||||
return create<ast::SintLiteral>(value);
|
return create<ast::SintLiteralExpression>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param value the unsigned int value
|
/// @param value the unsigned int value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::UintLiteral* Expr(const Source& source, u32 value) {
|
const ast::UintLiteralExpression* Expr(const Source& source, u32 value) {
|
||||||
return create<ast::UintLiteral>(source, value);
|
return create<ast::UintLiteralExpression>(source, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param value the unsigned int value
|
/// @param value the unsigned int value
|
||||||
/// @return a Scalar constructor for the given value
|
/// @return a Scalar constructor for the given value
|
||||||
const ast::UintLiteral* Expr(u32 value) {
|
const ast::UintLiteralExpression* Expr(u32 value) {
|
||||||
return create<ast::UintLiteral>(value);
|
return create<ast::UintLiteralExpression>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Converts `arg` to an `ast::Expression` using `Expr()`, then appends it to
|
/// Converts `arg` to an `ast::Expression` using `Expr()`, then appends it to
|
||||||
|
@ -1127,53 +1127,53 @@ class ProgramBuilder {
|
||||||
/// @param source the source location for the literal
|
/// @param source the source location for the literal
|
||||||
/// @param val the boolan value
|
/// @param val the boolan value
|
||||||
/// @return a boolean literal with the given value
|
/// @return a boolean literal with the given value
|
||||||
const ast::BoolLiteral* Literal(const Source& source, bool val) {
|
const ast::BoolLiteralExpression* Literal(const Source& source, bool val) {
|
||||||
return create<ast::BoolLiteral>(source, val);
|
return create<ast::BoolLiteralExpression>(source, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param val the boolan value
|
/// @param val the boolan value
|
||||||
/// @return a boolean literal with the given value
|
/// @return a boolean literal with the given value
|
||||||
const ast::BoolLiteral* Literal(bool val) {
|
const ast::BoolLiteralExpression* Literal(bool val) {
|
||||||
return create<ast::BoolLiteral>(val);
|
return create<ast::BoolLiteralExpression>(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param source the source location for the literal
|
/// @param source the source location for the literal
|
||||||
/// @param val the float value
|
/// @param val the float value
|
||||||
/// @return a float literal with the given value
|
/// @return a float literal with the given value
|
||||||
const ast::FloatLiteral* Literal(const Source& source, f32 val) {
|
const ast::FloatLiteralExpression* Literal(const Source& source, f32 val) {
|
||||||
return create<ast::FloatLiteral>(source, val);
|
return create<ast::FloatLiteralExpression>(source, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param val the float value
|
/// @param val the float value
|
||||||
/// @return a float literal with the given value
|
/// @return a float literal with the given value
|
||||||
const ast::FloatLiteral* Literal(f32 val) {
|
const ast::FloatLiteralExpression* Literal(f32 val) {
|
||||||
return create<ast::FloatLiteral>(val);
|
return create<ast::FloatLiteralExpression>(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param source the source location for the literal
|
/// @param source the source location for the literal
|
||||||
/// @param val the unsigned int value
|
/// @param val the unsigned int value
|
||||||
/// @return a ast::UintLiteral with the given value
|
/// @return a ast::UintLiteral with the given value
|
||||||
const ast::UintLiteral* Literal(const Source& source, u32 val) {
|
const ast::UintLiteralExpression* Literal(const Source& source, u32 val) {
|
||||||
return create<ast::UintLiteral>(source, val);
|
return create<ast::UintLiteralExpression>(source, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param val the unsigned int value
|
/// @param val the unsigned int value
|
||||||
/// @return a ast::UintLiteral with the given value
|
/// @return a ast::UintLiteral with the given value
|
||||||
const ast::UintLiteral* Literal(u32 val) {
|
const ast::UintLiteralExpression* Literal(u32 val) {
|
||||||
return create<ast::UintLiteral>(val);
|
return create<ast::UintLiteralExpression>(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param source the source location for the literal
|
/// @param source the source location for the literal
|
||||||
/// @param val the integer value
|
/// @param val the integer value
|
||||||
/// @return the ast::SintLiteral with the given value
|
/// @return the ast::SintLiteral with the given value
|
||||||
const ast::SintLiteral* Literal(const Source& source, i32 val) {
|
const ast::SintLiteralExpression* Literal(const Source& source, i32 val) {
|
||||||
return create<ast::SintLiteral>(source, val);
|
return create<ast::SintLiteralExpression>(source, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param val the integer value
|
/// @param val the integer value
|
||||||
/// @return the ast::SintLiteral with the given value
|
/// @return the ast::SintLiteral with the given value
|
||||||
const ast::SintLiteral* Literal(i32 val) {
|
const ast::SintLiteralExpression* Literal(i32 val) {
|
||||||
return create<ast::SintLiteral>(val);
|
return create<ast::SintLiteralExpression>(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param args the arguments for the type constructor
|
/// @param args the arguments for the type constructor
|
||||||
|
@ -2237,7 +2237,7 @@ class ProgramBuilder {
|
||||||
/// @param selector a single case selector
|
/// @param selector a single case selector
|
||||||
/// @param body the case body
|
/// @param body the case body
|
||||||
/// @returns the case statement pointer
|
/// @returns the case statement pointer
|
||||||
const ast::CaseStatement* Case(const ast::IntLiteral* selector,
|
const ast::CaseStatement* Case(const ast::IntLiteralExpression* selector,
|
||||||
const ast::BlockStatement* body = nullptr) {
|
const ast::BlockStatement* body = nullptr) {
|
||||||
return Case(ast::CaseSelectorList{selector}, body);
|
return Case(ast::CaseSelectorList{selector}, body);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2548,7 +2548,7 @@ TypedExpression FunctionEmitter::MakeExpression(uint32_t id) {
|
||||||
return source_expr;
|
return source_expr;
|
||||||
}
|
}
|
||||||
case SkipReason::kPointSizeBuiltinValue: {
|
case SkipReason::kPointSizeBuiltinValue: {
|
||||||
return {ty_.F32(), create<ast::FloatLiteral>(Source{}, 1.0f)};
|
return {ty_.F32(), create<ast::FloatLiteralExpression>(Source{}, 1.0f)};
|
||||||
}
|
}
|
||||||
case SkipReason::kPointSizeBuiltinPointer:
|
case SkipReason::kPointSizeBuiltinPointer:
|
||||||
Fail() << "unhandled use of a pointer to the PointSize builtin, with ID: "
|
Fail() << "unhandled use of a pointer to the PointSize builtin, with ID: "
|
||||||
|
@ -3063,9 +3063,11 @@ bool FunctionEmitter::EmitSwitchStart(const BlockInfo& block_info) {
|
||||||
// The Tint AST handles 32-bit values.
|
// The Tint AST handles 32-bit values.
|
||||||
const uint32_t value32 = uint32_t(value & 0xFFFFFFFF);
|
const uint32_t value32 = uint32_t(value & 0xFFFFFFFF);
|
||||||
if (selector.type->IsUnsignedScalarOrVector()) {
|
if (selector.type->IsUnsignedScalarOrVector()) {
|
||||||
selectors.emplace_back(create<ast::UintLiteral>(Source{}, value32));
|
selectors.emplace_back(
|
||||||
|
create<ast::UintLiteralExpression>(Source{}, value32));
|
||||||
} else {
|
} else {
|
||||||
selectors.emplace_back(create<ast::SintLiteral>(Source{}, value32));
|
selectors.emplace_back(
|
||||||
|
create<ast::SintLiteralExpression>(Source{}, value32));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4475,7 +4477,7 @@ TypedExpression FunctionEmitter::MakeCompositeValueDecomposition(
|
||||||
auto current_type_id = composite_type_id;
|
auto current_type_id = composite_type_id;
|
||||||
|
|
||||||
auto make_index = [this](uint32_t literal) {
|
auto make_index = [this](uint32_t literal) {
|
||||||
return create<ast::UintLiteral>(Source{}, literal);
|
return create<ast::UintLiteralExpression>(Source{}, literal);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Build up a nested expression for the decomposition by walking down the type
|
// Build up a nested expression for the decomposition by walking down the type
|
||||||
|
@ -4591,11 +4593,11 @@ TypedExpression FunctionEmitter::MakeCompositeValueDecomposition(
|
||||||
}
|
}
|
||||||
|
|
||||||
const ast::Expression* FunctionEmitter::MakeTrue(const Source& source) const {
|
const ast::Expression* FunctionEmitter::MakeTrue(const Source& source) const {
|
||||||
return create<ast::BoolLiteral>(source, true);
|
return create<ast::BoolLiteralExpression>(source, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ast::Expression* FunctionEmitter::MakeFalse(const Source& source) const {
|
const ast::Expression* FunctionEmitter::MakeFalse(const Source& source) const {
|
||||||
return create<ast::BoolLiteral>(source, false);
|
return create<ast::BoolLiteralExpression>(source, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
TypedExpression FunctionEmitter::MakeVectorShuffle(
|
TypedExpression FunctionEmitter::MakeVectorShuffle(
|
||||||
|
|
|
@ -603,7 +603,7 @@ Source ParserImpl::GetSourceForInst(
|
||||||
if (where == inst_source_.end()) {
|
if (where == inst_source_.end()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return Source{where->second };
|
return Source{where->second};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParserImpl::ParseInternalModuleExceptFunctions() {
|
bool ParserImpl::ParseInternalModuleExceptFunctions() {
|
||||||
|
@ -1353,13 +1353,13 @@ bool ParserImpl::EmitScalarSpecConstants() {
|
||||||
for (auto& inst : module_->types_values()) {
|
for (auto& inst : module_->types_values()) {
|
||||||
// These will be populated for a valid scalar spec constant.
|
// These will be populated for a valid scalar spec constant.
|
||||||
const Type* ast_type = nullptr;
|
const Type* ast_type = nullptr;
|
||||||
ast::Literal* ast_expr = nullptr;
|
ast::LiteralExpression* ast_expr = nullptr;
|
||||||
|
|
||||||
switch (inst.opcode()) {
|
switch (inst.opcode()) {
|
||||||
case SpvOpSpecConstantTrue:
|
case SpvOpSpecConstantTrue:
|
||||||
case SpvOpSpecConstantFalse: {
|
case SpvOpSpecConstantFalse: {
|
||||||
ast_type = ConvertType(inst.type_id());
|
ast_type = ConvertType(inst.type_id());
|
||||||
ast_expr = create<ast::BoolLiteral>(
|
ast_expr = create<ast::BoolLiteralExpression>(
|
||||||
Source{}, inst.opcode() == SpvOpSpecConstantTrue);
|
Source{}, inst.opcode() == SpvOpSpecConstantTrue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1367,16 +1367,16 @@ bool ParserImpl::EmitScalarSpecConstants() {
|
||||||
ast_type = ConvertType(inst.type_id());
|
ast_type = ConvertType(inst.type_id());
|
||||||
const uint32_t literal_value = inst.GetSingleWordInOperand(0);
|
const uint32_t literal_value = inst.GetSingleWordInOperand(0);
|
||||||
if (ast_type->Is<I32>()) {
|
if (ast_type->Is<I32>()) {
|
||||||
ast_expr = create<ast::SintLiteral>(
|
ast_expr = create<ast::SintLiteralExpression>(
|
||||||
Source{}, static_cast<int32_t>(literal_value));
|
Source{}, static_cast<int32_t>(literal_value));
|
||||||
} else if (ast_type->Is<U32>()) {
|
} else if (ast_type->Is<U32>()) {
|
||||||
ast_expr = create<ast::UintLiteral>(
|
ast_expr = create<ast::UintLiteralExpression>(
|
||||||
Source{}, static_cast<uint32_t>(literal_value));
|
Source{}, static_cast<uint32_t>(literal_value));
|
||||||
} else if (ast_type->Is<F32>()) {
|
} else if (ast_type->Is<F32>()) {
|
||||||
float float_value;
|
float float_value;
|
||||||
// Copy the bits so we can read them as a float.
|
// Copy the bits so we can read them as a float.
|
||||||
std::memcpy(&float_value, &literal_value, sizeof(float_value));
|
std::memcpy(&float_value, &literal_value, sizeof(float_value));
|
||||||
ast_expr = create<ast::FloatLiteral>(Source{}, float_value);
|
ast_expr = create<ast::FloatLiteralExpression>(Source{}, float_value);
|
||||||
} else {
|
} else {
|
||||||
return Fail() << " invalid result type for OpSpecConstant "
|
return Fail() << " invalid result type for OpSpecConstant "
|
||||||
<< inst.PrettyPrint();
|
<< inst.PrettyPrint();
|
||||||
|
@ -1955,20 +1955,22 @@ TypedExpression ParserImpl::MakeConstantExpressionForScalarSpirvConstant(
|
||||||
// Currently "null<type>" is missing from the WGSL parser.
|
// Currently "null<type>" is missing from the WGSL parser.
|
||||||
// See https://bugs.chromium.org/p/tint/issues/detail?id=34
|
// See https://bugs.chromium.org/p/tint/issues/detail?id=34
|
||||||
if (ast_type->Is<U32>()) {
|
if (ast_type->Is<U32>()) {
|
||||||
return {ty_.U32(), create<ast::UintLiteral>(source, spirv_const->GetU32())};
|
return {ty_.U32(),
|
||||||
|
create<ast::UintLiteralExpression>(source, spirv_const->GetU32())};
|
||||||
}
|
}
|
||||||
if (ast_type->Is<I32>()) {
|
if (ast_type->Is<I32>()) {
|
||||||
return {ty_.I32(), create<ast::SintLiteral>(source, spirv_const->GetS32())};
|
return {ty_.I32(),
|
||||||
|
create<ast::SintLiteralExpression>(source, spirv_const->GetS32())};
|
||||||
}
|
}
|
||||||
if (ast_type->Is<F32>()) {
|
if (ast_type->Is<F32>()) {
|
||||||
return {ty_.F32(),
|
return {ty_.F32(), create<ast::FloatLiteralExpression>(
|
||||||
create<ast::FloatLiteral>(source, spirv_const->GetFloat())};
|
source, spirv_const->GetFloat())};
|
||||||
}
|
}
|
||||||
if (ast_type->Is<Bool>()) {
|
if (ast_type->Is<Bool>()) {
|
||||||
const bool value = spirv_const->AsNullConstant()
|
const bool value = spirv_const->AsNullConstant()
|
||||||
? false
|
? false
|
||||||
: spirv_const->AsBoolConstant()->value();
|
: spirv_const->AsBoolConstant()->value();
|
||||||
return {ty_.Bool(), create<ast::BoolLiteral>(source, value)};
|
return {ty_.Bool(), create<ast::BoolLiteralExpression>(source, value)};
|
||||||
}
|
}
|
||||||
Fail() << "expected scalar constant";
|
Fail() << "expected scalar constant";
|
||||||
return {};
|
return {};
|
||||||
|
@ -1989,16 +1991,16 @@ const ast::Expression* ParserImpl::MakeNullValue(const Type* type) {
|
||||||
type = type->UnwrapAlias();
|
type = type->UnwrapAlias();
|
||||||
|
|
||||||
if (type->Is<Bool>()) {
|
if (type->Is<Bool>()) {
|
||||||
return create<ast::BoolLiteral>(Source{}, false);
|
return create<ast::BoolLiteralExpression>(Source{}, false);
|
||||||
}
|
}
|
||||||
if (type->Is<U32>()) {
|
if (type->Is<U32>()) {
|
||||||
return create<ast::UintLiteral>(Source{}, 0u);
|
return create<ast::UintLiteralExpression>(Source{}, 0u);
|
||||||
}
|
}
|
||||||
if (type->Is<I32>()) {
|
if (type->Is<I32>()) {
|
||||||
return create<ast::SintLiteral>(Source{}, 0);
|
return create<ast::SintLiteralExpression>(Source{}, 0);
|
||||||
}
|
}
|
||||||
if (type->Is<F32>()) {
|
if (type->Is<F32>()) {
|
||||||
return create<ast::FloatLiteral>(Source{}, 0.0f);
|
return create<ast::FloatLiteralExpression>(Source{}, 0.0f);
|
||||||
}
|
}
|
||||||
if (type->Is<Alias>()) {
|
if (type->Is<Alias>()) {
|
||||||
// TODO(amaiorano): No type constructor for TypeName (yet?)
|
// TODO(amaiorano): No type constructor for TypeName (yet?)
|
||||||
|
|
|
@ -1947,12 +1947,12 @@ Expect<ast::CaseSelectorList> ParserImpl::expect_case_selectors() {
|
||||||
return Failure::kErrored;
|
return Failure::kErrored;
|
||||||
} else if (!cond.matched) {
|
} else if (!cond.matched) {
|
||||||
break;
|
break;
|
||||||
} else if (!cond->Is<ast::IntLiteral>()) {
|
} else if (!cond->Is<ast::IntLiteralExpression>()) {
|
||||||
return add_error(cond.value->source,
|
return add_error(cond.value->source,
|
||||||
"invalid case selector must be an integer value");
|
"invalid case selector must be an integer value");
|
||||||
}
|
}
|
||||||
|
|
||||||
selectors.push_back(cond.value->As<ast::IntLiteral>());
|
selectors.push_back(cond.value->As<ast::IntLiteralExpression>());
|
||||||
|
|
||||||
if (!match(Token::Type::kComma)) {
|
if (!match(Token::Type::kComma)) {
|
||||||
break;
|
break;
|
||||||
|
@ -2841,22 +2841,22 @@ Maybe<const ast::AssignmentStatement*> ParserImpl::assignment_stmt() {
|
||||||
// | FLOAT_LITERAL
|
// | FLOAT_LITERAL
|
||||||
// | TRUE
|
// | TRUE
|
||||||
// | FALSE
|
// | FALSE
|
||||||
Maybe<const ast::Literal*> ParserImpl::const_literal() {
|
Maybe<const ast::LiteralExpression*> ParserImpl::const_literal() {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (t.IsError()) {
|
if (t.IsError()) {
|
||||||
return add_error(t.source(), t.to_str());
|
return add_error(t.source(), t.to_str());
|
||||||
}
|
}
|
||||||
if (match(Token::Type::kTrue)) {
|
if (match(Token::Type::kTrue)) {
|
||||||
return create<ast::BoolLiteral>(t.source(), true);
|
return create<ast::BoolLiteralExpression>(t.source(), true);
|
||||||
}
|
}
|
||||||
if (match(Token::Type::kFalse)) {
|
if (match(Token::Type::kFalse)) {
|
||||||
return create<ast::BoolLiteral>(t.source(), false);
|
return create<ast::BoolLiteralExpression>(t.source(), false);
|
||||||
}
|
}
|
||||||
if (match(Token::Type::kSintLiteral)) {
|
if (match(Token::Type::kSintLiteral)) {
|
||||||
return create<ast::SintLiteral>(t.source(), t.to_i32());
|
return create<ast::SintLiteralExpression>(t.source(), t.to_i32());
|
||||||
}
|
}
|
||||||
if (match(Token::Type::kUintLiteral)) {
|
if (match(Token::Type::kUintLiteral)) {
|
||||||
return create<ast::UintLiteral>(t.source(), t.to_u32());
|
return create<ast::UintLiteralExpression>(t.source(), t.to_u32());
|
||||||
}
|
}
|
||||||
if (match(Token::Type::kFloatLiteral)) {
|
if (match(Token::Type::kFloatLiteral)) {
|
||||||
auto p = peek();
|
auto p = peek();
|
||||||
|
@ -2865,7 +2865,7 @@ Maybe<const ast::Literal*> ParserImpl::const_literal() {
|
||||||
return add_error(p.source(),
|
return add_error(p.source(),
|
||||||
"float literals must not be suffixed with 'f'");
|
"float literals must not be suffixed with 'f'");
|
||||||
}
|
}
|
||||||
return create<ast::FloatLiteral>(t.source(), t.to_f32());
|
return create<ast::FloatLiteralExpression>(t.source(), t.to_f32());
|
||||||
}
|
}
|
||||||
return Failure::kNoMatch;
|
return Failure::kNoMatch;
|
||||||
}
|
}
|
||||||
|
|
|
@ -568,7 +568,7 @@ class ParserImpl {
|
||||||
Maybe<const ast::BlockStatement*> continuing_stmt();
|
Maybe<const ast::BlockStatement*> continuing_stmt();
|
||||||
/// Parses a `const_literal` grammar element
|
/// Parses a `const_literal` grammar element
|
||||||
/// @returns the const literal parsed or nullptr if none found
|
/// @returns the const literal parsed or nullptr if none found
|
||||||
Maybe<const ast::Literal*> const_literal();
|
Maybe<const ast::LiteralExpression*> const_literal();
|
||||||
/// Parses a `const_expr` grammar element, erroring on parse failure.
|
/// Parses a `const_expr` grammar element, erroring on parse failure.
|
||||||
/// @returns the parsed constructor expression or nullptr on error
|
/// @returns the parsed constructor expression or nullptr on error
|
||||||
Expect<const ast::Expression*> expect_const_expr();
|
Expect<const ast::Expression*> expect_const_expr();
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, AdditiveExpression_Parses_Plus) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, AdditiveExpression_Parses_Minus) {
|
TEST_F(ParserImplTest, AdditiveExpression_Parses_Minus) {
|
||||||
|
@ -55,8 +55,8 @@ TEST_F(ParserImplTest, AdditiveExpression_Parses_Minus) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, AdditiveExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, AdditiveExpression_InvalidLHS) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, AndExpression_Parses) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, AndExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, AndExpression_InvalidLHS) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ TEST_F(ParserImplTest, ArgumentExpressionList_ParsesMultiple) {
|
||||||
|
|
||||||
ASSERT_EQ(e.value.size(), 3u);
|
ASSERT_EQ(e.value.size(), 3u);
|
||||||
ASSERT_TRUE(e.value[0]->Is<ast::IdentifierExpression>());
|
ASSERT_TRUE(e.value[0]->Is<ast::IdentifierExpression>());
|
||||||
ASSERT_TRUE(e.value[1]->Is<ast::Literal>());
|
ASSERT_TRUE(e.value[1]->Is<ast::LiteralExpression>());
|
||||||
ASSERT_TRUE(e.value[2]->Is<ast::BinaryExpression>());
|
ASSERT_TRUE(e.value[2]->Is<ast::BinaryExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ TEST_F(ParserImplTest, ArgumentExpressionList_TrailingComma) {
|
||||||
|
|
||||||
ASSERT_EQ(e.value.size(), 2u);
|
ASSERT_EQ(e.value.size(), 2u);
|
||||||
ASSERT_TRUE(e.value[0]->Is<ast::IdentifierExpression>());
|
ASSERT_TRUE(e.value[0]->Is<ast::IdentifierExpression>());
|
||||||
ASSERT_TRUE(e.value[1]->Is<ast::Literal>());
|
ASSERT_TRUE(e.value[1]->Is<ast::LiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingLeftParen) {
|
TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingLeftParen) {
|
||||||
|
|
|
@ -36,8 +36,8 @@ TEST_F(ParserImplTest, AssignmentStmt_Parses_ToVariable) {
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_NE(e->rhs, nullptr);
|
ASSERT_NE(e->rhs, nullptr);
|
||||||
ASSERT_TRUE(e->rhs->Is<ast::SintLiteral>());
|
ASSERT_TRUE(e->rhs->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(e->rhs->As<ast::SintLiteral>()->value, 123);
|
EXPECT_EQ(e->rhs->As<ast::SintLiteralExpression>()->value, 123);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, AssignmentStmt_Parses_ToMember) {
|
TEST_F(ParserImplTest, AssignmentStmt_Parses_ToMember) {
|
||||||
|
@ -53,8 +53,8 @@ TEST_F(ParserImplTest, AssignmentStmt_Parses_ToMember) {
|
||||||
ASSERT_NE(e->rhs, nullptr);
|
ASSERT_NE(e->rhs, nullptr);
|
||||||
|
|
||||||
ASSERT_NE(e->rhs, nullptr);
|
ASSERT_NE(e->rhs, nullptr);
|
||||||
ASSERT_TRUE(e->rhs->Is<ast::SintLiteral>());
|
ASSERT_TRUE(e->rhs->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(e->rhs->As<ast::SintLiteral>()->value, 123);
|
EXPECT_EQ(e->rhs->As<ast::SintLiteralExpression>()->value, 123);
|
||||||
|
|
||||||
ASSERT_TRUE(e->lhs->Is<ast::MemberAccessorExpression>());
|
ASSERT_TRUE(e->lhs->Is<ast::MemberAccessorExpression>());
|
||||||
auto* mem = e->lhs->As<ast::MemberAccessorExpression>();
|
auto* mem = e->lhs->As<ast::MemberAccessorExpression>();
|
||||||
|
@ -67,8 +67,8 @@ TEST_F(ParserImplTest, AssignmentStmt_Parses_ToMember) {
|
||||||
auto* idx = mem->structure->As<ast::IndexAccessorExpression>();
|
auto* idx = mem->structure->As<ast::IndexAccessorExpression>();
|
||||||
|
|
||||||
ASSERT_NE(idx->index, nullptr);
|
ASSERT_NE(idx->index, nullptr);
|
||||||
ASSERT_TRUE(idx->index->Is<ast::SintLiteral>());
|
ASSERT_TRUE(idx->index->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(idx->index->As<ast::SintLiteral>()->value, 2);
|
EXPECT_EQ(idx->index->As<ast::SintLiteralExpression>()->value, 2);
|
||||||
|
|
||||||
ASSERT_TRUE(idx->object->Is<ast::MemberAccessorExpression>());
|
ASSERT_TRUE(idx->object->Is<ast::MemberAccessorExpression>());
|
||||||
mem = idx->object->As<ast::MemberAccessorExpression>();
|
mem = idx->object->As<ast::MemberAccessorExpression>();
|
||||||
|
@ -101,8 +101,8 @@ TEST_F(ParserImplTest, AssignmentStmt_Parses_ToPhony) {
|
||||||
ASSERT_NE(e->rhs, nullptr);
|
ASSERT_NE(e->rhs, nullptr);
|
||||||
|
|
||||||
ASSERT_NE(e->rhs, nullptr);
|
ASSERT_NE(e->rhs, nullptr);
|
||||||
ASSERT_TRUE(e->rhs->Is<ast::SintLiteral>());
|
ASSERT_TRUE(e->rhs->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(e->rhs->As<ast::SintLiteral>()->value, 123);
|
EXPECT_EQ(e->rhs->As<ast::SintLiteralExpression>()->value, 123);
|
||||||
|
|
||||||
ASSERT_TRUE(e->lhs->Is<ast::PhonyExpression>());
|
ASSERT_TRUE(e->lhs->Is<ast::PhonyExpression>());
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ TEST_F(ParserImplTest, Statement_Call_WithParams) {
|
||||||
EXPECT_EQ(c->func->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(c->func->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
EXPECT_EQ(c->args.size(), 3u);
|
EXPECT_EQ(c->args.size(), 3u);
|
||||||
EXPECT_TRUE(c->args[0]->Is<ast::IntLiteral>());
|
EXPECT_TRUE(c->args[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_TRUE(c->args[1]->Is<ast::IdentifierExpression>());
|
EXPECT_TRUE(c->args[1]->Is<ast::IdentifierExpression>());
|
||||||
EXPECT_TRUE(c->args[2]->Is<ast::BinaryExpression>());
|
EXPECT_TRUE(c->args[2]->Is<ast::BinaryExpression>());
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ TEST_F(ParserImplTest, Statement_Call_WithParams_TrailingComma) {
|
||||||
EXPECT_EQ(c->func->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(c->func->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
EXPECT_EQ(c->args.size(), 2u);
|
EXPECT_EQ(c->args.size(), 2u);
|
||||||
EXPECT_TRUE(c->args[0]->Is<ast::IntLiteral>());
|
EXPECT_TRUE(c->args[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_TRUE(c->args[1]->Is<ast::IdentifierExpression>());
|
EXPECT_TRUE(c->args[1]->Is<ast::IdentifierExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,11 +33,11 @@ TEST_F(ParserImplTest, ConstExpr_TypeDecl) {
|
||||||
ASSERT_EQ(t->values.size(), 2u);
|
ASSERT_EQ(t->values.size(), 2u);
|
||||||
auto& v = t->values;
|
auto& v = t->values;
|
||||||
|
|
||||||
ASSERT_TRUE(v[0]->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(v[0]->Is<ast::FloatLiteralExpression>());
|
||||||
EXPECT_FLOAT_EQ(v[0]->As<ast::FloatLiteral>()->value, 1.);
|
EXPECT_FLOAT_EQ(v[0]->As<ast::FloatLiteralExpression>()->value, 1.);
|
||||||
|
|
||||||
ASSERT_TRUE(v[1]->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(v[1]->Is<ast::FloatLiteralExpression>());
|
||||||
EXPECT_FLOAT_EQ(v[1]->As<ast::FloatLiteral>()->value, 2.);
|
EXPECT_FLOAT_EQ(v[1]->As<ast::FloatLiteralExpression>()->value, 2.);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ConstExpr_TypeDecl_Empty) {
|
TEST_F(ParserImplTest, ConstExpr_TypeDecl_Empty) {
|
||||||
|
@ -66,8 +66,8 @@ TEST_F(ParserImplTest, ConstExpr_TypeDecl_TrailingComma) {
|
||||||
EXPECT_EQ(t->type->As<ast::Vector>()->width, 2u);
|
EXPECT_EQ(t->type->As<ast::Vector>()->width, 2u);
|
||||||
|
|
||||||
ASSERT_EQ(t->values.size(), 2u);
|
ASSERT_EQ(t->values.size(), 2u);
|
||||||
ASSERT_TRUE(t->values[0]->Is<ast::Literal>());
|
ASSERT_TRUE(t->values[0]->Is<ast::LiteralExpression>());
|
||||||
ASSERT_TRUE(t->values[1]->Is<ast::Literal>());
|
ASSERT_TRUE(t->values[1]->Is<ast::LiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ConstExpr_TypeDecl_MissingRightParen) {
|
TEST_F(ParserImplTest, ConstExpr_TypeDecl_MissingRightParen) {
|
||||||
|
@ -112,8 +112,8 @@ TEST_F(ParserImplTest, ConstExpr_ConstLiteral) {
|
||||||
ASSERT_FALSE(p->has_error()) << p->error();
|
ASSERT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_FALSE(e.errored);
|
ASSERT_FALSE(e.errored);
|
||||||
ASSERT_NE(e.value, nullptr);
|
ASSERT_NE(e.value, nullptr);
|
||||||
ASSERT_TRUE(e.value->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(e.value->Is<ast::BoolLiteralExpression>());
|
||||||
EXPECT_TRUE(e.value->As<ast::BoolLiteral>()->value);
|
EXPECT_TRUE(e.value->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ConstExpr_ConstLiteral_Invalid) {
|
TEST_F(ParserImplTest, ConstExpr_ConstLiteral_Invalid) {
|
||||||
|
|
|
@ -48,8 +48,8 @@ TEST_F(ParserImplTest, ConstLiteral_Int) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::SintLiteral>());
|
ASSERT_TRUE(c->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(c->As<ast::SintLiteral>()->value, -234);
|
EXPECT_EQ(c->As<ast::SintLiteralExpression>()->value, -234);
|
||||||
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
|
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,8 +60,8 @@ TEST_F(ParserImplTest, ConstLiteral_Uint) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::UintLiteral>());
|
ASSERT_TRUE(c->Is<ast::UintLiteralExpression>());
|
||||||
EXPECT_EQ(c->As<ast::UintLiteral>()->value, 234u);
|
EXPECT_EQ(c->As<ast::UintLiteralExpression>()->value, 234u);
|
||||||
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
|
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,8 +72,8 @@ TEST_F(ParserImplTest, ConstLiteral_Float) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(c->Is<ast::FloatLiteralExpression>());
|
||||||
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value, 234e12f);
|
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteralExpression>()->value, 234e12f);
|
||||||
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 8u}}));
|
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 8u}}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,8 +136,8 @@ TEST_P(ParserImplFloatLiteralTest, Parse) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(c->Is<ast::FloatLiteralExpression>());
|
||||||
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value, params.expected);
|
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteralExpression>()->value, params.expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
FloatLiteralTestCase float_literal_test_cases[] = {
|
FloatLiteralTestCase float_literal_test_cases[] = {
|
||||||
|
@ -394,8 +394,8 @@ TEST_F(ParserImplTest, ConstLiteral_FloatHighest) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(c->Is<ast::FloatLiteralExpression>());
|
||||||
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value,
|
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteralExpression>()->value,
|
||||||
std::numeric_limits<float>::max());
|
std::numeric_limits<float>::max());
|
||||||
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 42u}}));
|
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 42u}}));
|
||||||
}
|
}
|
||||||
|
@ -417,8 +417,8 @@ TEST_F(ParserImplTest, ConstLiteral_FloatLowest) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(c->Is<ast::FloatLiteralExpression>());
|
||||||
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value,
|
EXPECT_FLOAT_EQ(c->As<ast::FloatLiteralExpression>()->value,
|
||||||
std::numeric_limits<float>::lowest());
|
std::numeric_limits<float>::lowest());
|
||||||
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 43u}}));
|
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 43u}}));
|
||||||
}
|
}
|
||||||
|
@ -430,8 +430,8 @@ TEST_F(ParserImplTest, ConstLiteral_True) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(c->Is<ast::BoolLiteralExpression>());
|
||||||
EXPECT_TRUE(c->As<ast::BoolLiteral>()->value);
|
EXPECT_TRUE(c->As<ast::BoolLiteralExpression>()->value);
|
||||||
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
|
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,8 +442,8 @@ TEST_F(ParserImplTest, ConstLiteral_False) {
|
||||||
EXPECT_FALSE(c.errored);
|
EXPECT_FALSE(c.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(c.value, nullptr);
|
ASSERT_NE(c.value, nullptr);
|
||||||
ASSERT_TRUE(c->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(c->Is<ast::BoolLiteralExpression>());
|
||||||
EXPECT_FALSE(c->As<ast::BoolLiteral>()->value);
|
EXPECT_FALSE(c->As<ast::BoolLiteralExpression>()->value);
|
||||||
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 6u}}));
|
EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 6u}}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, EqualityExpression_Parses_Equal) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, EqualityExpression_Parses_NotEqual) {
|
TEST_F(ParserImplTest, EqualityExpression_Parses_NotEqual) {
|
||||||
|
@ -55,8 +55,8 @@ TEST_F(ParserImplTest, EqualityExpression_Parses_NotEqual) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, EqualityExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, EqualityExpression_InvalidLHS) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, ExclusiveOrExpression_Parses) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ExclusiveOrExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, ExclusiveOrExpression_InvalidLHS) {
|
||||||
|
|
|
@ -71,14 +71,14 @@ TEST_F(ParserImplTest, FunctionDecl_DecorationList) {
|
||||||
|
|
||||||
auto values = decorations[0]->As<ast::WorkgroupDecoration>()->Values();
|
auto values = decorations[0]->As<ast::WorkgroupDecoration>()->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 3u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 3u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[2]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[2]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[2]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[2]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
auto* body = f->body;
|
auto* body = f->body;
|
||||||
ASSERT_EQ(body->statements.size(), 1u);
|
ASSERT_EQ(body->statements.size(), 1u);
|
||||||
|
@ -110,14 +110,14 @@ fn main() { return; })");
|
||||||
ASSERT_TRUE(decorations[0]->Is<ast::WorkgroupDecoration>());
|
ASSERT_TRUE(decorations[0]->Is<ast::WorkgroupDecoration>());
|
||||||
auto values = decorations[0]->As<ast::WorkgroupDecoration>()->Values();
|
auto values = decorations[0]->As<ast::WorkgroupDecoration>()->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 3u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 3u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[2]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[2]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[2]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[2]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
ASSERT_TRUE(decorations[1]->Is<ast::StageDecoration>());
|
ASSERT_TRUE(decorations[1]->Is<ast::StageDecoration>());
|
||||||
EXPECT_EQ(decorations[1]->As<ast::StageDecoration>()->stage,
|
EXPECT_EQ(decorations[1]->As<ast::StageDecoration>()->stage,
|
||||||
|
@ -154,14 +154,14 @@ fn main() { return; })");
|
||||||
ASSERT_TRUE(decos[0]->Is<ast::WorkgroupDecoration>());
|
ASSERT_TRUE(decos[0]->Is<ast::WorkgroupDecoration>());
|
||||||
auto values = decos[0]->As<ast::WorkgroupDecoration>()->Values();
|
auto values = decos[0]->As<ast::WorkgroupDecoration>()->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 3u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 3u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[2]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[2]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[2]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[2]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
ASSERT_TRUE(decos[1]->Is<ast::StageDecoration>());
|
ASSERT_TRUE(decos[1]->Is<ast::StageDecoration>());
|
||||||
EXPECT_EQ(decos[1]->As<ast::StageDecoration>()->stage,
|
EXPECT_EQ(decos[1]->As<ast::StageDecoration>()->stage,
|
||||||
|
|
|
@ -36,10 +36,10 @@ TEST_F(ParserImplTest, DecorationList_Parses) {
|
||||||
ASSERT_TRUE(deco_0->Is<ast::WorkgroupDecoration>());
|
ASSERT_TRUE(deco_0->Is<ast::WorkgroupDecoration>());
|
||||||
const ast::Expression* x = deco_0->As<ast::WorkgroupDecoration>()->x;
|
const ast::Expression* x = deco_0->As<ast::WorkgroupDecoration>()->x;
|
||||||
ASSERT_NE(x, nullptr);
|
ASSERT_NE(x, nullptr);
|
||||||
auto* x_literal = x->As<ast::Literal>();
|
auto* x_literal = x->As<ast::LiteralExpression>();
|
||||||
ASSERT_NE(x_literal, nullptr);
|
ASSERT_NE(x_literal, nullptr);
|
||||||
ASSERT_TRUE(x_literal->Is<ast::IntLiteral>());
|
ASSERT_TRUE(x_literal->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(x_literal->As<ast::IntLiteral>()->ValueAsU32(), 2u);
|
EXPECT_EQ(x_literal->As<ast::IntLiteralExpression>()->ValueAsU32(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(deco_1->Is<ast::StageDecoration>());
|
ASSERT_TRUE(deco_1->Is<ast::StageDecoration>());
|
||||||
EXPECT_EQ(deco_1->As<ast::StageDecoration>()->stage,
|
EXPECT_EQ(deco_1->As<ast::StageDecoration>()->stage,
|
||||||
|
|
|
@ -34,8 +34,8 @@ TEST_F(ParserImplTest, Decoration_Workgroup) {
|
||||||
|
|
||||||
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
EXPECT_EQ(values[1], nullptr);
|
EXPECT_EQ(values[1], nullptr);
|
||||||
EXPECT_EQ(values[2], nullptr);
|
EXPECT_EQ(values[2], nullptr);
|
||||||
|
@ -54,11 +54,11 @@ TEST_F(ParserImplTest, Decoration_Workgroup_2Param) {
|
||||||
|
|
||||||
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 5u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 5u);
|
||||||
|
|
||||||
EXPECT_EQ(values[2], nullptr);
|
EXPECT_EQ(values[2], nullptr);
|
||||||
}
|
}
|
||||||
|
@ -76,14 +76,14 @@ TEST_F(ParserImplTest, Decoration_Workgroup_3Param) {
|
||||||
|
|
||||||
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::IntLiteral>()->ValueAsU32(), 5u);
|
EXPECT_EQ(values[1]->As<ast::IntLiteralExpression>()->ValueAsU32(), 5u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[2]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[2]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[2]->As<ast::IntLiteral>()->ValueAsU32(), 6u);
|
EXPECT_EQ(values[2]->As<ast::IntLiteralExpression>()->ValueAsU32(), 6u);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, Decoration_Workgroup_WithIdent) {
|
TEST_F(ParserImplTest, Decoration_Workgroup_WithIdent) {
|
||||||
|
@ -99,8 +99,8 @@ TEST_F(ParserImplTest, Decoration_Workgroup_WithIdent) {
|
||||||
|
|
||||||
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
auto values = func_deco->As<ast::WorkgroupDecoration>()->Values();
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::IntLiteral>()->ValueAsU32(), 4u);
|
EXPECT_EQ(values[0]->As<ast::IntLiteralExpression>()->ValueAsU32(), 4u);
|
||||||
|
|
||||||
ASSERT_NE(values[1], nullptr);
|
ASSERT_NE(values[1], nullptr);
|
||||||
auto* y_ident = values[1]->As<ast::IdentifierExpression>();
|
auto* y_ident = values[1]->As<ast::IdentifierExpression>();
|
||||||
|
|
|
@ -42,7 +42,7 @@ TEST_F(ParserImplTest, GlobalConstantDecl) {
|
||||||
EXPECT_EQ(e->source.range.end.column, 6u);
|
EXPECT_EQ(e->source.range.end.column, 6u);
|
||||||
|
|
||||||
ASSERT_NE(e->constructor, nullptr);
|
ASSERT_NE(e->constructor, nullptr);
|
||||||
EXPECT_TRUE(e->constructor->Is<ast::Literal>());
|
EXPECT_TRUE(e->constructor->Is<ast::LiteralExpression>());
|
||||||
|
|
||||||
EXPECT_FALSE(
|
EXPECT_FALSE(
|
||||||
ast::HasDecoration<ast::OverrideDecoration>(e.value->decorations));
|
ast::HasDecoration<ast::OverrideDecoration>(e.value->decorations));
|
||||||
|
@ -69,7 +69,7 @@ TEST_F(ParserImplTest, GlobalConstantDecl_Inferred) {
|
||||||
EXPECT_EQ(e->source.range.end.column, 6u);
|
EXPECT_EQ(e->source.range.end.column, 6u);
|
||||||
|
|
||||||
ASSERT_NE(e->constructor, nullptr);
|
ASSERT_NE(e->constructor, nullptr);
|
||||||
EXPECT_TRUE(e->constructor->Is<ast::Literal>());
|
EXPECT_TRUE(e->constructor->Is<ast::LiteralExpression>());
|
||||||
|
|
||||||
EXPECT_FALSE(
|
EXPECT_FALSE(
|
||||||
ast::HasDecoration<ast::OverrideDecoration>(e.value->decorations));
|
ast::HasDecoration<ast::OverrideDecoration>(e.value->decorations));
|
||||||
|
@ -137,7 +137,7 @@ TEST_F(ParserImplTest, GlobalConstantDec_Override_WithId) {
|
||||||
EXPECT_EQ(e->source.range.end.column, 22u);
|
EXPECT_EQ(e->source.range.end.column, 22u);
|
||||||
|
|
||||||
ASSERT_NE(e->constructor, nullptr);
|
ASSERT_NE(e->constructor, nullptr);
|
||||||
EXPECT_TRUE(e->constructor->Is<ast::Literal>());
|
EXPECT_TRUE(e->constructor->Is<ast::LiteralExpression>());
|
||||||
|
|
||||||
auto* override_deco =
|
auto* override_deco =
|
||||||
ast::GetDecoration<ast::OverrideDecoration>(e.value->decorations);
|
ast::GetDecoration<ast::OverrideDecoration>(e.value->decorations);
|
||||||
|
@ -169,7 +169,7 @@ TEST_F(ParserImplTest, GlobalConstantDec_Override_WithoutId) {
|
||||||
EXPECT_EQ(e->source.range.end.column, 19u);
|
EXPECT_EQ(e->source.range.end.column, 19u);
|
||||||
|
|
||||||
ASSERT_NE(e->constructor, nullptr);
|
ASSERT_NE(e->constructor, nullptr);
|
||||||
EXPECT_TRUE(e->constructor->Is<ast::Literal>());
|
EXPECT_TRUE(e->constructor->Is<ast::LiteralExpression>());
|
||||||
|
|
||||||
auto* override_deco =
|
auto* override_deco =
|
||||||
ast::GetDecoration<ast::OverrideDecoration>(e.value->decorations);
|
ast::GetDecoration<ast::OverrideDecoration>(e.value->decorations);
|
||||||
|
|
|
@ -63,7 +63,7 @@ TEST_F(ParserImplTest, GlobalVariableDecl_WithConstructor) {
|
||||||
EXPECT_EQ(e->source.range.end.column, 15u);
|
EXPECT_EQ(e->source.range.end.column, 15u);
|
||||||
|
|
||||||
ASSERT_NE(e->constructor, nullptr);
|
ASSERT_NE(e->constructor, nullptr);
|
||||||
ASSERT_TRUE(e->constructor->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(e->constructor->Is<ast::FloatLiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration) {
|
TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, InclusiveOrExpression_Parses) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, InclusiveOrExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, InclusiveOrExpression_InvalidLHS) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, LogicalAndExpression_Parses) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, LogicalAndExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, LogicalAndExpression_InvalidLHS) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, LogicalOrExpression_Parses) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, LogicalOrExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, LogicalOrExpression_InvalidLHS) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Multiply) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Divide) {
|
TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Divide) {
|
||||||
|
@ -55,8 +55,8 @@ TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Divide) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Modulo) {
|
TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Modulo) {
|
||||||
|
@ -75,8 +75,8 @@ TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Modulo) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, MultiplicativeExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, MultiplicativeExpression_InvalidLHS) {
|
||||||
|
|
|
@ -44,17 +44,17 @@ TEST_F(ParserImplTest, PrimaryExpression_TypeDecl) {
|
||||||
|
|
||||||
ASSERT_EQ(ty->values.size(), 4u);
|
ASSERT_EQ(ty->values.size(), 4u);
|
||||||
const auto& val = ty->values;
|
const auto& val = ty->values;
|
||||||
ASSERT_TRUE(val[0]->Is<ast::SintLiteral>());
|
ASSERT_TRUE(val[0]->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(val[0]->As<ast::SintLiteral>()->value, 1);
|
EXPECT_EQ(val[0]->As<ast::SintLiteralExpression>()->value, 1);
|
||||||
|
|
||||||
ASSERT_TRUE(val[1]->Is<ast::SintLiteral>());
|
ASSERT_TRUE(val[1]->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(val[1]->As<ast::SintLiteral>()->value, 2);
|
EXPECT_EQ(val[1]->As<ast::SintLiteralExpression>()->value, 2);
|
||||||
|
|
||||||
ASSERT_TRUE(val[2]->Is<ast::SintLiteral>());
|
ASSERT_TRUE(val[2]->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(val[2]->As<ast::SintLiteral>()->value, 3);
|
EXPECT_EQ(val[2]->As<ast::SintLiteralExpression>()->value, 3);
|
||||||
|
|
||||||
ASSERT_TRUE(val[3]->Is<ast::SintLiteral>());
|
ASSERT_TRUE(val[3]->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(val[3]->As<ast::SintLiteral>()->value, 4);
|
EXPECT_EQ(val[3]->As<ast::SintLiteralExpression>()->value, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_ZeroConstructor) {
|
TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_ZeroConstructor) {
|
||||||
|
@ -159,11 +159,11 @@ TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_StructConstructor_NotEmpty) {
|
||||||
auto values = constructor->values;
|
auto values = constructor->values;
|
||||||
ASSERT_EQ(values.size(), 2u);
|
ASSERT_EQ(values.size(), 2u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[0]->Is<ast::UintLiteral>());
|
ASSERT_TRUE(values[0]->Is<ast::UintLiteralExpression>());
|
||||||
EXPECT_EQ(values[0]->As<ast::UintLiteral>()->value, 1u);
|
EXPECT_EQ(values[0]->As<ast::UintLiteralExpression>()->value, 1u);
|
||||||
|
|
||||||
ASSERT_TRUE(values[1]->Is<ast::FloatLiteral>());
|
ASSERT_TRUE(values[1]->Is<ast::FloatLiteralExpression>());
|
||||||
EXPECT_EQ(values[1]->As<ast::FloatLiteral>()->value, 2.f);
|
EXPECT_EQ(values[1]->As<ast::FloatLiteralExpression>()->value, 2.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, PrimaryExpression_ConstLiteral_True) {
|
TEST_F(ParserImplTest, PrimaryExpression_ConstLiteral_True) {
|
||||||
|
@ -173,8 +173,8 @@ TEST_F(ParserImplTest, PrimaryExpression_ConstLiteral_True) {
|
||||||
EXPECT_FALSE(e.errored);
|
EXPECT_FALSE(e.errored);
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
EXPECT_FALSE(p->has_error()) << p->error();
|
||||||
ASSERT_NE(e.value, nullptr);
|
ASSERT_NE(e.value, nullptr);
|
||||||
ASSERT_TRUE(e->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(e->Is<ast::BoolLiteralExpression>());
|
||||||
EXPECT_TRUE(e->As<ast::BoolLiteral>()->value);
|
EXPECT_TRUE(e->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, PrimaryExpression_ParenExpr) {
|
TEST_F(ParserImplTest, PrimaryExpression_ParenExpr) {
|
||||||
|
@ -231,7 +231,7 @@ TEST_F(ParserImplTest, PrimaryExpression_Cast) {
|
||||||
ASSERT_TRUE(c->type->Is<ast::F32>());
|
ASSERT_TRUE(c->type->Is<ast::F32>());
|
||||||
ASSERT_EQ(c->values.size(), 1u);
|
ASSERT_EQ(c->values.size(), 1u);
|
||||||
|
|
||||||
ASSERT_TRUE(c->values[0]->Is<ast::IntLiteral>());
|
ASSERT_TRUE(c->values[0]->Is<ast::IntLiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, PrimaryExpression_Bitcast) {
|
TEST_F(ParserImplTest, PrimaryExpression_Bitcast) {
|
||||||
|
@ -246,7 +246,7 @@ TEST_F(ParserImplTest, PrimaryExpression_Bitcast) {
|
||||||
|
|
||||||
auto* c = e->As<ast::BitcastExpression>();
|
auto* c = e->As<ast::BitcastExpression>();
|
||||||
ASSERT_TRUE(c->type->Is<ast::F32>());
|
ASSERT_TRUE(c->type->Is<ast::F32>());
|
||||||
ASSERT_TRUE(c->expr->Is<ast::IntLiteral>());
|
ASSERT_TRUE(c->expr->Is<ast::IntLiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, PrimaryExpression_Bitcast_MissingGreaterThan) {
|
TEST_F(ParserImplTest, PrimaryExpression_Bitcast_MissingGreaterThan) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, RelationalExpression_Parses_LessThan) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThan) {
|
TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThan) {
|
||||||
|
@ -55,8 +55,8 @@ TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThan) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, RelationalExpression_Parses_LessThanEqual) {
|
TEST_F(ParserImplTest, RelationalExpression_Parses_LessThanEqual) {
|
||||||
|
@ -75,8 +75,8 @@ TEST_F(ParserImplTest, RelationalExpression_Parses_LessThanEqual) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThanEqual) {
|
TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThanEqual) {
|
||||||
|
@ -95,8 +95,8 @@ TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThanEqual) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Register("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, RelationalExpression_InvalidLHS) {
|
TEST_F(ParserImplTest, RelationalExpression_InvalidLHS) {
|
||||||
|
|
|
@ -35,8 +35,8 @@ TEST_F(ParserImplTest, ShiftExpression_Parses_ShiftLeft) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ShiftExpression_Parses_ShiftRight) {
|
TEST_F(ParserImplTest, ShiftExpression_Parses_ShiftRight) {
|
||||||
|
@ -55,8 +55,8 @@ TEST_F(ParserImplTest, ShiftExpression_Parses_ShiftRight) {
|
||||||
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
auto* ident = rel->lhs->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteral>());
|
ASSERT_TRUE(rel->rhs->Is<ast::BoolLiteralExpression>());
|
||||||
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteral>()->value);
|
ASSERT_TRUE(rel->rhs->As<ast::BoolLiteralExpression>()->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ShiftExpression_InvalidSpaceLeft) {
|
TEST_F(ParserImplTest, ShiftExpression_InvalidSpaceLeft) {
|
||||||
|
|
|
@ -34,8 +34,8 @@ TEST_F(ParserImplTest, SingularExpression_Array_ConstantIndex) {
|
||||||
auto* ident = idx->object->As<ast::IdentifierExpression>();
|
auto* ident = idx->object->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(idx->index->Is<ast::SintLiteral>());
|
ASSERT_TRUE(idx->index->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(idx->index->As<ast::SintLiteral>()->value, 1);
|
EXPECT_EQ(idx->index->As<ast::SintLiteralExpression>()->value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, SingularExpression_Array_ExpressionIndex) {
|
TEST_F(ParserImplTest, SingularExpression_Array_ExpressionIndex) {
|
||||||
|
@ -116,7 +116,7 @@ TEST_F(ParserImplTest, SingularExpression_Call_WithArgs) {
|
||||||
EXPECT_EQ(c->func->symbol, p->builder().Symbols().Get("test"));
|
EXPECT_EQ(c->func->symbol, p->builder().Symbols().Get("test"));
|
||||||
|
|
||||||
EXPECT_EQ(c->args.size(), 3u);
|
EXPECT_EQ(c->args.size(), 3u);
|
||||||
EXPECT_TRUE(c->args[0]->Is<ast::IntLiteral>());
|
EXPECT_TRUE(c->args[0]->Is<ast::IntLiteralExpression>());
|
||||||
EXPECT_TRUE(c->args[1]->Is<ast::IdentifierExpression>());
|
EXPECT_TRUE(c->args[1]->Is<ast::IdentifierExpression>());
|
||||||
EXPECT_TRUE(c->args[2]->Is<ast::BinaryExpression>());
|
EXPECT_TRUE(c->args[2]->Is<ast::BinaryExpression>());
|
||||||
}
|
}
|
||||||
|
|
|
@ -455,7 +455,7 @@ TEST_F(ParserImplTest, TypeDecl_Array_SintLiteralSize) {
|
||||||
EXPECT_EQ(a->decorations.size(), 0u);
|
EXPECT_EQ(a->decorations.size(), 0u);
|
||||||
EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 14u}}));
|
EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 14u}}));
|
||||||
|
|
||||||
auto* size = a->count->As<ast::SintLiteral>();
|
auto* size = a->count->As<ast::SintLiteralExpression>();
|
||||||
ASSERT_NE(size, nullptr);
|
ASSERT_NE(size, nullptr);
|
||||||
EXPECT_EQ(size->ValueAsI32(), 5);
|
EXPECT_EQ(size->ValueAsI32(), 5);
|
||||||
}
|
}
|
||||||
|
@ -475,7 +475,7 @@ TEST_F(ParserImplTest, TypeDecl_Array_UintLiteralSize) {
|
||||||
EXPECT_EQ(a->decorations.size(), 0u);
|
EXPECT_EQ(a->decorations.size(), 0u);
|
||||||
EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 15u}}));
|
EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 15u}}));
|
||||||
|
|
||||||
auto* size = a->count->As<ast::UintLiteral>();
|
auto* size = a->count->As<ast::UintLiteralExpression>();
|
||||||
ASSERT_NE(size, nullptr);
|
ASSERT_NE(size, nullptr);
|
||||||
EXPECT_EQ(size->ValueAsU32(), 5u);
|
EXPECT_EQ(size->ValueAsU32(), 5u);
|
||||||
}
|
}
|
||||||
|
@ -513,7 +513,7 @@ TEST_F(ParserImplTest, TypeDecl_Array_Stride) {
|
||||||
ASSERT_FALSE(a->IsRuntimeArray());
|
ASSERT_FALSE(a->IsRuntimeArray());
|
||||||
ASSERT_TRUE(a->type->Is<ast::F32>());
|
ASSERT_TRUE(a->type->Is<ast::F32>());
|
||||||
|
|
||||||
auto* size = a->count->As<ast::SintLiteral>();
|
auto* size = a->count->As<ast::SintLiteralExpression>();
|
||||||
ASSERT_NE(size, nullptr);
|
ASSERT_NE(size, nullptr);
|
||||||
EXPECT_EQ(size->ValueAsI32(), 5);
|
EXPECT_EQ(size->ValueAsI32(), 5);
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,8 @@ TEST_F(ParserImplTest, UnaryExpression_Postix) {
|
||||||
auto* ident = idx->object->As<ast::IdentifierExpression>();
|
auto* ident = idx->object->As<ast::IdentifierExpression>();
|
||||||
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
EXPECT_EQ(ident->symbol, p->builder().Symbols().Get("a"));
|
||||||
|
|
||||||
ASSERT_TRUE(idx->index->Is<ast::SintLiteral>());
|
ASSERT_TRUE(idx->index->Is<ast::SintLiteralExpression>());
|
||||||
ASSERT_EQ(idx->index->As<ast::SintLiteral>()->value, 2);
|
ASSERT_EQ(idx->index->As<ast::SintLiteralExpression>()->value, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, UnaryExpression_Minus) {
|
TEST_F(ParserImplTest, UnaryExpression_Minus) {
|
||||||
|
@ -50,8 +50,8 @@ TEST_F(ParserImplTest, UnaryExpression_Minus) {
|
||||||
auto* u = e->As<ast::UnaryOpExpression>();
|
auto* u = e->As<ast::UnaryOpExpression>();
|
||||||
ASSERT_EQ(u->op, ast::UnaryOp::kNegation);
|
ASSERT_EQ(u->op, ast::UnaryOp::kNegation);
|
||||||
|
|
||||||
ASSERT_TRUE(u->expr->Is<ast::SintLiteral>());
|
ASSERT_TRUE(u->expr->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(u->expr->As<ast::SintLiteral>()->value, 1);
|
EXPECT_EQ(u->expr->As<ast::SintLiteralExpression>()->value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, UnaryExpression_AddressOf) {
|
TEST_F(ParserImplTest, UnaryExpression_AddressOf) {
|
||||||
|
@ -132,8 +132,8 @@ TEST_F(ParserImplTest, UnaryExpression_Bang) {
|
||||||
auto* u = e->As<ast::UnaryOpExpression>();
|
auto* u = e->As<ast::UnaryOpExpression>();
|
||||||
ASSERT_EQ(u->op, ast::UnaryOp::kNot);
|
ASSERT_EQ(u->op, ast::UnaryOp::kNot);
|
||||||
|
|
||||||
ASSERT_TRUE(u->expr->Is<ast::SintLiteral>());
|
ASSERT_TRUE(u->expr->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(u->expr->As<ast::SintLiteral>()->value, 1);
|
EXPECT_EQ(u->expr->As<ast::SintLiteralExpression>()->value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, UnaryExpression_Bang_InvalidRHS) {
|
TEST_F(ParserImplTest, UnaryExpression_Bang_InvalidRHS) {
|
||||||
|
@ -158,8 +158,8 @@ TEST_F(ParserImplTest, UnaryExpression_Tilde) {
|
||||||
auto* u = e->As<ast::UnaryOpExpression>();
|
auto* u = e->As<ast::UnaryOpExpression>();
|
||||||
ASSERT_EQ(u->op, ast::UnaryOp::kComplement);
|
ASSERT_EQ(u->op, ast::UnaryOp::kComplement);
|
||||||
|
|
||||||
ASSERT_TRUE(u->expr->Is<ast::SintLiteral>());
|
ASSERT_TRUE(u->expr->Is<ast::SintLiteralExpression>());
|
||||||
EXPECT_EQ(u->expr->As<ast::SintLiteral>()->value, 1);
|
EXPECT_EQ(u->expr->As<ast::SintLiteralExpression>()->value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, UnaryExpression_PrefixPlusPlus) {
|
TEST_F(ParserImplTest, UnaryExpression_PrefixPlusPlus) {
|
||||||
|
|
|
@ -55,7 +55,7 @@ TEST_F(ParserImplTest, VariableStmt_VariableDecl_WithInit) {
|
||||||
ASSERT_EQ(e->source.range.end.column, 6u);
|
ASSERT_EQ(e->source.range.end.column, 6u);
|
||||||
|
|
||||||
ASSERT_NE(e->variable->constructor, nullptr);
|
ASSERT_NE(e->variable->constructor, nullptr);
|
||||||
EXPECT_TRUE(e->variable->constructor->Is<ast::Literal>());
|
EXPECT_TRUE(e->variable->constructor->Is<ast::LiteralExpression>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, VariableStmt_VariableDecl_Invalid) {
|
TEST_F(ParserImplTest, VariableStmt_VariableDecl_Invalid) {
|
||||||
|
|
|
@ -2015,7 +2015,7 @@ bool Resolver::WorkgroupSizeFor(const ast::Function* func,
|
||||||
ws[i].value = 0;
|
ws[i].value = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (!expr->Is<ast::Literal>()) {
|
} else if (!expr->Is<ast::LiteralExpression>()) {
|
||||||
AddError(
|
AddError(
|
||||||
"workgroup_size argument must be either a literal or a "
|
"workgroup_size argument must be either a literal or a "
|
||||||
"module-scope constant",
|
"module-scope constant",
|
||||||
|
@ -2367,7 +2367,7 @@ sem::Expression* Resolver::Expression(const ast::Expression* root) {
|
||||||
sem_expr = TypeConstructor(ctor);
|
sem_expr = TypeConstructor(ctor);
|
||||||
} else if (auto* ident = expr->As<ast::IdentifierExpression>()) {
|
} else if (auto* ident = expr->As<ast::IdentifierExpression>()) {
|
||||||
sem_expr = Identifier(ident);
|
sem_expr = Identifier(ident);
|
||||||
} else if (auto* literal = expr->As<ast::Literal>()) {
|
} else if (auto* literal = expr->As<ast::LiteralExpression>()) {
|
||||||
sem_expr = Literal(literal);
|
sem_expr = Literal(literal);
|
||||||
} else if (auto* member = expr->As<ast::MemberAccessorExpression>()) {
|
} else if (auto* member = expr->As<ast::MemberAccessorExpression>()) {
|
||||||
sem_expr = MemberAccessor(member);
|
sem_expr = MemberAccessor(member);
|
||||||
|
@ -2424,7 +2424,7 @@ sem::Expression* Resolver::IndexAccessor(
|
||||||
if (!parent_raw_ty->Is<sem::Reference>()) {
|
if (!parent_raw_ty->Is<sem::Reference>()) {
|
||||||
// TODO(bclayton): expand this to allow any const_expr expression
|
// TODO(bclayton): expand this to allow any const_expr expression
|
||||||
// https://github.com/gpuweb/gpuweb/issues/1272
|
// https://github.com/gpuweb/gpuweb/issues/1272
|
||||||
if (!idx->As<ast::IntLiteral>()) {
|
if (!idx->As<ast::IntLiteralExpression>()) {
|
||||||
AddError("index must be signed or unsigned integer literal",
|
AddError("index must be signed or unsigned integer literal",
|
||||||
idx->source);
|
idx->source);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -2617,7 +2617,8 @@ bool Resolver::ValidateTextureIntrinsicFunction(const sem::Call* call) {
|
||||||
bool is_const_expr = true;
|
bool is_const_expr = true;
|
||||||
ast::TraverseExpressions(
|
ast::TraverseExpressions(
|
||||||
arg->Declaration(), diagnostics_, [&](const ast::Expression* e) {
|
arg->Declaration(), diagnostics_, [&](const ast::Expression* e) {
|
||||||
if (e->IsAnyOf<ast::Literal, ast::TypeConstructorExpression>()) {
|
if (e->IsAnyOf<ast::LiteralExpression,
|
||||||
|
ast::TypeConstructorExpression>()) {
|
||||||
return ast::TraverseAction::Descend;
|
return ast::TraverseAction::Descend;
|
||||||
}
|
}
|
||||||
is_const_expr = false;
|
is_const_expr = false;
|
||||||
|
@ -2764,7 +2765,7 @@ sem::Expression* Resolver::TypeConstructor(
|
||||||
return builder_->create<sem::Expression>(expr, ty, current_statement_, val);
|
return builder_->create<sem::Expression>(expr, ty, current_statement_, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
sem::Expression* Resolver::Literal(const ast::Literal* literal) {
|
sem::Expression* Resolver::Literal(const ast::LiteralExpression* literal) {
|
||||||
auto* ty = TypeOf(literal);
|
auto* ty = TypeOf(literal);
|
||||||
if (!ty) {
|
if (!ty) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -3574,17 +3575,17 @@ std::string Resolver::RawTypeNameOf(const sem::Type* ty) {
|
||||||
return ty->FriendlyName(builder_->Symbols());
|
return ty->FriendlyName(builder_->Symbols());
|
||||||
}
|
}
|
||||||
|
|
||||||
sem::Type* Resolver::TypeOf(const ast::Literal* lit) {
|
sem::Type* Resolver::TypeOf(const ast::LiteralExpression* lit) {
|
||||||
if (lit->Is<ast::SintLiteral>()) {
|
if (lit->Is<ast::SintLiteralExpression>()) {
|
||||||
return builder_->create<sem::I32>();
|
return builder_->create<sem::I32>();
|
||||||
}
|
}
|
||||||
if (lit->Is<ast::UintLiteral>()) {
|
if (lit->Is<ast::UintLiteralExpression>()) {
|
||||||
return builder_->create<sem::U32>();
|
return builder_->create<sem::U32>();
|
||||||
}
|
}
|
||||||
if (lit->Is<ast::FloatLiteral>()) {
|
if (lit->Is<ast::FloatLiteralExpression>()) {
|
||||||
return builder_->create<sem::F32>();
|
return builder_->create<sem::F32>();
|
||||||
}
|
}
|
||||||
if (lit->Is<ast::BoolLiteral>()) {
|
if (lit->Is<ast::BoolLiteralExpression>()) {
|
||||||
return builder_->create<sem::Bool>();
|
return builder_->create<sem::Bool>();
|
||||||
}
|
}
|
||||||
TINT_UNREACHABLE(Resolver, diagnostics_)
|
TINT_UNREACHABLE(Resolver, diagnostics_)
|
||||||
|
@ -3780,7 +3781,7 @@ sem::Array* Resolver::Array(const ast::Array* arr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
count_expr = var->Declaration()->constructor;
|
count_expr = var->Declaration()->constructor;
|
||||||
} else if (!count_expr->Is<ast::Literal>()) {
|
} else if (!count_expr->Is<ast::LiteralExpression>()) {
|
||||||
AddError(
|
AddError(
|
||||||
"array size expression must be either a literal or a module-scope "
|
"array size expression must be either a literal or a module-scope "
|
||||||
"constant",
|
"constant",
|
||||||
|
@ -4259,7 +4260,7 @@ bool Resolver::ValidateSwitch(const ast::SwitchStatement* s) {
|
||||||
auto v = selector->ValueAsU32();
|
auto v = selector->ValueAsU32();
|
||||||
auto it = selectors.find(v);
|
auto it = selectors.find(v);
|
||||||
if (it != selectors.end()) {
|
if (it != selectors.end()) {
|
||||||
auto val = selector->Is<ast::IntLiteral>()
|
auto val = selector->Is<ast::IntLiteralExpression>()
|
||||||
? std::to_string(selector->ValueAsI32())
|
? std::to_string(selector->ValueAsI32())
|
||||||
: std::to_string(selector->ValueAsU32());
|
: std::to_string(selector->ValueAsU32());
|
||||||
AddError("duplicate switch case '" + val + "'", selector->source);
|
AddError("duplicate switch case '" + val + "'", selector->source);
|
||||||
|
|
|
@ -176,7 +176,7 @@ class Resolver {
|
||||||
sem::Call* FunctionCall(const ast::CallExpression*);
|
sem::Call* FunctionCall(const ast::CallExpression*);
|
||||||
sem::Expression* Identifier(const ast::IdentifierExpression*);
|
sem::Expression* Identifier(const ast::IdentifierExpression*);
|
||||||
sem::Call* IntrinsicCall(const ast::CallExpression*, sem::IntrinsicType);
|
sem::Call* IntrinsicCall(const ast::CallExpression*, sem::IntrinsicType);
|
||||||
sem::Expression* Literal(const ast::Literal*);
|
sem::Expression* Literal(const ast::LiteralExpression*);
|
||||||
sem::Expression* MemberAccessor(const ast::MemberAccessorExpression*);
|
sem::Expression* MemberAccessor(const ast::MemberAccessorExpression*);
|
||||||
sem::Expression* TypeConstructor(const ast::TypeConstructorExpression*);
|
sem::Expression* TypeConstructor(const ast::TypeConstructorExpression*);
|
||||||
sem::Expression* UnaryOp(const ast::UnaryOpExpression*);
|
sem::Expression* UnaryOp(const ast::UnaryOpExpression*);
|
||||||
|
@ -329,7 +329,7 @@ class Resolver {
|
||||||
|
|
||||||
/// @returns the semantic type of the AST literal `lit`
|
/// @returns the semantic type of the AST literal `lit`
|
||||||
/// @param lit the literal
|
/// @param lit the literal
|
||||||
sem::Type* TypeOf(const ast::Literal* lit);
|
sem::Type* TypeOf(const ast::LiteralExpression* lit);
|
||||||
|
|
||||||
/// Assigns `stmt` to #current_statement_, #current_compound_statement_, and
|
/// Assigns `stmt` to #current_statement_, #current_compound_statement_, and
|
||||||
/// possibly #current_block_, pushes the variable scope, then calls
|
/// possibly #current_block_, pushes the variable scope, then calls
|
||||||
|
@ -376,7 +376,7 @@ class Resolver {
|
||||||
|
|
||||||
sem::Constant EvaluateConstantValue(const ast::Expression* expr,
|
sem::Constant EvaluateConstantValue(const ast::Expression* expr,
|
||||||
const sem::Type* type);
|
const sem::Type* type);
|
||||||
sem::Constant EvaluateConstantValue(const ast::Literal* literal,
|
sem::Constant EvaluateConstantValue(const ast::LiteralExpression* literal,
|
||||||
const sem::Type* type);
|
const sem::Type* type);
|
||||||
sem::Constant EvaluateConstantValue(
|
sem::Constant EvaluateConstantValue(
|
||||||
const ast::TypeConstructorExpression* type_ctor,
|
const ast::TypeConstructorExpression* type_ctor,
|
||||||
|
|
|
@ -29,7 +29,7 @@ using f32 = ProgramBuilder::f32;
|
||||||
|
|
||||||
sem::Constant Resolver::EvaluateConstantValue(const ast::Expression* expr,
|
sem::Constant Resolver::EvaluateConstantValue(const ast::Expression* expr,
|
||||||
const sem::Type* type) {
|
const sem::Type* type) {
|
||||||
if (auto* e = expr->As<ast::Literal>()) {
|
if (auto* e = expr->As<ast::LiteralExpression>()) {
|
||||||
return EvaluateConstantValue(e, type);
|
return EvaluateConstantValue(e, type);
|
||||||
}
|
}
|
||||||
if (auto* e = expr->As<ast::TypeConstructorExpression>()) {
|
if (auto* e = expr->As<ast::TypeConstructorExpression>()) {
|
||||||
|
@ -38,18 +38,19 @@ sem::Constant Resolver::EvaluateConstantValue(const ast::Expression* expr,
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
sem::Constant Resolver::EvaluateConstantValue(const ast::Literal* literal,
|
sem::Constant Resolver::EvaluateConstantValue(
|
||||||
const sem::Type* type) {
|
const ast::LiteralExpression* literal,
|
||||||
if (auto* lit = literal->As<ast::SintLiteral>()) {
|
const sem::Type* type) {
|
||||||
|
if (auto* lit = literal->As<ast::SintLiteralExpression>()) {
|
||||||
return {type, {lit->ValueAsI32()}};
|
return {type, {lit->ValueAsI32()}};
|
||||||
}
|
}
|
||||||
if (auto* lit = literal->As<ast::UintLiteral>()) {
|
if (auto* lit = literal->As<ast::UintLiteralExpression>()) {
|
||||||
return {type, {lit->ValueAsU32()}};
|
return {type, {lit->ValueAsU32()}};
|
||||||
}
|
}
|
||||||
if (auto* lit = literal->As<ast::FloatLiteral>()) {
|
if (auto* lit = literal->As<ast::FloatLiteralExpression>()) {
|
||||||
return {type, {lit->value}};
|
return {type, {lit->value}};
|
||||||
}
|
}
|
||||||
if (auto* lit = literal->As<ast::BoolLiteral>()) {
|
if (auto* lit = literal->As<ast::BoolLiteralExpression>()) {
|
||||||
return {type, {lit->value}};
|
return {type, {lit->value}};
|
||||||
}
|
}
|
||||||
TINT_UNREACHABLE(Resolver, builder_->Diagnostics());
|
TINT_UNREACHABLE(Resolver, builder_->Diagnostics());
|
||||||
|
|
|
@ -114,7 +114,7 @@ TEST_F(ResolverTest, Stmt_Case) {
|
||||||
auto* assign = Assign(lhs, rhs);
|
auto* assign = Assign(lhs, rhs);
|
||||||
auto* block = Block(assign);
|
auto* block = Block(assign);
|
||||||
ast::CaseSelectorList lit;
|
ast::CaseSelectorList lit;
|
||||||
lit.push_back(create<ast::SintLiteral>(3));
|
lit.push_back(create<ast::SintLiteralExpression>(3));
|
||||||
auto* cse = create<ast::CaseStatement>(lit, block);
|
auto* cse = create<ast::CaseStatement>(lit, block);
|
||||||
auto* cond_var = Var("c", ty.i32());
|
auto* cond_var = Var("c", ty.i32());
|
||||||
auto* sw = Switch(cond_var, cse, DefaultCase());
|
auto* sw = Switch(cond_var, cse, DefaultCase());
|
||||||
|
|
|
@ -330,9 +330,9 @@ struct DecomposeMemoryAccess::State {
|
||||||
/// @param expr the expression to convert to an Offset
|
/// @param expr the expression to convert to an Offset
|
||||||
/// @returns an Offset for the given ast::Expression
|
/// @returns an Offset for the given ast::Expression
|
||||||
const Offset* ToOffset(const ast::Expression* expr) {
|
const Offset* ToOffset(const ast::Expression* expr) {
|
||||||
if (auto* u32 = expr->As<ast::UintLiteral>()) {
|
if (auto* u32 = expr->As<ast::UintLiteralExpression>()) {
|
||||||
return offsets_.Create<OffsetLiteral>(u32->value);
|
return offsets_.Create<OffsetLiteral>(u32->value);
|
||||||
} else if (auto* i32 = expr->As<ast::SintLiteral>()) {
|
} else if (auto* i32 = expr->As<ast::SintLiteralExpression>()) {
|
||||||
if (i32->value > 0) {
|
if (i32->value > 0) {
|
||||||
return offsets_.Create<OffsetLiteral>(i32->value);
|
return offsets_.Create<OffsetLiteral>(i32->value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,8 +81,10 @@ void FoldConstants::Run(CloneContext& ctx, const DataMap&, DataMap&) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ty->is_scalar()) {
|
if (ty->is_scalar()) {
|
||||||
return value.WithScalarAt(
|
return value.WithScalarAt(0,
|
||||||
0, [&](auto&& s) -> const ast::Literal* { return ctx.dst->Expr(s); });
|
[&](auto&& s) -> const ast::LiteralExpression* {
|
||||||
|
return ctx.dst->Expr(s);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -37,7 +37,7 @@ const ast::VariableDeclStatement* AsTrivialLetDecl(const ast::Statement* stmt) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
auto* ctor = var->constructor;
|
auto* ctor = var->constructor;
|
||||||
if (!IsAnyOf<ast::IdentifierExpression, ast::Literal>(ctor)) {
|
if (!IsAnyOf<ast::IdentifierExpression, ast::LiteralExpression>(ctor)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return var_decl;
|
return var_decl;
|
||||||
|
|
|
@ -46,7 +46,7 @@ void CollectSavedArrayIndices(const Program* program,
|
||||||
if (auto* a = expr->As<ast::IndexAccessorExpression>()) {
|
if (auto* a = expr->As<ast::IndexAccessorExpression>()) {
|
||||||
CollectSavedArrayIndices(program, a->object, cb);
|
CollectSavedArrayIndices(program, a->object, cb);
|
||||||
|
|
||||||
if (!a->index->Is<ast::Literal>()) {
|
if (!a->index->Is<ast::LiteralExpression>()) {
|
||||||
cb(a->index);
|
cb(a->index);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -84,7 +84,7 @@ TEST_F(CreateASTTypeForTest, ArrayImplicitStride) {
|
||||||
ASSERT_TRUE(arr->As<ast::Array>()->type->Is<ast::F32>());
|
ASSERT_TRUE(arr->As<ast::Array>()->type->Is<ast::F32>());
|
||||||
ASSERT_EQ(arr->As<ast::Array>()->decorations.size(), 0u);
|
ASSERT_EQ(arr->As<ast::Array>()->decorations.size(), 0u);
|
||||||
|
|
||||||
auto* size = arr->As<ast::Array>()->count->As<ast::IntLiteral>();
|
auto* size = arr->As<ast::Array>()->count->As<ast::IntLiteralExpression>();
|
||||||
ASSERT_NE(size, nullptr);
|
ASSERT_NE(size, nullptr);
|
||||||
EXPECT_EQ(size->ValueAsI32(), 2);
|
EXPECT_EQ(size->ValueAsI32(), 2);
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ TEST_F(CreateASTTypeForTest, ArrayNonImplicitStride) {
|
||||||
->stride,
|
->stride,
|
||||||
64u);
|
64u);
|
||||||
|
|
||||||
auto* size = arr->As<ast::Array>()->count->As<ast::IntLiteral>();
|
auto* size = arr->As<ast::Array>()->count->As<ast::IntLiteralExpression>();
|
||||||
ASSERT_NE(size, nullptr);
|
ASSERT_NE(size, nullptr);
|
||||||
EXPECT_EQ(size->ValueAsI32(), 2);
|
EXPECT_EQ(size->ValueAsI32(), 2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ const ast::TypeConstructorExpression* AppendVector(
|
||||||
const auto num_supplied = vc->values.size();
|
const auto num_supplied = vc->values.size();
|
||||||
if (num_supplied == 0) {
|
if (num_supplied == 0) {
|
||||||
// Zero-value vector constructor. Populate with zeros
|
// Zero-value vector constructor. Populate with zeros
|
||||||
auto buildZero = [&]() -> const ast::Literal* {
|
auto buildZero = [&]() -> const ast::LiteralExpression* {
|
||||||
if (packed_el_sem_ty->Is<sem::I32>()) {
|
if (packed_el_sem_ty->Is<sem::I32>()) {
|
||||||
return b->Expr(0);
|
return b->Expr(0);
|
||||||
} else if (packed_el_sem_ty->Is<sem::U32>()) {
|
} else if (packed_el_sem_ty->Is<sem::U32>()) {
|
||||||
|
|
|
@ -249,7 +249,7 @@ TEST_F(AppendVectorTest, ZeroVec3i32_i32) {
|
||||||
ASSERT_NE(vec_0004, nullptr);
|
ASSERT_NE(vec_0004, nullptr);
|
||||||
ASSERT_EQ(vec_0004->values.size(), 4u);
|
ASSERT_EQ(vec_0004->values.size(), 4u);
|
||||||
for (size_t i = 0; i < 3; i++) {
|
for (size_t i = 0; i < 3; i++) {
|
||||||
auto* literal = As<ast::SintLiteral>(vec_0004->values[i]);
|
auto* literal = As<ast::SintLiteralExpression>(vec_0004->values[i]);
|
||||||
ASSERT_NE(literal, nullptr);
|
ASSERT_NE(literal, nullptr);
|
||||||
EXPECT_EQ(literal->value, 0);
|
EXPECT_EQ(literal->value, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1472,7 +1472,7 @@ bool GeneratorImpl::EmitExpression(std::ostream& out,
|
||||||
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
||||||
return EmitIdentifier(out, i);
|
return EmitIdentifier(out, i);
|
||||||
}
|
}
|
||||||
if (auto* l = expr->As<ast::Literal>()) {
|
if (auto* l = expr->As<ast::LiteralExpression>()) {
|
||||||
return EmitLiteral(out, l);
|
return EmitLiteral(out, l);
|
||||||
}
|
}
|
||||||
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
||||||
|
@ -2008,10 +2008,11 @@ bool GeneratorImpl::EmitEntryPointFunction(const ast::Function* func) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
bool GeneratorImpl::EmitLiteral(std::ostream& out,
|
||||||
if (auto* l = lit->As<ast::BoolLiteral>()) {
|
const ast::LiteralExpression* lit) {
|
||||||
|
if (auto* l = lit->As<ast::BoolLiteralExpression>()) {
|
||||||
out << (l->value ? "true" : "false");
|
out << (l->value ? "true" : "false");
|
||||||
} else if (auto* fl = lit->As<ast::FloatLiteral>()) {
|
} else if (auto* fl = lit->As<ast::FloatLiteralExpression>()) {
|
||||||
if (std::isinf(fl->value)) {
|
if (std::isinf(fl->value)) {
|
||||||
out << (fl->value >= 0 ? "asfloat(0x7f800000u)" : "asfloat(0xff800000u)");
|
out << (fl->value >= 0 ? "asfloat(0x7f800000u)" : "asfloat(0xff800000u)");
|
||||||
} else if (std::isnan(fl->value)) {
|
} else if (std::isnan(fl->value)) {
|
||||||
|
@ -2019,9 +2020,9 @@ bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
||||||
} else {
|
} else {
|
||||||
out << FloatToString(fl->value) << "f";
|
out << FloatToString(fl->value) << "f";
|
||||||
}
|
}
|
||||||
} else if (auto* sl = lit->As<ast::SintLiteral>()) {
|
} else if (auto* sl = lit->As<ast::SintLiteralExpression>()) {
|
||||||
out << sl->value;
|
out << sl->value;
|
||||||
} else if (auto* ul = lit->As<ast::UintLiteral>()) {
|
} else if (auto* ul = lit->As<ast::UintLiteralExpression>()) {
|
||||||
out << ul->value << "u";
|
out << ul->value << "u";
|
||||||
} else {
|
} else {
|
||||||
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
||||||
|
|
|
@ -254,7 +254,7 @@ class GeneratorImpl : public TextGenerator {
|
||||||
/// @param out the output stream
|
/// @param out the output stream
|
||||||
/// @param lit the literal to emit
|
/// @param lit the literal to emit
|
||||||
/// @returns true if the literal was successfully emitted
|
/// @returns true if the literal was successfully emitted
|
||||||
bool EmitLiteral(std::ostream& out, const ast::Literal* lit);
|
bool EmitLiteral(std::ostream& out, const ast::LiteralExpression* lit);
|
||||||
/// Handles a loop statement
|
/// Handles a loop statement
|
||||||
/// @param stmt the statement to emit
|
/// @param stmt the statement to emit
|
||||||
/// @returns true if the statement was emitted
|
/// @returns true if the statement was emitted
|
||||||
|
|
|
@ -2204,7 +2204,7 @@ bool GeneratorImpl::EmitExpression(std::ostream& out,
|
||||||
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
||||||
return EmitIdentifier(out, i);
|
return EmitIdentifier(out, i);
|
||||||
}
|
}
|
||||||
if (auto* l = expr->As<ast::Literal>()) {
|
if (auto* l = expr->As<ast::LiteralExpression>()) {
|
||||||
return EmitLiteral(out, l);
|
return EmitLiteral(out, l);
|
||||||
}
|
}
|
||||||
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
||||||
|
@ -2683,10 +2683,11 @@ bool GeneratorImpl::EmitEntryPointFunction(const ast::Function* func) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
bool GeneratorImpl::EmitLiteral(std::ostream& out,
|
||||||
if (auto* l = lit->As<ast::BoolLiteral>()) {
|
const ast::LiteralExpression* lit) {
|
||||||
|
if (auto* l = lit->As<ast::BoolLiteralExpression>()) {
|
||||||
out << (l->value ? "true" : "false");
|
out << (l->value ? "true" : "false");
|
||||||
} else if (auto* fl = lit->As<ast::FloatLiteral>()) {
|
} else if (auto* fl = lit->As<ast::FloatLiteralExpression>()) {
|
||||||
if (std::isinf(fl->value)) {
|
if (std::isinf(fl->value)) {
|
||||||
out << (fl->value >= 0 ? "asfloat(0x7f800000u)" : "asfloat(0xff800000u)");
|
out << (fl->value >= 0 ? "asfloat(0x7f800000u)" : "asfloat(0xff800000u)");
|
||||||
} else if (std::isnan(fl->value)) {
|
} else if (std::isnan(fl->value)) {
|
||||||
|
@ -2694,9 +2695,9 @@ bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
||||||
} else {
|
} else {
|
||||||
out << FloatToString(fl->value) << "f";
|
out << FloatToString(fl->value) << "f";
|
||||||
}
|
}
|
||||||
} else if (auto* sl = lit->As<ast::SintLiteral>()) {
|
} else if (auto* sl = lit->As<ast::SintLiteralExpression>()) {
|
||||||
out << sl->value;
|
out << sl->value;
|
||||||
} else if (auto* ul = lit->As<ast::UintLiteral>()) {
|
} else if (auto* ul = lit->As<ast::UintLiteralExpression>()) {
|
||||||
out << ul->value << "u";
|
out << ul->value << "u";
|
||||||
} else {
|
} else {
|
||||||
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
||||||
|
|
|
@ -287,7 +287,7 @@ class GeneratorImpl : public TextGenerator {
|
||||||
/// @param out the output stream
|
/// @param out the output stream
|
||||||
/// @param lit the literal to emit
|
/// @param lit the literal to emit
|
||||||
/// @returns true if the literal was successfully emitted
|
/// @returns true if the literal was successfully emitted
|
||||||
bool EmitLiteral(std::ostream& out, const ast::Literal* lit);
|
bool EmitLiteral(std::ostream& out, const ast::LiteralExpression* lit);
|
||||||
/// Handles a loop statement
|
/// Handles a loop statement
|
||||||
/// @param stmt the statement to emit
|
/// @param stmt the statement to emit
|
||||||
/// @returns true if the statement was emitted
|
/// @returns true if the statement was emitted
|
||||||
|
|
|
@ -1379,10 +1379,11 @@ bool GeneratorImpl::EmitZeroValue(std::ostream& out, const sem::Type* type) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
bool GeneratorImpl::EmitLiteral(std::ostream& out,
|
||||||
if (auto* l = lit->As<ast::BoolLiteral>()) {
|
const ast::LiteralExpression* lit) {
|
||||||
|
if (auto* l = lit->As<ast::BoolLiteralExpression>()) {
|
||||||
out << (l->value ? "true" : "false");
|
out << (l->value ? "true" : "false");
|
||||||
} else if (auto* fl = lit->As<ast::FloatLiteral>()) {
|
} else if (auto* fl = lit->As<ast::FloatLiteralExpression>()) {
|
||||||
if (std::isinf(fl->value)) {
|
if (std::isinf(fl->value)) {
|
||||||
out << (fl->value >= 0 ? "INFINITY" : "-INFINITY");
|
out << (fl->value >= 0 ? "INFINITY" : "-INFINITY");
|
||||||
} else if (std::isnan(fl->value)) {
|
} else if (std::isnan(fl->value)) {
|
||||||
|
@ -1390,7 +1391,7 @@ bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
||||||
} else {
|
} else {
|
||||||
out << FloatToString(fl->value) << "f";
|
out << FloatToString(fl->value) << "f";
|
||||||
}
|
}
|
||||||
} else if (auto* sl = lit->As<ast::SintLiteral>()) {
|
} else if (auto* sl = lit->As<ast::SintLiteralExpression>()) {
|
||||||
// MSL (and C++) parse `-2147483648` as a `long` because it parses unary
|
// MSL (and C++) parse `-2147483648` as a `long` because it parses unary
|
||||||
// minus and `2147483648` as separate tokens, and the latter doesn't
|
// minus and `2147483648` as separate tokens, and the latter doesn't
|
||||||
// fit into an (32-bit) `int`. WGSL, OTOH, parses this as an `i32`. To avoid
|
// fit into an (32-bit) `int`. WGSL, OTOH, parses this as an `i32`. To avoid
|
||||||
|
@ -1402,7 +1403,7 @@ bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
||||||
} else {
|
} else {
|
||||||
out << sl->value;
|
out << sl->value;
|
||||||
}
|
}
|
||||||
} else if (auto* ul = lit->As<ast::UintLiteral>()) {
|
} else if (auto* ul = lit->As<ast::UintLiteralExpression>()) {
|
||||||
out << ul->value << "u";
|
out << ul->value << "u";
|
||||||
} else {
|
} else {
|
||||||
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
||||||
|
@ -1431,7 +1432,7 @@ bool GeneratorImpl::EmitExpression(std::ostream& out,
|
||||||
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
||||||
return EmitIdentifier(out, i);
|
return EmitIdentifier(out, i);
|
||||||
}
|
}
|
||||||
if (auto* l = expr->As<ast::Literal>()) {
|
if (auto* l = expr->As<ast::LiteralExpression>()) {
|
||||||
return EmitLiteral(out, l);
|
return EmitLiteral(out, l);
|
||||||
}
|
}
|
||||||
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
||||||
|
|
|
@ -216,7 +216,7 @@ class GeneratorImpl : public TextGenerator {
|
||||||
/// @param out the output of the expression stream
|
/// @param out the output of the expression stream
|
||||||
/// @param lit the literal to emit
|
/// @param lit the literal to emit
|
||||||
/// @returns true if the literal was successfully emitted
|
/// @returns true if the literal was successfully emitted
|
||||||
bool EmitLiteral(std::ostream& out, const ast::Literal* lit);
|
bool EmitLiteral(std::ostream& out, const ast::LiteralExpression* lit);
|
||||||
/// Handles a loop statement
|
/// Handles a loop statement
|
||||||
/// @param stmt the statement to emit
|
/// @param stmt the statement to emit
|
||||||
/// @returns true if the statement was emitted
|
/// @returns true if the statement was emitted
|
||||||
|
|
|
@ -583,7 +583,7 @@ uint32_t Builder::GenerateExpression(const ast::Expression* expr) {
|
||||||
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
||||||
return GenerateIdentifierExpression(i);
|
return GenerateIdentifierExpression(i);
|
||||||
}
|
}
|
||||||
if (auto* l = expr->As<ast::Literal>()) {
|
if (auto* l = expr->As<ast::LiteralExpression>()) {
|
||||||
return GenerateLiteralIfNeeded(nullptr, l);
|
return GenerateLiteralIfNeeded(nullptr, l);
|
||||||
}
|
}
|
||||||
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
if (auto* m = expr->As<ast::MemberAccessorExpression>()) {
|
||||||
|
@ -777,16 +777,16 @@ bool Builder::GenerateGlobalVariable(const ast::Variable* var) {
|
||||||
|
|
||||||
// SPIR-V requires specialization constants to have initializers.
|
// SPIR-V requires specialization constants to have initializers.
|
||||||
if (type->Is<sem::F32>()) {
|
if (type->Is<sem::F32>()) {
|
||||||
ast::FloatLiteral l(ProgramID(), Source{}, 0.0f);
|
ast::FloatLiteralExpression l(ProgramID(), Source{}, 0.0f);
|
||||||
init_id = GenerateLiteralIfNeeded(var, &l);
|
init_id = GenerateLiteralIfNeeded(var, &l);
|
||||||
} else if (type->Is<sem::U32>()) {
|
} else if (type->Is<sem::U32>()) {
|
||||||
ast::UintLiteral l(ProgramID(), Source{}, 0);
|
ast::UintLiteralExpression l(ProgramID(), Source{}, 0);
|
||||||
init_id = GenerateLiteralIfNeeded(var, &l);
|
init_id = GenerateLiteralIfNeeded(var, &l);
|
||||||
} else if (type->Is<sem::I32>()) {
|
} else if (type->Is<sem::I32>()) {
|
||||||
ast::SintLiteral l(ProgramID(), Source{}, 0);
|
ast::SintLiteralExpression l(ProgramID(), Source{}, 0);
|
||||||
init_id = GenerateLiteralIfNeeded(var, &l);
|
init_id = GenerateLiteralIfNeeded(var, &l);
|
||||||
} else if (type->Is<sem::Bool>()) {
|
} else if (type->Is<sem::Bool>()) {
|
||||||
ast::BoolLiteral l(ProgramID(), Source{}, false);
|
ast::BoolLiteralExpression l(ProgramID(), Source{}, false);
|
||||||
init_id = GenerateLiteralIfNeeded(var, &l);
|
init_id = GenerateLiteralIfNeeded(var, &l);
|
||||||
} else {
|
} else {
|
||||||
error_ = "invalid type for pipeline constant ID, must be scalar";
|
error_ = "invalid type for pipeline constant ID, must be scalar";
|
||||||
|
@ -928,7 +928,7 @@ bool Builder::GenerateIndexAccessor(const ast::IndexAccessorExpression* expr,
|
||||||
auto extract_id = extract.to_i();
|
auto extract_id = extract.to_i();
|
||||||
|
|
||||||
// If the index is a literal, we use OpCompositeExtract.
|
// If the index is a literal, we use OpCompositeExtract.
|
||||||
if (auto* literal = expr->index->As<ast::IntLiteral>()) {
|
if (auto* literal = expr->index->As<ast::IntLiteralExpression>()) {
|
||||||
if (!push_function_inst(spv::Op::OpCompositeExtract,
|
if (!push_function_inst(spv::Op::OpCompositeExtract,
|
||||||
{Operand::Int(result_type_id), extract,
|
{Operand::Int(result_type_id), extract,
|
||||||
Operand::Int(info->source_id),
|
Operand::Int(info->source_id),
|
||||||
|
@ -1256,7 +1256,7 @@ uint32_t Builder::GetGLSLstd450Import() {
|
||||||
|
|
||||||
uint32_t Builder::GenerateConstructorExpression(const ast::Variable* var,
|
uint32_t Builder::GenerateConstructorExpression(const ast::Variable* var,
|
||||||
const ast::Expression* expr) {
|
const ast::Expression* expr) {
|
||||||
if (auto* literal = expr->As<ast::Literal>()) {
|
if (auto* literal = expr->As<ast::LiteralExpression>()) {
|
||||||
return GenerateLiteralIfNeeded(var, literal);
|
return GenerateLiteralIfNeeded(var, literal);
|
||||||
}
|
}
|
||||||
if (auto* type = expr->As<ast::TypeConstructorExpression>()) {
|
if (auto* type = expr->As<ast::TypeConstructorExpression>()) {
|
||||||
|
@ -1269,7 +1269,7 @@ uint32_t Builder::GenerateConstructorExpression(const ast::Variable* var,
|
||||||
|
|
||||||
bool Builder::is_constructor_const(const ast::Expression* expr,
|
bool Builder::is_constructor_const(const ast::Expression* expr,
|
||||||
bool is_global_init) {
|
bool is_global_init) {
|
||||||
if (expr->Is<ast::Literal>()) {
|
if (expr->Is<ast::LiteralExpression>()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1281,7 +1281,7 @@ bool Builder::is_constructor_const(const ast::Expression* expr,
|
||||||
for (size_t i = 0; i < tc->values.size(); ++i) {
|
for (size_t i = 0; i < tc->values.size(); ++i) {
|
||||||
auto* e = tc->values[i];
|
auto* e = tc->values[i];
|
||||||
|
|
||||||
if (!e->IsAnyOf<ast::TypeConstructorExpression, ast::Literal>()) {
|
if (!e->IsAnyOf<ast::TypeConstructorExpression, ast::LiteralExpression>()) {
|
||||||
if (is_global_init) {
|
if (is_global_init) {
|
||||||
error_ = "constructor must be a constant expression";
|
error_ = "constructor must be a constant expression";
|
||||||
return false;
|
return false;
|
||||||
|
@ -1295,7 +1295,7 @@ bool Builder::is_constructor_const(const ast::Expression* expr,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* lit = e->As<ast::Literal>();
|
auto* lit = e->As<ast::LiteralExpression>();
|
||||||
if (result_type->Is<sem::Vector>() && lit == nullptr) {
|
if (result_type->Is<sem::Vector>() && lit == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1610,18 +1610,18 @@ uint32_t Builder::GenerateCastOrCopyOrPassthrough(
|
||||||
uint32_t one_id;
|
uint32_t one_id;
|
||||||
uint32_t zero_id;
|
uint32_t zero_id;
|
||||||
if (to_elem_type->Is<sem::F32>()) {
|
if (to_elem_type->Is<sem::F32>()) {
|
||||||
ast::FloatLiteral one(ProgramID(), Source{}, 1.0f);
|
ast::FloatLiteralExpression one(ProgramID(), Source{}, 1.0f);
|
||||||
ast::FloatLiteral zero(ProgramID(), Source{}, 0.0f);
|
ast::FloatLiteralExpression zero(ProgramID(), Source{}, 0.0f);
|
||||||
one_id = GenerateLiteralIfNeeded(nullptr, &one);
|
one_id = GenerateLiteralIfNeeded(nullptr, &one);
|
||||||
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
|
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
|
||||||
} else if (to_elem_type->Is<sem::U32>()) {
|
} else if (to_elem_type->Is<sem::U32>()) {
|
||||||
ast::UintLiteral one(ProgramID(), Source{}, 1);
|
ast::UintLiteralExpression one(ProgramID(), Source{}, 1);
|
||||||
ast::UintLiteral zero(ProgramID(), Source{}, 0);
|
ast::UintLiteralExpression zero(ProgramID(), Source{}, 0);
|
||||||
one_id = GenerateLiteralIfNeeded(nullptr, &one);
|
one_id = GenerateLiteralIfNeeded(nullptr, &one);
|
||||||
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
|
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
|
||||||
} else if (to_elem_type->Is<sem::I32>()) {
|
} else if (to_elem_type->Is<sem::I32>()) {
|
||||||
ast::SintLiteral one(ProgramID(), Source{}, 1);
|
ast::SintLiteralExpression one(ProgramID(), Source{}, 1);
|
||||||
ast::SintLiteral zero(ProgramID(), Source{}, 0);
|
ast::SintLiteralExpression zero(ProgramID(), Source{}, 0);
|
||||||
one_id = GenerateLiteralIfNeeded(nullptr, &one);
|
one_id = GenerateLiteralIfNeeded(nullptr, &one);
|
||||||
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
|
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1665,7 +1665,7 @@ uint32_t Builder::GenerateCastOrCopyOrPassthrough(
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Builder::GenerateLiteralIfNeeded(const ast::Variable* var,
|
uint32_t Builder::GenerateLiteralIfNeeded(const ast::Variable* var,
|
||||||
const ast::Literal* lit) {
|
const ast::LiteralExpression* lit) {
|
||||||
ScalarConstant constant;
|
ScalarConstant constant;
|
||||||
|
|
||||||
auto* global = builder_.Sem().Get<sem::GlobalVariable>(var);
|
auto* global = builder_.Sem().Get<sem::GlobalVariable>(var);
|
||||||
|
@ -1674,16 +1674,16 @@ uint32_t Builder::GenerateLiteralIfNeeded(const ast::Variable* var,
|
||||||
constant.constant_id = global->ConstantId();
|
constant.constant_id = global->ConstantId();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto* l = lit->As<ast::BoolLiteral>()) {
|
if (auto* l = lit->As<ast::BoolLiteralExpression>()) {
|
||||||
constant.kind = ScalarConstant::Kind::kBool;
|
constant.kind = ScalarConstant::Kind::kBool;
|
||||||
constant.value.b = l->value;
|
constant.value.b = l->value;
|
||||||
} else if (auto* sl = lit->As<ast::SintLiteral>()) {
|
} else if (auto* sl = lit->As<ast::SintLiteralExpression>()) {
|
||||||
constant.kind = ScalarConstant::Kind::kI32;
|
constant.kind = ScalarConstant::Kind::kI32;
|
||||||
constant.value.i32 = sl->value;
|
constant.value.i32 = sl->value;
|
||||||
} else if (auto* ul = lit->As<ast::UintLiteral>()) {
|
} else if (auto* ul = lit->As<ast::UintLiteralExpression>()) {
|
||||||
constant.kind = ScalarConstant::Kind::kU32;
|
constant.kind = ScalarConstant::Kind::kU32;
|
||||||
constant.value.u32 = ul->value;
|
constant.value.u32 = ul->value;
|
||||||
} else if (auto* fl = lit->As<ast::FloatLiteral>()) {
|
} else if (auto* fl = lit->As<ast::FloatLiteralExpression>()) {
|
||||||
constant.kind = ScalarConstant::Kind::kF32;
|
constant.kind = ScalarConstant::Kind::kF32;
|
||||||
constant.value.f32 = fl->value;
|
constant.value.f32 = fl->value;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2920,7 +2920,7 @@ bool Builder::GenerateTextureIntrinsic(const ast::CallExpression* call,
|
||||||
op = spv::Op::OpImageQuerySizeLod;
|
op = spv::Op::OpImageQuerySizeLod;
|
||||||
spirv_params.emplace_back(gen(level));
|
spirv_params.emplace_back(gen(level));
|
||||||
} else {
|
} else {
|
||||||
ast::SintLiteral i32_0(ProgramID(), Source{}, 0);
|
ast::SintLiteralExpression i32_0(ProgramID(), Source{}, 0);
|
||||||
op = spv::Op::OpImageQuerySizeLod;
|
op = spv::Op::OpImageQuerySizeLod;
|
||||||
spirv_params.emplace_back(
|
spirv_params.emplace_back(
|
||||||
Operand::Int(GenerateLiteralIfNeeded(nullptr, &i32_0)));
|
Operand::Int(GenerateLiteralIfNeeded(nullptr, &i32_0)));
|
||||||
|
@ -2952,7 +2952,7 @@ bool Builder::GenerateTextureIntrinsic(const ast::CallExpression* call,
|
||||||
texture_type->Is<sem::StorageTexture>()) {
|
texture_type->Is<sem::StorageTexture>()) {
|
||||||
op = spv::Op::OpImageQuerySize;
|
op = spv::Op::OpImageQuerySize;
|
||||||
} else {
|
} else {
|
||||||
ast::SintLiteral i32_0(ProgramID(), Source{}, 0);
|
ast::SintLiteralExpression i32_0(ProgramID(), Source{}, 0);
|
||||||
op = spv::Op::OpImageQuerySizeLod;
|
op = spv::Op::OpImageQuerySizeLod;
|
||||||
spirv_params.emplace_back(
|
spirv_params.emplace_back(
|
||||||
Operand::Int(GenerateLiteralIfNeeded(nullptr, &i32_0)));
|
Operand::Int(GenerateLiteralIfNeeded(nullptr, &i32_0)));
|
||||||
|
@ -3074,7 +3074,7 @@ bool Builder::GenerateTextureIntrinsic(const ast::CallExpression* call,
|
||||||
}
|
}
|
||||||
spirv_params.emplace_back(gen_arg(Usage::kDepthRef));
|
spirv_params.emplace_back(gen_arg(Usage::kDepthRef));
|
||||||
|
|
||||||
ast::FloatLiteral float_0(ProgramID(), Source{}, 0.0);
|
ast::FloatLiteralExpression float_0(ProgramID(), Source{}, 0.0);
|
||||||
image_operands.emplace_back(ImageOperand{
|
image_operands.emplace_back(ImageOperand{
|
||||||
SpvImageOperandsLodMask,
|
SpvImageOperandsLodMask,
|
||||||
Operand::Int(GenerateLiteralIfNeeded(nullptr, &float_0))});
|
Operand::Int(GenerateLiteralIfNeeded(nullptr, &float_0))});
|
||||||
|
@ -3625,7 +3625,7 @@ bool Builder::GenerateSwitchStatement(const ast::SwitchStatement* stmt) {
|
||||||
|
|
||||||
case_ids.push_back(block_id);
|
case_ids.push_back(block_id);
|
||||||
for (auto* selector : item->selectors) {
|
for (auto* selector : item->selectors) {
|
||||||
auto* int_literal = selector->As<ast::IntLiteral>();
|
auto* int_literal = selector->As<ast::IntLiteralExpression>();
|
||||||
if (!int_literal) {
|
if (!int_literal) {
|
||||||
error_ = "expected integer literal for switch case label";
|
error_ = "expected integer literal for switch case label";
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -353,7 +353,7 @@ class Builder {
|
||||||
/// @param lit the literal to generate
|
/// @param lit the literal to generate
|
||||||
/// @returns the ID on success or 0 on failure
|
/// @returns the ID on success or 0 on failure
|
||||||
uint32_t GenerateLiteralIfNeeded(const ast::Variable* var,
|
uint32_t GenerateLiteralIfNeeded(const ast::Variable* var,
|
||||||
const ast::Literal* lit);
|
const ast::LiteralExpression* lit);
|
||||||
/// Generates a binary expression
|
/// Generates a binary expression
|
||||||
/// @param expr the expression to generate
|
/// @param expr the expression to generate
|
||||||
/// @returns the expression ID on success or 0 otherwise
|
/// @returns the expression ID on success or 0 otherwise
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace spirv {
|
||||||
using BuilderTest = TestHelper;
|
using BuilderTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_Bool_True) {
|
TEST_F(BuilderTest, Literal_Bool_True) {
|
||||||
auto* b_true = create<ast::BoolLiteral>(true);
|
auto* b_true = create<ast::BoolLiteralExpression>(true);
|
||||||
WrapInFunction(b_true);
|
WrapInFunction(b_true);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
@ -37,7 +37,7 @@ TEST_F(BuilderTest, Literal_Bool_True) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_Bool_False) {
|
TEST_F(BuilderTest, Literal_Bool_False) {
|
||||||
auto* b_false = create<ast::BoolLiteral>(false);
|
auto* b_false = create<ast::BoolLiteralExpression>(false);
|
||||||
WrapInFunction(b_false);
|
WrapInFunction(b_false);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
@ -52,8 +52,8 @@ TEST_F(BuilderTest, Literal_Bool_False) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_Bool_Dedup) {
|
TEST_F(BuilderTest, Literal_Bool_Dedup) {
|
||||||
auto* b_true = create<ast::BoolLiteral>(true);
|
auto* b_true = create<ast::BoolLiteralExpression>(true);
|
||||||
auto* b_false = create<ast::BoolLiteral>(false);
|
auto* b_false = create<ast::BoolLiteralExpression>(false);
|
||||||
WrapInFunction(b_true, b_false);
|
WrapInFunction(b_true, b_false);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
@ -72,7 +72,7 @@ TEST_F(BuilderTest, Literal_Bool_Dedup) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_I32) {
|
TEST_F(BuilderTest, Literal_I32) {
|
||||||
auto* i = create<ast::SintLiteral>(-23);
|
auto* i = create<ast::SintLiteralExpression>(-23);
|
||||||
WrapInFunction(i);
|
WrapInFunction(i);
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
|
||||||
|
@ -86,8 +86,8 @@ TEST_F(BuilderTest, Literal_I32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_I32_Dedup) {
|
TEST_F(BuilderTest, Literal_I32_Dedup) {
|
||||||
auto* i1 = create<ast::SintLiteral>(-23);
|
auto* i1 = create<ast::SintLiteralExpression>(-23);
|
||||||
auto* i2 = create<ast::SintLiteral>(-23);
|
auto* i2 = create<ast::SintLiteralExpression>(-23);
|
||||||
WrapInFunction(i1, i2);
|
WrapInFunction(i1, i2);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
@ -102,7 +102,7 @@ TEST_F(BuilderTest, Literal_I32_Dedup) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_U32) {
|
TEST_F(BuilderTest, Literal_U32) {
|
||||||
auto* i = create<ast::UintLiteral>(23);
|
auto* i = create<ast::UintLiteralExpression>(23);
|
||||||
WrapInFunction(i);
|
WrapInFunction(i);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
@ -117,8 +117,8 @@ TEST_F(BuilderTest, Literal_U32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_U32_Dedup) {
|
TEST_F(BuilderTest, Literal_U32_Dedup) {
|
||||||
auto* i1 = create<ast::UintLiteral>(23);
|
auto* i1 = create<ast::UintLiteralExpression>(23);
|
||||||
auto* i2 = create<ast::UintLiteral>(23);
|
auto* i2 = create<ast::UintLiteralExpression>(23);
|
||||||
WrapInFunction(i1, i2);
|
WrapInFunction(i1, i2);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
@ -133,7 +133,7 @@ TEST_F(BuilderTest, Literal_U32_Dedup) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_F32) {
|
TEST_F(BuilderTest, Literal_F32) {
|
||||||
auto* i = create<ast::FloatLiteral>(23.245f);
|
auto* i = create<ast::FloatLiteralExpression>(23.245f);
|
||||||
WrapInFunction(i);
|
WrapInFunction(i);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
@ -148,8 +148,8 @@ TEST_F(BuilderTest, Literal_F32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest, Literal_F32_Dedup) {
|
TEST_F(BuilderTest, Literal_F32_Dedup) {
|
||||||
auto* i1 = create<ast::FloatLiteral>(23.245f);
|
auto* i1 = create<ast::FloatLiteralExpression>(23.245f);
|
||||||
auto* i2 = create<ast::FloatLiteral>(23.245f);
|
auto* i2 = create<ast::FloatLiteralExpression>(23.245f);
|
||||||
WrapInFunction(i1, i2);
|
WrapInFunction(i1, i2);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
|
|
@ -131,7 +131,7 @@ bool GeneratorImpl::EmitExpression(std::ostream& out,
|
||||||
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
if (auto* i = expr->As<ast::IdentifierExpression>()) {
|
||||||
return EmitIdentifier(out, i);
|
return EmitIdentifier(out, i);
|
||||||
}
|
}
|
||||||
if (auto* l = expr->As<ast::Literal>()) {
|
if (auto* l = expr->As<ast::LiteralExpression>()) {
|
||||||
return EmitLiteral(out, l);
|
return EmitLiteral(out, l);
|
||||||
}
|
}
|
||||||
if (auto* c = expr->As<ast::TypeConstructorExpression>()) {
|
if (auto* c = expr->As<ast::TypeConstructorExpression>()) {
|
||||||
|
@ -268,14 +268,15 @@ bool GeneratorImpl::EmitTypeConstructor(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitLiteral(std::ostream& out, const ast::Literal* lit) {
|
bool GeneratorImpl::EmitLiteral(std::ostream& out,
|
||||||
if (auto* bl = lit->As<ast::BoolLiteral>()) {
|
const ast::LiteralExpression* lit) {
|
||||||
|
if (auto* bl = lit->As<ast::BoolLiteralExpression>()) {
|
||||||
out << (bl->value ? "true" : "false");
|
out << (bl->value ? "true" : "false");
|
||||||
} else if (auto* fl = lit->As<ast::FloatLiteral>()) {
|
} else if (auto* fl = lit->As<ast::FloatLiteralExpression>()) {
|
||||||
out << FloatToBitPreservingString(fl->value);
|
out << FloatToBitPreservingString(fl->value);
|
||||||
} else if (auto* sl = lit->As<ast::SintLiteral>()) {
|
} else if (auto* sl = lit->As<ast::SintLiteralExpression>()) {
|
||||||
out << sl->value;
|
out << sl->value;
|
||||||
} else if (auto* ul = lit->As<ast::UintLiteral>()) {
|
} else if (auto* ul = lit->As<ast::UintLiteralExpression>()) {
|
||||||
out << ul->value << "u";
|
out << ul->value << "u";
|
||||||
} else {
|
} else {
|
||||||
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
diagnostics_.add_error(diag::System::Writer, "unknown literal type");
|
||||||
|
|
|
@ -99,7 +99,7 @@ class GeneratorImpl : public TextGenerator {
|
||||||
/// @param out the output of the expression stream
|
/// @param out the output of the expression stream
|
||||||
/// @param expr the literal expression expression
|
/// @param expr the literal expression expression
|
||||||
/// @returns true if the literal expression is emitted
|
/// @returns true if the literal expression is emitted
|
||||||
bool EmitLiteral(std::ostream& out, const ast::Literal* expr);
|
bool EmitLiteral(std::ostream& out, const ast::LiteralExpression* expr);
|
||||||
/// Handles a continue statement
|
/// Handles a continue statement
|
||||||
/// @param stmt the statement to emit
|
/// @param stmt the statement to emit
|
||||||
/// @returns true if the statement was emitted successfully
|
/// @returns true if the statement was emitted successfully
|
||||||
|
|
Loading…
Reference in New Issue