Skip to content

Commit 7703791

Browse files
committed
fix: Parsing of alignof expressions
1 parent 8bd0392 commit 7703791

25 files changed

+189
-21
lines changed

packages/cxx-frontend/src/AST.ts

+21-2
Original file line numberDiff line numberDiff line change
@@ -1454,12 +1454,12 @@ export class TypeidOfTypeExpressionAST extends ExpressionAST {
14541454
}
14551455
}
14561456

1457-
export class AlignofExpressionAST extends ExpressionAST {
1457+
export class AlignofTypeExpressionAST extends ExpressionAST {
14581458
accept<Context, Result>(
14591459
visitor: ASTVisitor<Context, Result>,
14601460
context: Context,
14611461
): Result {
1462-
return visitor.visitAlignofExpression(this, context);
1462+
return visitor.visitAlignofTypeExpression(this, context);
14631463
}
14641464
getAlignofToken(): Token | undefined {
14651465
return Token.from(cxx.getASTSlot(this.getHandle(), 0), this.parser);
@@ -1478,6 +1478,24 @@ export class AlignofExpressionAST extends ExpressionAST {
14781478
}
14791479
}
14801480

1481+
export class AlignofExpressionAST extends ExpressionAST {
1482+
accept<Context, Result>(
1483+
visitor: ASTVisitor<Context, Result>,
1484+
context: Context,
1485+
): Result {
1486+
return visitor.visitAlignofExpression(this, context);
1487+
}
1488+
getAlignofToken(): Token | undefined {
1489+
return Token.from(cxx.getASTSlot(this.getHandle(), 0), this.parser);
1490+
}
1491+
getExpression(): ExpressionAST | undefined {
1492+
return AST.from<ExpressionAST>(
1493+
cxx.getASTSlot(this.getHandle(), 1),
1494+
this.parser,
1495+
);
1496+
}
1497+
}
1498+
14811499
export class TypeTraitsExpressionAST extends ExpressionAST {
14821500
accept<Context, Result>(
14831501
visitor: ASTVisitor<Context, Result>,
@@ -5263,6 +5281,7 @@ const AST_CONSTRUCTORS: Array<
52635281
SizeofPackExpressionAST,
52645282
TypeidExpressionAST,
52655283
TypeidOfTypeExpressionAST,
5284+
AlignofTypeExpressionAST,
52665285
AlignofExpressionAST,
52675286
TypeTraitsExpressionAST,
52685287
YieldExpressionAST,

packages/cxx-frontend/src/ASTKind.ts

+1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export enum ASTKind {
8080
SizeofPackExpression,
8181
TypeidExpression,
8282
TypeidOfTypeExpression,
83+
AlignofTypeExpression,
8384
AlignofExpression,
8485
TypeTraitsExpression,
8586
YieldExpression,

packages/cxx-frontend/src/ASTVisitor.ts

+4
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ export abstract class ASTVisitor<Context, Result> {
219219
node: ast.TypeidOfTypeExpressionAST,
220220
context: Context,
221221
): Result;
222+
abstract visitAlignofTypeExpression(
223+
node: ast.AlignofTypeExpressionAST,
224+
context: Context,
225+
): Result;
222226
abstract visitAlignofExpression(
223227
node: ast.AlignofExpressionAST,
224228
context: Context,

packages/cxx-frontend/src/RecursiveASTVisitor.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -383,11 +383,18 @@ export class RecursiveASTVisitor<Context> extends ASTVisitor<Context, void> {
383383
this.accept(node.getTypeId(), context);
384384
}
385385

386+
visitAlignofTypeExpression(
387+
node: ast.AlignofTypeExpressionAST,
388+
context: Context,
389+
): void {
390+
this.accept(node.getTypeId(), context);
391+
}
392+
386393
visitAlignofExpression(
387394
node: ast.AlignofExpressionAST,
388395
context: Context,
389396
): void {
390-
this.accept(node.getTypeId(), context);
397+
this.accept(node.getExpression(), context);
391398
}
392399

393400
visitTypeTraitsExpression(

src/frontend/cxx/ast_printer.cc

+6-1
Original file line numberDiff line numberDiff line change
@@ -632,9 +632,14 @@ void ASTPrinter::visit(TypeidOfTypeExpressionAST* ast) {
632632
accept(ast->typeId, "type-id");
633633
}
634634

635+
void ASTPrinter::visit(AlignofTypeExpressionAST* ast) {
636+
fmt::print(out_, "{}\n", "alignof-type-expression");
637+
accept(ast->typeId, "type-id");
638+
}
639+
635640
void ASTPrinter::visit(AlignofExpressionAST* ast) {
636641
fmt::print(out_, "{}\n", "alignof-expression");
637-
accept(ast->typeId, "type-id");
642+
accept(ast->expression, "expression");
638643
}
639644

640645
void ASTPrinter::visit(TypeTraitsExpressionAST* ast) {

src/frontend/cxx/ast_printer.h

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class ASTPrinter : ASTVisitor {
100100
void visit(SizeofPackExpressionAST* ast) override;
101101
void visit(TypeidExpressionAST* ast) override;
102102
void visit(TypeidOfTypeExpressionAST* ast) override;
103+
void visit(AlignofTypeExpressionAST* ast) override;
103104
void visit(AlignofExpressionAST* ast) override;
104105
void visit(TypeTraitsExpressionAST* ast) override;
105106
void visit(YieldExpressionAST* ast) override;

src/parser/cxx/ast.cc

+14-2
Original file line numberDiff line numberDiff line change
@@ -818,22 +818,34 @@ auto TypeidOfTypeExpressionAST::lastSourceLocation() -> SourceLocation {
818818
return {};
819819
}
820820

821-
auto AlignofExpressionAST::firstSourceLocation() -> SourceLocation {
821+
auto AlignofTypeExpressionAST::firstSourceLocation() -> SourceLocation {
822822
if (auto loc = cxx::firstSourceLocation(alignofLoc)) return loc;
823823
if (auto loc = cxx::firstSourceLocation(lparenLoc)) return loc;
824824
if (auto loc = cxx::firstSourceLocation(typeId)) return loc;
825825
if (auto loc = cxx::firstSourceLocation(rparenLoc)) return loc;
826826
return {};
827827
}
828828

829-
auto AlignofExpressionAST::lastSourceLocation() -> SourceLocation {
829+
auto AlignofTypeExpressionAST::lastSourceLocation() -> SourceLocation {
830830
if (auto loc = cxx::lastSourceLocation(rparenLoc)) return loc;
831831
if (auto loc = cxx::lastSourceLocation(typeId)) return loc;
832832
if (auto loc = cxx::lastSourceLocation(lparenLoc)) return loc;
833833
if (auto loc = cxx::lastSourceLocation(alignofLoc)) return loc;
834834
return {};
835835
}
836836

837+
auto AlignofExpressionAST::firstSourceLocation() -> SourceLocation {
838+
if (auto loc = cxx::firstSourceLocation(alignofLoc)) return loc;
839+
if (auto loc = cxx::firstSourceLocation(expression)) return loc;
840+
return {};
841+
}
842+
843+
auto AlignofExpressionAST::lastSourceLocation() -> SourceLocation {
844+
if (auto loc = cxx::lastSourceLocation(expression)) return loc;
845+
if (auto loc = cxx::lastSourceLocation(alignofLoc)) return loc;
846+
return {};
847+
}
848+
837849
auto TypeTraitsExpressionAST::firstSourceLocation() -> SourceLocation {
838850
if (auto loc = cxx::firstSourceLocation(typeTraitsLoc)) return loc;
839851
if (auto loc = cxx::firstSourceLocation(lparenLoc)) return loc;

src/parser/cxx/ast.fbs

+7-1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ union Expression {
154154
SizeofPackExpression,
155155
TypeidExpression,
156156
TypeidOfTypeExpression,
157+
AlignofTypeExpression,
157158
AlignofExpression,
158159
TypeTraitsExpression,
159160
YieldExpression,
@@ -973,13 +974,18 @@ table TypeidOfTypeExpression /* ExpressionAST */ {
973974
rparen_loc: SourceLocation;
974975
}
975976

976-
table AlignofExpression /* ExpressionAST */ {
977+
table AlignofTypeExpression /* ExpressionAST */ {
977978
type_id: TypeId;
978979
alignof_loc: SourceLocation;
979980
lparen_loc: SourceLocation;
980981
rparen_loc: SourceLocation;
981982
}
982983

984+
table AlignofExpression /* ExpressionAST */ {
985+
expression: Expression;
986+
alignof_loc: SourceLocation;
987+
}
988+
983989
table TypeTraitsExpression /* ExpressionAST */ {
984990
type_id_list: [TypeId];
985991
type_traits: uint32;

src/parser/cxx/ast.h

+15-2
Original file line numberDiff line numberDiff line change
@@ -1007,9 +1007,9 @@ class TypeidOfTypeExpressionAST final : public ExpressionAST {
10071007
auto lastSourceLocation() -> SourceLocation override;
10081008
};
10091009

1010-
class AlignofExpressionAST final : public ExpressionAST {
1010+
class AlignofTypeExpressionAST final : public ExpressionAST {
10111011
public:
1012-
AlignofExpressionAST() : ExpressionAST(ASTKind::AlignofExpression) {}
1012+
AlignofTypeExpressionAST() : ExpressionAST(ASTKind::AlignofTypeExpression) {}
10131013

10141014
SourceLocation alignofLoc;
10151015
SourceLocation lparenLoc;
@@ -1022,6 +1022,19 @@ class AlignofExpressionAST final : public ExpressionAST {
10221022
auto lastSourceLocation() -> SourceLocation override;
10231023
};
10241024

1025+
class AlignofExpressionAST final : public ExpressionAST {
1026+
public:
1027+
AlignofExpressionAST() : ExpressionAST(ASTKind::AlignofExpression) {}
1028+
1029+
SourceLocation alignofLoc;
1030+
ExpressionAST* expression = nullptr;
1031+
1032+
void accept(ASTVisitor* visitor) override { visitor->visit(this); }
1033+
1034+
auto firstSourceLocation() -> SourceLocation override;
1035+
auto lastSourceLocation() -> SourceLocation override;
1036+
};
1037+
10251038
class TypeTraitsExpressionAST final : public ExpressionAST {
10261039
public:
10271040
TypeTraitsExpressionAST() : ExpressionAST(ASTKind::TypeTraitsExpression) {}

src/parser/cxx/ast_cloner.cc

+17-2
Original file line numberDiff line numberDiff line change
@@ -1057,8 +1057,8 @@ void ASTCloner::visit(TypeidOfTypeExpressionAST* ast) {
10571057
copy->rparenLoc = ast->rparenLoc;
10581058
}
10591059

1060-
void ASTCloner::visit(AlignofExpressionAST* ast) {
1061-
auto copy = new (arena_) AlignofExpressionAST();
1060+
void ASTCloner::visit(AlignofTypeExpressionAST* ast) {
1061+
auto copy = new (arena_) AlignofTypeExpressionAST();
10621062
copy_ = copy;
10631063

10641064
copy->setChecked(ast->checked());
@@ -1076,6 +1076,21 @@ void ASTCloner::visit(AlignofExpressionAST* ast) {
10761076
copy->rparenLoc = ast->rparenLoc;
10771077
}
10781078

1079+
void ASTCloner::visit(AlignofExpressionAST* ast) {
1080+
auto copy = new (arena_) AlignofExpressionAST();
1081+
copy_ = copy;
1082+
1083+
copy->setChecked(ast->checked());
1084+
1085+
copy->valueCategory = ast->valueCategory;
1086+
1087+
copy->constValue = ast->constValue;
1088+
1089+
copy->alignofLoc = ast->alignofLoc;
1090+
1091+
copy->expression = accept(ast->expression);
1092+
}
1093+
10791094
void ASTCloner::visit(TypeTraitsExpressionAST* ast) {
10801095
auto copy = new (arena_) TypeTraitsExpressionAST();
10811096
copy_ = copy;

src/parser/cxx/ast_cloner.h

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class ASTCloner : public ASTVisitor {
8888
void visit(SizeofPackExpressionAST* ast) override;
8989
void visit(TypeidExpressionAST* ast) override;
9090
void visit(TypeidOfTypeExpressionAST* ast) override;
91+
void visit(AlignofTypeExpressionAST* ast) override;
9192
void visit(AlignofExpressionAST* ast) override;
9293
void visit(TypeTraitsExpressionAST* ast) override;
9394
void visit(YieldExpressionAST* ast) override;

src/parser/cxx/ast_decoder.cc

+14-1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ auto ASTDecoder::decodeExpression(const void* ptr, io::Expression type)
130130
case io::Expression_TypeidOfTypeExpression:
131131
return decodeTypeidOfTypeExpression(
132132
reinterpret_cast<const io::TypeidOfTypeExpression*>(ptr));
133+
case io::Expression_AlignofTypeExpression:
134+
return decodeAlignofTypeExpression(
135+
reinterpret_cast<const io::AlignofTypeExpression*>(ptr));
133136
case io::Expression_AlignofExpression:
134137
return decodeAlignofExpression(
135138
reinterpret_cast<const io::AlignofExpression*>(ptr));
@@ -1477,12 +1480,22 @@ auto ASTDecoder::decodeTypeidOfTypeExpression(
14771480
return ast;
14781481
}
14791482

1483+
auto ASTDecoder::decodeAlignofTypeExpression(
1484+
const io::AlignofTypeExpression* node) -> AlignofTypeExpressionAST* {
1485+
if (!node) return nullptr;
1486+
1487+
auto ast = new (pool_) AlignofTypeExpressionAST();
1488+
ast->typeId = decodeTypeId(node->type_id());
1489+
return ast;
1490+
}
1491+
14801492
auto ASTDecoder::decodeAlignofExpression(const io::AlignofExpression* node)
14811493
-> AlignofExpressionAST* {
14821494
if (!node) return nullptr;
14831495

14841496
auto ast = new (pool_) AlignofExpressionAST();
1485-
ast->typeId = decodeTypeId(node->type_id());
1497+
ast->expression =
1498+
decodeExpression(node->expression(), node->expression_type());
14861499
return ast;
14871500
}
14881501

src/parser/cxx/ast_encoder.cc

+16-2
Original file line numberDiff line numberDiff line change
@@ -1664,7 +1664,7 @@ void ASTEncoder::visit(TypeidOfTypeExpressionAST* ast) {
16641664
type_ = io::Expression_TypeidOfTypeExpression;
16651665
}
16661666

1667-
void ASTEncoder::visit(AlignofExpressionAST* ast) {
1667+
void ASTEncoder::visit(AlignofTypeExpressionAST* ast) {
16681668
auto alignofLoc = encodeSourceLocation(ast->alignofLoc);
16691669

16701670
auto lparenLoc = encodeSourceLocation(ast->lparenLoc);
@@ -1673,12 +1673,26 @@ void ASTEncoder::visit(AlignofExpressionAST* ast) {
16731673

16741674
auto rparenLoc = encodeSourceLocation(ast->rparenLoc);
16751675

1676-
io::AlignofExpression::Builder builder{fbb_};
1676+
io::AlignofTypeExpression::Builder builder{fbb_};
16771677
builder.add_alignof_loc(alignofLoc.o);
16781678
builder.add_lparen_loc(lparenLoc.o);
16791679
builder.add_type_id(typeId.o);
16801680
builder.add_rparen_loc(rparenLoc.o);
16811681

1682+
offset_ = builder.Finish().Union();
1683+
type_ = io::Expression_AlignofTypeExpression;
1684+
}
1685+
1686+
void ASTEncoder::visit(AlignofExpressionAST* ast) {
1687+
auto alignofLoc = encodeSourceLocation(ast->alignofLoc);
1688+
1689+
const auto [expression, expressionType] = acceptExpression(ast->expression);
1690+
1691+
io::AlignofExpression::Builder builder{fbb_};
1692+
builder.add_alignof_loc(alignofLoc.o);
1693+
builder.add_expression(expression);
1694+
builder.add_expression_type(static_cast<io::Expression>(expressionType));
1695+
16821696
offset_ = builder.Finish().Union();
16831697
type_ = io::Expression_AlignofExpression;
16841698
}

src/parser/cxx/ast_fwd.h

+1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class SizeofTypeExpressionAST;
133133
class SizeofPackExpressionAST;
134134
class TypeidExpressionAST;
135135
class TypeidOfTypeExpressionAST;
136+
class AlignofTypeExpressionAST;
136137
class AlignofExpressionAST;
137138
class TypeTraitsExpressionAST;
138139
class YieldExpressionAST;

src/parser/cxx/ast_kind.h

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ enum struct ASTKind {
8585
SizeofPackExpression,
8686
TypeidExpression,
8787
TypeidOfTypeExpression,
88+
AlignofTypeExpression,
8889
AlignofExpression,
8990
TypeTraitsExpression,
9091
YieldExpression,

src/parser/cxx/ast_slot.cc

+16-1
Original file line numberDiff line numberDiff line change
@@ -1181,7 +1181,7 @@ void ASTSlot::visit(TypeidOfTypeExpressionAST* ast) {
11811181
slotCount_ = 4;
11821182
}
11831183

1184-
void ASTSlot::visit(AlignofExpressionAST* ast) {
1184+
void ASTSlot::visit(AlignofTypeExpressionAST* ast) {
11851185
switch (slot_) {
11861186
case 0: // alignofLoc
11871187
value_ = ast->alignofLoc.index();
@@ -1204,6 +1204,21 @@ void ASTSlot::visit(AlignofExpressionAST* ast) {
12041204
slotCount_ = 4;
12051205
}
12061206

1207+
void ASTSlot::visit(AlignofExpressionAST* ast) {
1208+
switch (slot_) {
1209+
case 0: // alignofLoc
1210+
value_ = ast->alignofLoc.index();
1211+
slotKind_ = ASTSlotKind::kToken;
1212+
break;
1213+
case 1: // expression
1214+
value_ = reinterpret_cast<std::intptr_t>(ast->expression);
1215+
slotKind_ = ASTSlotKind::kNode;
1216+
break;
1217+
} // switch
1218+
1219+
slotCount_ = 2;
1220+
}
1221+
12071222
void ASTSlot::visit(TypeTraitsExpressionAST* ast) {
12081223
switch (slot_) {
12091224
case 0: // typeTraitsLoc

src/parser/cxx/ast_slot.h

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class ASTSlot final : ASTVisitor {
103103
void visit(SizeofPackExpressionAST* ast) override;
104104
void visit(TypeidExpressionAST* ast) override;
105105
void visit(TypeidOfTypeExpressionAST* ast) override;
106+
void visit(AlignofTypeExpressionAST* ast) override;
106107
void visit(AlignofExpressionAST* ast) override;
107108
void visit(TypeTraitsExpressionAST* ast) override;
108109
void visit(YieldExpressionAST* ast) override;

src/parser/cxx/ast_visitor.h

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class ASTVisitor {
8989
virtual void visit(SizeofPackExpressionAST* ast) = 0;
9090
virtual void visit(TypeidExpressionAST* ast) = 0;
9191
virtual void visit(TypeidOfTypeExpressionAST* ast) = 0;
92+
virtual void visit(AlignofTypeExpressionAST* ast) = 0;
9293
virtual void visit(AlignofExpressionAST* ast) = 0;
9394
virtual void visit(TypeTraitsExpressionAST* ast) = 0;
9495
virtual void visit(YieldExpressionAST* ast) = 0;

src/parser/cxx/default_ast_visitor.cc

+4
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@ void DefaultASTVisitor::visit(TypeidOfTypeExpressionAST* ast) {
253253
cxx_runtime_error("visit(TypeidOfTypeExpressionAST): not implemented");
254254
}
255255

256+
void DefaultASTVisitor::visit(AlignofTypeExpressionAST* ast) {
257+
cxx_runtime_error("visit(AlignofTypeExpressionAST): not implemented");
258+
}
259+
256260
void DefaultASTVisitor::visit(AlignofExpressionAST* ast) {
257261
cxx_runtime_error("visit(AlignofExpressionAST): not implemented");
258262
}

0 commit comments

Comments
 (0)