ast: Add address-of and dereference unary ops
Nothing currently generates these. Resolver currently doesn't know how to handle these. Backends currently stubbed enough to build without warnings. Bug: tint:727 Change-Id: I4b9863ae098b903b51a63c36c10bc6e390efbbb3 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/50746 Commit-Queue: Ben Clayton <bclayton@google.com> Reviewed-by: David Neto <dneto@google.com> Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
parent
688fe4477d
commit
52b06fb4c5
|
@ -26,7 +26,7 @@ namespace ast {
|
||||||
/// A pointer type.
|
/// A pointer type.
|
||||||
class Pointer : public Castable<Pointer, Type> {
|
class Pointer : public Castable<Pointer, Type> {
|
||||||
public:
|
public:
|
||||||
/// Construtor
|
/// Constructor
|
||||||
/// @param program_id the identifier of the program that owns this node
|
/// @param program_id the identifier of the program that owns this node
|
||||||
/// @param source the source of this node
|
/// @param source the source of this node
|
||||||
/// @param subtype the pointee type
|
/// @param subtype the pointee type
|
||||||
|
|
|
@ -19,6 +19,14 @@ namespace ast {
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, UnaryOp mod) {
|
std::ostream& operator<<(std::ostream& out, UnaryOp mod) {
|
||||||
switch (mod) {
|
switch (mod) {
|
||||||
|
case UnaryOp::kAddressOf: {
|
||||||
|
out << "address-of";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case UnaryOp::kDereference: {
|
||||||
|
out << "dereference";
|
||||||
|
break;
|
||||||
|
}
|
||||||
case UnaryOp::kNegation: {
|
case UnaryOp::kNegation: {
|
||||||
out << "negation";
|
out << "negation";
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -21,7 +21,12 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
/// The unary op
|
/// The unary op
|
||||||
enum class UnaryOp { kNegation = 0, kNot };
|
enum class UnaryOp {
|
||||||
|
kAddressOf, // &EXPR
|
||||||
|
kDereference, // *EXPR
|
||||||
|
kNegation, // -EXPR
|
||||||
|
kNot, // !EXPR
|
||||||
|
};
|
||||||
|
|
||||||
/// @param out the std::ostream to write to
|
/// @param out the std::ostream to write to
|
||||||
/// @param mod the UnaryOp
|
/// @param mod the UnaryOp
|
||||||
|
|
|
@ -2601,6 +2601,10 @@ bool GeneratorImpl::EmitUnaryOp(std::ostream& pre,
|
||||||
std::ostream& out,
|
std::ostream& out,
|
||||||
ast::UnaryOpExpression* expr) {
|
ast::UnaryOpExpression* expr) {
|
||||||
switch (expr->op()) {
|
switch (expr->op()) {
|
||||||
|
case ast::UnaryOp::kDereference:
|
||||||
|
case ast::UnaryOp::kAddressOf:
|
||||||
|
// TODO(crbug.com/tint/183) - support pointers
|
||||||
|
return EmitExpression(pre, out, expr->expr());
|
||||||
case ast::UnaryOp::kNot:
|
case ast::UnaryOp::kNot:
|
||||||
out << "!";
|
out << "!";
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -30,6 +30,7 @@ inline std::ostream& operator<<(std::ostream& out, UnaryOpData data) {
|
||||||
using HlslUnaryOpTest = TestParamHelper<UnaryOpData>;
|
using HlslUnaryOpTest = TestParamHelper<UnaryOpData>;
|
||||||
TEST_P(HlslUnaryOpTest, Emit) {
|
TEST_P(HlslUnaryOpTest, Emit) {
|
||||||
auto params = GetParam();
|
auto params = GetParam();
|
||||||
|
auto name = std::string(params.name);
|
||||||
|
|
||||||
Global("expr", ty.i32(), ast::StorageClass::kPrivate);
|
Global("expr", ty.i32(), ast::StorageClass::kPrivate);
|
||||||
|
|
||||||
|
@ -39,13 +40,15 @@ TEST_P(HlslUnaryOpTest, Emit) {
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
ASSERT_TRUE(gen.EmitExpression(pre, out, op)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(pre, out, op)) << gen.error();
|
||||||
EXPECT_EQ(result(), std::string(params.name) + "(expr)");
|
EXPECT_EQ(result(), name.empty() ? "expr" : name + "(expr)");
|
||||||
}
|
}
|
||||||
INSTANTIATE_TEST_SUITE_P(HlslGeneratorImplTest_UnaryOp,
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
HlslGeneratorImplTest_UnaryOp,
|
||||||
HlslUnaryOpTest,
|
HlslUnaryOpTest,
|
||||||
testing::Values(UnaryOpData{"!", ast::UnaryOp::kNot},
|
testing::Values(UnaryOpData{"", ast::UnaryOp::kAddressOf},
|
||||||
UnaryOpData{"-",
|
UnaryOpData{"", ast::UnaryOp::kDereference},
|
||||||
ast::UnaryOp::kNegation}));
|
UnaryOpData{"!", ast::UnaryOp::kNot},
|
||||||
|
UnaryOpData{"-", ast::UnaryOp::kNegation}));
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace hlsl
|
} // namespace hlsl
|
||||||
|
|
|
@ -2169,6 +2169,12 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
|
||||||
|
|
||||||
bool GeneratorImpl::EmitUnaryOp(ast::UnaryOpExpression* expr) {
|
bool GeneratorImpl::EmitUnaryOp(ast::UnaryOpExpression* expr) {
|
||||||
switch (expr->op()) {
|
switch (expr->op()) {
|
||||||
|
case ast::UnaryOp::kDereference:
|
||||||
|
out_ << "*";
|
||||||
|
break;
|
||||||
|
case ast::UnaryOp::kAddressOf:
|
||||||
|
out_ << "&";
|
||||||
|
break;
|
||||||
case ast::UnaryOp::kNot:
|
case ast::UnaryOp::kNot:
|
||||||
out_ << "!";
|
out_ << "!";
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -40,11 +40,13 @@ TEST_P(MslUnaryOpTest, Emit) {
|
||||||
ASSERT_TRUE(gen.EmitExpression(op)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(op)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), std::string(params.name) + "(expr)");
|
EXPECT_EQ(gen.result(), std::string(params.name) + "(expr)");
|
||||||
}
|
}
|
||||||
INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
MslGeneratorImplTest,
|
||||||
MslUnaryOpTest,
|
MslUnaryOpTest,
|
||||||
testing::Values(UnaryOpData{"!", ast::UnaryOp::kNot},
|
testing::Values(UnaryOpData{"&", ast::UnaryOp::kAddressOf},
|
||||||
UnaryOpData{"-",
|
UnaryOpData{"*", ast::UnaryOp::kDereference},
|
||||||
ast::UnaryOp::kNegation}));
|
UnaryOpData{"!", ast::UnaryOp::kNot},
|
||||||
|
UnaryOpData{"-", ast::UnaryOp::kNegation}));
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace msl
|
} // namespace msl
|
||||||
|
|
|
@ -706,6 +706,12 @@ bool GeneratorImpl::EmitBinary(ast::BinaryExpression* expr) {
|
||||||
|
|
||||||
bool GeneratorImpl::EmitUnaryOp(ast::UnaryOpExpression* expr) {
|
bool GeneratorImpl::EmitUnaryOp(ast::UnaryOpExpression* expr) {
|
||||||
switch (expr->op()) {
|
switch (expr->op()) {
|
||||||
|
case ast::UnaryOp::kDereference:
|
||||||
|
out_ << "*";
|
||||||
|
break;
|
||||||
|
case ast::UnaryOp::kAddressOf:
|
||||||
|
out_ << "&";
|
||||||
|
break;
|
||||||
case ast::UnaryOp::kNot:
|
case ast::UnaryOp::kNot:
|
||||||
out_ << "!";
|
out_ << "!";
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -44,11 +44,13 @@ TEST_P(WgslUnaryOpTest, Emit) {
|
||||||
ASSERT_TRUE(gen.EmitExpression(op)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(op)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), std::string(params.name) + "(expr)");
|
EXPECT_EQ(gen.result(), std::string(params.name) + "(expr)");
|
||||||
}
|
}
|
||||||
INSTANTIATE_TEST_SUITE_P(WgslGeneratorImplTest,
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
WgslGeneratorImplTest,
|
||||||
WgslUnaryOpTest,
|
WgslUnaryOpTest,
|
||||||
testing::Values(UnaryOpData{"!", ast::UnaryOp::kNot},
|
testing::Values(UnaryOpData{"&", ast::UnaryOp::kAddressOf},
|
||||||
UnaryOpData{"-",
|
UnaryOpData{"*", ast::UnaryOp::kDereference},
|
||||||
ast::UnaryOp::kNegation}));
|
UnaryOpData{"!", ast::UnaryOp::kNot},
|
||||||
|
UnaryOpData{"-", ast::UnaryOp::kNegation}));
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace wgsl
|
} // namespace wgsl
|
||||||
|
|
Loading…
Reference in New Issue