diff options
author | Philip Herron <philip.herron@embecosm.com> | 2022-01-13 21:29:06 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2022-01-13 21:29:22 +0000 |
commit | 06c2a74f557ec98896c9f71ba666bd969c4735d2 (patch) | |
tree | 0d3cf0acf66467261c08165ec9339693374bb513 /gcc | |
parent | f51d8fd538681cd66791ac6e93d094651cde174d (diff) | |
download | gcc-06c2a74f557ec98896c9f71ba666bd969c4735d2.zip gcc-06c2a74f557ec98896c9f71ba666bd969c4735d2.tar.gz gcc-06c2a74f557ec98896c9f71ba666bd969c4735d2.tar.bz2 |
Add HIR lowering for FunctionQualifiers
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/ast/rust-item.h | 7 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-base.h | 3 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.h | 5 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower.cc | 28 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 6 |
5 files changed, 44 insertions, 5 deletions
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h index a18a8e6..ad503cf 100644 --- a/gcc/rust/ast/rust-item.h +++ b/gcc/rust/ast/rust-item.h @@ -518,6 +518,11 @@ public: } std::string as_string () const; + + AsyncConstStatus get_const_status () const { return const_status; } + bool is_unsafe () const { return has_unsafe; } + bool is_extern () const { return has_extern; } + std::string get_extern_abi () const { return extern_abi; } }; // A function parameter @@ -1587,7 +1592,7 @@ public: return function_body; } - FunctionQualifiers get_qualifiers () const { return qualifiers; } + const FunctionQualifiers &get_qualifiers () const { return qualifiers; } Identifier get_function_name () const { return function_name; } diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h index 457ca1d..047d531 100644 --- a/gcc/rust/hir/rust-ast-lower-base.h +++ b/gcc/rust/hir/rust-ast-lower-base.h @@ -278,6 +278,9 @@ protected: HIR::QualifiedPathType lower_qual_path_type (AST::QualifiedPathType &qual_path_type); + + HIR::FunctionQualifiers + lower_qualifiers (const AST::FunctionQualifiers &qualifiers); }; } // namespace HIR diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h index 60315db..af9e129 100644 --- a/gcc/rust/hir/rust-ast-lower-item.h +++ b/gcc/rust/hir/rust-ast-lower-item.h @@ -429,8 +429,8 @@ public: } HIR::WhereClause where_clause (std::move (where_clause_items)); - HIR::FunctionQualifiers qualifiers ( - HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal); + HIR::FunctionQualifiers qualifiers + = lower_qualifiers (function.get_qualifiers ()); HIR::Visibility vis = HIR::Visibility::create_public (); // need @@ -439,7 +439,6 @@ public: { generic_params = lower_generic_params (function.get_generic_params ()); } - Identifier function_name = function.get_function_name (); Location locus = function.get_locus (); diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc index d8d53eb..326412b 100644 --- a/gcc/rust/hir/rust-ast-lower.cc +++ b/gcc/rust/hir/rust-ast-lower.cc @@ -593,5 +593,33 @@ struct_field_name_exists (std::vector<HIR::StructField> &fields, return false; } +HIR::FunctionQualifiers +ASTLoweringBase::lower_qualifiers (const AST::FunctionQualifiers &qualifiers) +{ + HIR::FunctionQualifiers::AsyncConstStatus const_status; + switch (qualifiers.get_const_status ()) + { + case AST::FunctionQualifiers::AsyncConstStatus::NONE: + const_status = HIR::FunctionQualifiers::AsyncConstStatus::NONE; + break; + case AST::FunctionQualifiers::AsyncConstStatus::CONST: + const_status = HIR::FunctionQualifiers::AsyncConstStatus::CONST; + break; + case AST::FunctionQualifiers::AsyncConstStatus::ASYNC: + const_status = HIR::FunctionQualifiers::AsyncConstStatus::ASYNC; + break; + } + + Unsafety unsafety + = qualifiers.is_unsafe () ? Unsafety::Unsafe : Unsafety::Normal; + bool has_extern = qualifiers.is_extern (); + + // FIXME turn this into the Rust::ABI enum + std::string extern_abi = qualifiers.get_extern_abi (); + + return HIR::FunctionQualifiers (const_status, unsafety, has_extern, + extern_abi); +} + } // namespace HIR } // namespace Rust diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index fb45bfa..09f9d38 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -511,6 +511,10 @@ public: } std::string as_string () const; + + AsyncConstStatus get_status () const { return const_status; } + + bool is_const () const { return const_status == AsyncConstStatus::CONST; } }; // A function parameter @@ -1216,7 +1220,7 @@ public: return function_body; } - FunctionQualifiers get_qualifiers () const { return qualifiers; } + const FunctionQualifiers &get_qualifiers () const { return qualifiers; } Identifier get_function_name () const { return function_name; } |