Skip to content
Open
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
3 changes: 2 additions & 1 deletion gcc/rust/ast/rust-ast-builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,8 @@ Builder::function_param (std::unique_ptr<Pattern> &&pattern,
FunctionQualifiers
Builder::fn_qualifiers () const
{
return FunctionQualifiers (loc, Async::No, Const::No, Unsafety::Normal);
return FunctionQualifiers (loc, Default::No, Async::No, Const::No,
Unsafety::Normal);
}

std::unique_ptr<Function>
Expand Down
4 changes: 2 additions & 2 deletions gcc/rust/ast/rust-ast-builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,8 @@ class Builder
std::unique_ptr<Type> return_type, std::unique_ptr<BlockExpr> block,
std::vector<std::unique_ptr<GenericParam>> generic_params = {},
FunctionQualifiers qualifiers
= FunctionQualifiers (UNKNOWN_LOCATION, Async::No, Const::No,
Unsafety::Normal),
= FunctionQualifiers (UNKNOWN_LOCATION, Default::No, Async::No,
Const::No, Unsafety::Normal),
WhereClause where_clause = WhereClause::create_empty (),
Visibility visibility = Visibility::create_private ()) const;

Expand Down
2 changes: 0 additions & 2 deletions gcc/rust/ast/rust-ast.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1107,7 +1107,6 @@ Function::Function (Function const &other)
: VisItem (other), ExternalItem (other.get_node_id ()),
qualifiers (other.qualifiers), function_name (other.function_name),
where_clause (other.where_clause), locus (other.locus),
has_default (other.has_default),
is_external_function (other.is_external_function)
{
// guard to prevent null dereference (always required)
Expand Down Expand Up @@ -1139,7 +1138,6 @@ Function::operator= (Function const &other)
// visibility = other.visibility->clone_visibility();
// outer_attrs = other.outer_attrs;
locus = other.locus;
has_default = other.has_default;
is_external_function = other.is_external_function;

// guard to prevent null dereference (always required)
Expand Down
20 changes: 11 additions & 9 deletions gcc/rust/ast/rust-item.h
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ class SelfParam : public Param
// Qualifiers for function, i.e. const, unsafe, extern etc.
class FunctionQualifiers
{
Default default_status;
Async async_status;
Const const_status;
Unsafety unsafe_status;
Expand All @@ -555,12 +556,14 @@ class FunctionQualifiers
location_t locus;

public:
FunctionQualifiers (location_t locus, Async async_status, Const const_status,
FunctionQualifiers (location_t locus, Default default_status,
Async async_status, Const const_status,
Unsafety unsafe_status, bool has_extern = false,
std::string extern_abi = std::string ())
: async_status (async_status), const_status (const_status),
unsafe_status (unsafe_status), has_extern (has_extern),
extern_abi (std::move (extern_abi)), locus (locus)
: default_status (default_status), async_status (async_status),
const_status (const_status), unsafe_status (unsafe_status),
has_extern (has_extern), extern_abi (std::move (extern_abi)),
locus (locus)
{
if (!this->extern_abi.empty ())
{
Expand All @@ -571,6 +574,7 @@ class FunctionQualifiers

std::string as_string () const;

bool is_default () const { return default_status == Default::Yes; }
bool is_unsafe () const { return unsafe_status == Unsafety::Unsafe; }
bool is_extern () const { return has_extern; }
bool is_const () const { return const_status == Const::Yes; }
Expand Down Expand Up @@ -1343,7 +1347,6 @@ class Function : public VisItem, public AssociatedItem, public ExternalItem
WhereClause where_clause;
tl::optional<std::unique_ptr<BlockExpr>> function_body;
location_t locus;
bool has_default;
bool is_external_function;

public:
Expand All @@ -1368,7 +1371,7 @@ class Function : public VisItem, public AssociatedItem, public ExternalItem

bool has_body () const { return function_body.has_value (); }

bool is_default () const { return has_default; }
bool is_default () const { return qualifiers.is_default (); }

// Mega-constructor with all possible fields
Function (Identifier function_name, FunctionQualifiers qualifiers,
Expand All @@ -1377,8 +1380,7 @@ class Function : public VisItem, public AssociatedItem, public ExternalItem
std::unique_ptr<Type> return_type, WhereClause where_clause,
tl::optional<std::unique_ptr<BlockExpr>> function_body,
Visibility vis, std::vector<Attribute> outer_attrs,
location_t locus, bool has_default = false,
bool is_external_function = false)
location_t locus, bool is_external_function = false)
: VisItem (std::move (vis), std::move (outer_attrs)),
ExternalItem (Stmt::node_id), qualifiers (std::move (qualifiers)),
function_name (std::move (function_name)),
Expand All @@ -1387,7 +1389,7 @@ class Function : public VisItem, public AssociatedItem, public ExternalItem
return_type (std::move (return_type)),
where_clause (std::move (where_clause)),
function_body (std::move (function_body)), locus (locus),
has_default (has_default), is_external_function (is_external_function)
is_external_function (is_external_function)
{}

// TODO: add constructor with less fields
Expand Down
5 changes: 5 additions & 0 deletions gcc/rust/checks/errors/rust-ast-validation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ void
ASTValidation::visit (AST::Function &function)
{
const auto &qualifiers = function.get_qualifiers ();
if (qualifiers.is_default () && ctx.peek () != Kind::INHERENT_IMPL
&& ctx.peek () != Kind::TRAIT_IMPL)
rust_error_at (
function.get_locus (),
"%<default%> is only allowed on items within %<impl%> blocks");
if (qualifiers.is_async () && qualifiers.is_const ())
rust_error_at (function.get_locus (),
"functions cannot be both %<const%> and %<async%>");
Expand Down
Loading
Loading