Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 54 additions & 2 deletions packages/cxx-frontend/src/AST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9698,6 +9698,31 @@ export class VolatileQualifierAST extends SpecifierAST {
}
}

/**
* AtomicQualifierAST node.
*/
export class AtomicQualifierAST extends SpecifierAST {
/**
* Traverse this node using the given visitor.
* @param visitor the visitor.
* @param context the context.
* @returns the result of the visit.
*/
accept<Context, Result>(
visitor: ASTVisitor<Context, Result>,
context: Context,
): Result {
return visitor.visitAtomicQualifier(this, context);
}

/**
* Returns the location of the atomic token in this node
*/
getAtomicToken(): Token | undefined {
return Token.from(cxx.getASTSlot(this.getHandle(), 0), this.parser);
}
}

/**
* RestrictQualifierAST node.
*/
Expand Down Expand Up @@ -10728,12 +10753,38 @@ export class ArrayDeclaratorChunkAST extends DeclaratorChunkAST {
return Token.from(cxx.getASTSlot(this.getHandle(), 0), this.parser);
}

/**
* Returns the typeQualifierList of this node
*/
getTypeQualifierList(): Iterable<SpecifierAST | undefined> {
let it = cxx.getASTSlot(this.getHandle(), 0);
let value: SpecifierAST | undefined;
let done = false;
const p = this.parser;
function advance() {
done = it === 0;
if (done) return;
const ast = cxx.getListValue(it);
value = AST.from<SpecifierAST>(ast, p);
it = cxx.getListNext(it);
}
function next() {
advance();
return { done, value };
}
return {
[Symbol.iterator]() {
return { next };
},
};
}

/**
* Returns the expression of this node
*/
getExpression(): ExpressionAST | undefined {
return AST.from<ExpressionAST>(
cxx.getASTSlot(this.getHandle(), 1),
cxx.getASTSlot(this.getHandle(), 2),
this.parser,
);
}
Expand All @@ -10742,7 +10793,7 @@ export class ArrayDeclaratorChunkAST extends DeclaratorChunkAST {
* Returns the location of the rbracket token in this node
*/
getRbracketToken(): Token | undefined {
return Token.from(cxx.getASTSlot(this.getHandle(), 2), this.parser);
return Token.from(cxx.getASTSlot(this.getHandle(), 3), this.parser);
}

/**
Expand Down Expand Up @@ -13144,6 +13195,7 @@ const AST_CONSTRUCTORS: Array<
PlaceholderTypeSpecifierAST,
ConstQualifierAST,
VolatileQualifierAST,
AtomicQualifierAST,
RestrictQualifierAST,
EnumSpecifierAST,
ClassSpecifierAST,
Expand Down
1 change: 1 addition & 0 deletions packages/cxx-frontend/src/ASTKind.ts
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ export enum ASTKind {
PlaceholderTypeSpecifier,
ConstQualifier,
VolatileQualifier,
AtomicQualifier,
RestrictQualifier,
EnumSpecifier,
ClassSpecifier,
Expand Down
35 changes: 18 additions & 17 deletions packages/cxx-frontend/src/ASTSlot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,21 +234,22 @@ export enum ASTSlot {
typeId = 212,
typeIdList = 213,
typeLoc = 214,
typeSpecifier = 215,
typeSpecifierList = 216,
typeTraitLoc = 217,
typedefLoc = 218,
typeidLoc = 219,
typenameLoc = 220,
underlyingTypeLoc = 221,
unqualifiedId = 222,
usingDeclaratorList = 223,
usingLoc = 224,
vaArgLoc = 225,
virtualLoc = 226,
virtualOrAccessLoc = 227,
voidLoc = 228,
volatileLoc = 229,
whileLoc = 230,
yieldLoc = 231,
typeQualifierList = 215,
typeSpecifier = 216,
typeSpecifierList = 217,
typeTraitLoc = 218,
typedefLoc = 219,
typeidLoc = 220,
typenameLoc = 221,
underlyingTypeLoc = 222,
unqualifiedId = 223,
usingDeclaratorList = 224,
usingLoc = 225,
vaArgLoc = 226,
virtualLoc = 227,
virtualOrAccessLoc = 228,
voidLoc = 229,
volatileLoc = 230,
whileLoc = 231,
yieldLoc = 232,
}
12 changes: 12 additions & 0 deletions packages/cxx-frontend/src/ASTVisitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2077,6 +2077,18 @@ export abstract class ASTVisitor<Context, Result> {
context: Context,
): Result;

/**
* Visit AtomicQualifier node.
*
* @param node The node to visit.
* @param context The context.
* @returns The result of the visit.
*/
abstract visitAtomicQualifier(
node: ast.AtomicQualifierAST,
context: Context,
): Result;

/**
* Visit RestrictQualifier node.
*
Expand Down
11 changes: 11 additions & 0 deletions packages/cxx-frontend/src/RecursiveASTVisitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2234,6 +2234,14 @@ export class RecursiveASTVisitor<Context> extends ASTVisitor<Context, void> {
context: Context,
): void {}

/**
* Visit a AtomicQualifier node.
*
* @param node The node to visit.
* @param context The context.
*/
visitAtomicQualifier(node: ast.AtomicQualifierAST, context: Context): void {}

/**
* Visit a RestrictQualifier node.
*
Expand Down Expand Up @@ -2440,6 +2448,9 @@ export class RecursiveASTVisitor<Context> extends ASTVisitor<Context, void> {
node: ast.ArrayDeclaratorChunkAST,
context: Context,
): void {
for (const element of node.getTypeQualifierList()) {
this.accept(element, context);
}
this.accept(node.getExpression(), context);
for (const element of node.getAttributeList()) {
this.accept(element, context);
Expand Down
7 changes: 7 additions & 0 deletions src/mlir/cxx/mlir/codegen.cc
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,8 @@ struct Codegen::SpecifierVisitor {

[[nodiscard]] auto operator()(RestrictQualifierAST* ast) -> SpecifierResult;

[[nodiscard]] auto operator()(AtomicQualifierAST* ast) -> SpecifierResult;

[[nodiscard]] auto operator()(EnumSpecifierAST* ast) -> SpecifierResult;

[[nodiscard]] auto operator()(ClassSpecifierAST* ast) -> SpecifierResult;
Expand Down Expand Up @@ -2417,6 +2419,11 @@ auto Codegen::SpecifierVisitor::operator()(RestrictQualifierAST* ast)
return {};
}

auto Codegen::SpecifierVisitor::operator()(AtomicQualifierAST* ast)
-> SpecifierResult {
return {};
}

auto Codegen::SpecifierVisitor::operator()(EnumSpecifierAST* ast)
-> SpecifierResult {
for (auto node : ListView{ast->attributeList}) {
Expand Down
13 changes: 13 additions & 0 deletions src/parser/cxx/ast.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2616,6 +2616,16 @@ auto VolatileQualifierAST::lastSourceLocation() -> SourceLocation {
return {};
}

auto AtomicQualifierAST::firstSourceLocation() -> SourceLocation {
if (auto loc = cxx::firstSourceLocation(atomicLoc)) return loc;
return {};
}

auto AtomicQualifierAST::lastSourceLocation() -> SourceLocation {
if (auto loc = cxx::lastSourceLocation(atomicLoc)) return loc;
return {};
}

auto RestrictQualifierAST::firstSourceLocation() -> SourceLocation {
if (auto loc = cxx::firstSourceLocation(restrictLoc)) return loc;
return {};
Expand Down Expand Up @@ -2838,6 +2848,7 @@ auto FunctionDeclaratorChunkAST::lastSourceLocation() -> SourceLocation {

auto ArrayDeclaratorChunkAST::firstSourceLocation() -> SourceLocation {
if (auto loc = cxx::firstSourceLocation(lbracketLoc)) return loc;
if (auto loc = cxx::firstSourceLocation(typeQualifierList)) return loc;
if (auto loc = cxx::firstSourceLocation(expression)) return loc;
if (auto loc = cxx::firstSourceLocation(rbracketLoc)) return loc;
if (auto loc = cxx::firstSourceLocation(attributeList)) return loc;
Expand All @@ -2848,6 +2859,7 @@ auto ArrayDeclaratorChunkAST::lastSourceLocation() -> SourceLocation {
if (auto loc = cxx::lastSourceLocation(attributeList)) return loc;
if (auto loc = cxx::lastSourceLocation(rbracketLoc)) return loc;
if (auto loc = cxx::lastSourceLocation(expression)) return loc;
if (auto loc = cxx::lastSourceLocation(typeQualifierList)) return loc;
if (auto loc = cxx::lastSourceLocation(lbracketLoc)) return loc;
return {};
}
Expand Down Expand Up @@ -3670,6 +3682,7 @@ std::string_view kASTKindNames[] = {
"placeholder-type-specifier",
"const-qualifier",
"volatile-qualifier",
"atomic-qualifier",
"restrict-qualifier",
"enum-specifier",
"class-specifier",
Expand Down
6 changes: 6 additions & 0 deletions src/parser/cxx/ast.fbs
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ union Specifier {
PlaceholderTypeSpecifier,
ConstQualifier,
VolatileQualifier,
AtomicQualifier,
RestrictQualifier,
EnumSpecifier,
ClassSpecifier,
Expand Down Expand Up @@ -817,6 +818,7 @@ table FunctionDeclaratorChunk /* DeclaratorChunkAST */ {
}

table ArrayDeclaratorChunk /* DeclaratorChunkAST */ {
type_qualifier_list: [Specifier];
expression: Expression;
attribute_list: [AttributeSpecifier];
lbracket_loc: uint32;
Expand Down Expand Up @@ -1587,6 +1589,10 @@ table VolatileQualifier /* SpecifierAST */ {
volatile_loc: uint32;
}

table AtomicQualifier /* SpecifierAST */ {
atomic_loc: uint32;
}

table RestrictQualifier /* SpecifierAST */ {
restrict_loc: uint32;
}
Expand Down
19 changes: 19 additions & 0 deletions src/parser/cxx/ast.h
Original file line number Diff line number Diff line change
Expand Up @@ -3232,6 +3232,20 @@ class VolatileQualifierAST final : public SpecifierAST {
auto lastSourceLocation() -> SourceLocation override;
};

class AtomicQualifierAST final : public SpecifierAST {
public:
static constexpr ASTKind Kind = ASTKind::AtomicQualifier;

AtomicQualifierAST() : SpecifierAST(Kind) {}

SourceLocation atomicLoc;

void accept(ASTVisitor* visitor) override { visitor->visit(this); }

auto firstSourceLocation() -> SourceLocation override;
auto lastSourceLocation() -> SourceLocation override;
};

class RestrictQualifierAST final : public SpecifierAST {
public:
static constexpr ASTKind Kind = ASTKind::RestrictQualifier;
Expand Down Expand Up @@ -3475,6 +3489,7 @@ class ArrayDeclaratorChunkAST final : public DeclaratorChunkAST {
ArrayDeclaratorChunkAST() : DeclaratorChunkAST(Kind) {}

SourceLocation lbracketLoc;
List<SpecifierAST*>* typeQualifierList = nullptr;
ExpressionAST* expression = nullptr;
SourceLocation rbracketLoc;
List<AttributeSpecifierAST*>* attributeList = nullptr;
Expand Down Expand Up @@ -4895,6 +4910,9 @@ auto visit(Visitor&& visitor, SpecifierAST* ast) {
case VolatileQualifierAST::Kind:
return std::invoke(std::forward<Visitor>(visitor),
static_cast<VolatileQualifierAST*>(ast));
case AtomicQualifierAST::Kind:
return std::invoke(std::forward<Visitor>(visitor),
static_cast<AtomicQualifierAST*>(ast));
case RestrictQualifierAST::Kind:
return std::invoke(std::forward<Visitor>(visitor),
static_cast<RestrictQualifierAST*>(ast));
Expand Down Expand Up @@ -4952,6 +4970,7 @@ template <>
case PlaceholderTypeSpecifierAST::Kind:
case ConstQualifierAST::Kind:
case VolatileQualifierAST::Kind:
case AtomicQualifierAST::Kind:
case RestrictQualifierAST::Kind:
case EnumSpecifierAST::Kind:
case ClassSpecifierAST::Kind:
Expand Down
1 change: 1 addition & 0 deletions src/parser/cxx/ast_fwd.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ class DecltypeSpecifierAST;
class PlaceholderTypeSpecifierAST;
class ConstQualifierAST;
class VolatileQualifierAST;
class AtomicQualifierAST;
class RestrictQualifierAST;
class EnumSpecifierAST;
class ClassSpecifierAST;
Expand Down
7 changes: 7 additions & 0 deletions src/parser/cxx/ast_interpreter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,8 @@ struct ASTInterpreter::SpecifierVisitor {

[[nodiscard]] auto operator()(RestrictQualifierAST* ast) -> SpecifierResult;

[[nodiscard]] auto operator()(AtomicQualifierAST* ast) -> SpecifierResult;

[[nodiscard]] auto operator()(EnumSpecifierAST* ast) -> SpecifierResult;

[[nodiscard]] auto operator()(ClassSpecifierAST* ast) -> SpecifierResult;
Expand Down Expand Up @@ -2727,6 +2729,11 @@ auto ASTInterpreter::SpecifierVisitor::operator()(RestrictQualifierAST* ast)
return {};
}

auto ASTInterpreter::SpecifierVisitor::operator()(AtomicQualifierAST* ast)
-> SpecifierResult {
return {};
}

auto ASTInterpreter::SpecifierVisitor::operator()(EnumSpecifierAST* ast)
-> SpecifierResult {
for (auto node : ListView{ast->attributeList}) {
Expand Down
1 change: 1 addition & 0 deletions src/parser/cxx/ast_kind.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ enum class ASTKind {
PlaceholderTypeSpecifier,
ConstQualifier,
VolatileQualifier,
AtomicQualifier,
RestrictQualifier,
EnumSpecifier,
ClassSpecifier,
Expand Down
13 changes: 13 additions & 0 deletions src/parser/cxx/ast_pretty_printer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,8 @@ struct ASTPrettyPrinter::SpecifierVisitor {

void operator()(VolatileQualifierAST* ast);

void operator()(AtomicQualifierAST* ast);

void operator()(RestrictQualifierAST* ast);

void operator()(EnumSpecifierAST* ast);
Expand Down Expand Up @@ -3492,6 +3494,12 @@ void ASTPrettyPrinter::SpecifierVisitor::operator()(VolatileQualifierAST* ast) {
}
}

void ASTPrettyPrinter::SpecifierVisitor::operator()(AtomicQualifierAST* ast) {
if (ast->atomicLoc) {
accept.writeToken(ast->atomicLoc);
}
}

void ASTPrettyPrinter::SpecifierVisitor::operator()(RestrictQualifierAST* ast) {
if (ast->restrictLoc) {
accept.writeToken(ast->restrictLoc);
Expand Down Expand Up @@ -3735,6 +3743,11 @@ void ASTPrettyPrinter::DeclaratorChunkVisitor::operator()(
accept.writeToken(ast->lbracketLoc);
nospace();
}

for (auto it = ast->typeQualifierList; it; it = it->next) {
accept(it->value);
}

accept(ast->expression);
if (ast->rbracketLoc) {
nospace();
Expand Down
Loading