Skip to content

Commit

Permalink
ast: Use StackedContexts class in ContextualASTVisitor
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* ast/rust-ast-visitor.h: Replace context with StackedContexts.
	* ast/rust-ast-visitor.cc (ContextualASTVisitor::visit): Use new APIs.
	* checks/errors/rust-ast-validation.cc (ASTValidation::visit): Likewise.
  • Loading branch information
CohenArthur committed Dec 2, 2024
1 parent 22f66de commit b036d91
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 29 deletions.
16 changes: 8 additions & 8 deletions gcc/rust/ast/rust-ast-visitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1453,33 +1453,33 @@ DefaultASTVisitor::visit (AST::VariadicParam &param)
void
ContextualASTVisitor::visit (AST::Crate &crate)
{
push_context (Context::CRATE);
ctx.enter (Kind::CRATE);
DefaultASTVisitor::visit (crate);
pop_context ();
ctx.exit ();
}

void
ContextualASTVisitor::visit (AST::InherentImpl &impl)
{
push_context (Context::INHERENT_IMPL);
ctx.enter (Kind::INHERENT_IMPL);
DefaultASTVisitor::visit (impl);
pop_context ();
ctx.exit ();
}

void
ContextualASTVisitor::visit (AST::TraitImpl &impl)
{
push_context (Context::TRAIT_IMPL);
ctx.enter (Kind::TRAIT_IMPL);
DefaultASTVisitor::visit (impl);
pop_context ();
ctx.exit ();
}

void
ContextualASTVisitor::visit (AST::Trait &trait)
{
push_context (Context::TRAIT);
ctx.enter (Kind::TRAIT);
DefaultASTVisitor::visit (trait);
pop_context ();
ctx.exit ();
}

} // namespace AST
Expand Down
10 changes: 4 additions & 6 deletions gcc/rust/ast/rust-ast-visitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "rust-item.h"
#include "rust-path.h"
#include "rust-system.h"
#include "rust-stacked-contexts.h"

namespace Rust {
namespace AST {
Expand Down Expand Up @@ -452,7 +453,7 @@ class DefaultASTVisitor : public ASTVisitor
class ContextualASTVisitor : public DefaultASTVisitor
{
protected:
enum class Context
enum class Kind
{
FUNCTION,
INHERENT_IMPL,
Expand All @@ -461,6 +462,7 @@ class ContextualASTVisitor : public DefaultASTVisitor
MODULE,
CRATE,
};

using DefaultASTVisitor::visit;

virtual void visit (AST::Crate &crate) override;
Expand All @@ -476,11 +478,7 @@ class ContextualASTVisitor : public DefaultASTVisitor
DefaultASTVisitor::visit (item);
}

std::vector<Context> context;

void push_context (Context ctx) { context.push_back (ctx); }

void pop_context () { context.pop_back (); }
StackedContexts<Kind> ctx;
};

} // namespace AST
Expand Down
20 changes: 8 additions & 12 deletions gcc/rust/checks/errors/rust-ast-validation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ ASTValidation::visit (AST::LoopLabel &label)
void
ASTValidation::visit (AST::ConstantItem &const_item)
{
if (!const_item.has_expr () && context.back () != Context::TRAIT_IMPL)
if (!const_item.has_expr () && ctx.peek () != Kind::TRAIT_IMPL)
{
rust_error_at (const_item.get_locus (),
"associated constant in %<impl%> without body");
Expand All @@ -82,23 +82,19 @@ ASTValidation::visit (AST::Function &function)
"functions cannot be both %<const%> and %<async%>");

if (qualifiers.is_const ()
&& (context.back () == Context::TRAIT_IMPL
|| context.back () == Context::TRAIT))
&& (ctx.peek () == Kind::TRAIT_IMPL || ctx.peek () == Kind::TRAIT))
rust_error_at (function.get_locus (), ErrorCode::E0379,
"functions in traits cannot be declared %<const%>");

// may change soon
if (qualifiers.is_async ()
&& (context.back () == Context::TRAIT_IMPL
|| context.back () == Context::TRAIT))
&& (ctx.peek () == Kind::TRAIT_IMPL || ctx.peek () == Kind::TRAIT))
rust_error_at (function.get_locus (), ErrorCode::E0706,
"functions in traits cannot be declared %<async%>");

// if not an associated function but has a self parameter
if (context.back () != Context::TRAIT
&& context.back () != Context::TRAIT_IMPL
&& context.back () != Context::INHERENT_IMPL
&& function.has_self_param ())
if (ctx.peek () != Kind::TRAIT && ctx.peek () != Kind::TRAIT_IMPL
&& ctx.peek () != Kind::INHERENT_IMPL && function.has_self_param ())
rust_error_at (
function.get_self_param ().get_locus (),
"%<self%> parameter is only allowed in associated functions");
Expand Down Expand Up @@ -140,11 +136,11 @@ ASTValidation::visit (AST::Function &function)
{
if (!function.has_body ())
{
if (context.back () == Context::INHERENT_IMPL
|| context.back () == Context::TRAIT_IMPL)
if (ctx.peek () == Kind::INHERENT_IMPL
|| ctx.peek () == Kind::TRAIT_IMPL)
rust_error_at (function.get_locus (),
"associated function in %<impl%> without body");
else if (context.back () != Context::TRAIT)
else if (ctx.peek () != Kind::TRAIT)
rust_error_at (function.get_locus (),
"free function without a body");
}
Expand Down
7 changes: 4 additions & 3 deletions gcc/rust/util/rust-stacked-contexts.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,11 @@ template <typename T> class StackedContexts
return last;
}

const T& peek() {
rust_assert (!stack.empty());
const T &peek ()
{
rust_assert (!stack.empty ());

return stack.back();
return stack.back ();
}

/**
Expand Down

0 comments on commit b036d91

Please sign in to comment.