Skip to content

Commit a5b3869

Browse files
Merge #1103
1103: Lower AST::Visibility to HIR::Visibility properly r=CohenArthur a=CohenArthur Fixes #1093 This should cover every case since the previous code simply created public HIR visibilities. The PR refactors the HIR::Visibility struct to be tinier and a desugared version of the AST one. Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
2 parents c1a0223 + 9f5d8a8 commit a5b3869

12 files changed

+120
-121
lines changed

gcc/rust/ast/rust-item.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,8 @@ struct Visibility
632632
: public_vis_type (public_vis_type), in_path (std::move (in_path))
633633
{}
634634

635+
PublicVisType get_public_vis_type () const { return public_vis_type; }
636+
635637
// Returns whether visibility is in an error state.
636638
bool is_error () const
637639
{
@@ -684,6 +686,7 @@ struct Visibility
684686
}
685687

686688
std::string as_string () const;
689+
const SimplePath &get_path () const { return in_path; }
687690

688691
protected:
689692
// Clone function implementation - not currently virtual but may be if
@@ -881,6 +884,8 @@ class Method : public InherentImplItem, public TraitImplItem
881884

882885
FunctionQualifiers get_qualifiers () { return qualifiers; }
883886

887+
const Visibility &get_visibility () const { return vis; }
888+
884889
protected:
885890
/* Use covariance to implement clone function as returning this object
886891
* rather than base */
@@ -938,8 +943,8 @@ class VisItem : public Item
938943
std::string as_string () const override;
939944

940945
// TODO: this mutable getter seems really dodgy. Think up better way.
941-
Visibility &get_vis () { return visibility; }
942-
const Visibility &get_vis () const { return visibility; }
946+
Visibility &get_visibility () { return visibility; }
947+
const Visibility &get_visibility () const { return visibility; }
943948

944949
std::vector<Attribute> &get_outer_attrs () { return outer_attrs; }
945950
const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
@@ -1893,7 +1898,7 @@ struct StructField
18931898
return field_type;
18941899
}
18951900

1896-
Visibility get_visibility () const { return visibility; }
1901+
const Visibility &get_visibility () const { return visibility; }
18971902

18981903
NodeId get_node_id () const { return node_id; }
18991904
};
@@ -2027,6 +2032,8 @@ struct TupleField
20272032

20282033
NodeId get_node_id () const { return node_id; }
20292034

2035+
const Visibility &get_visibility () const { return visibility; }
2036+
20302037
Location get_locus () const { return locus; }
20312038

20322039
// TODO: this mutable getter seems really dodgy. Think up better way.
@@ -3918,6 +3925,8 @@ class ExternalStaticItem : public ExternalItem
39183925

39193926
Identifier get_identifier () const { return item_name; }
39203927

3928+
const Visibility &get_visibility () const { return visibility; }
3929+
39213930
bool is_mut () const { return has_mut; }
39223931

39233932
protected:
@@ -4080,6 +4089,8 @@ class ExternalFunctionItem : public ExternalItem
40804089

40814090
Location get_locus () const { return locus; }
40824091

4092+
const Visibility &get_visibility () const { return visibility; }
4093+
40834094
ExternalFunctionItem (
40844095
Identifier item_name,
40854096
std::vector<std::unique_ptr<GenericParam>> generic_params,

gcc/rust/backend/rust-compile-base.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ HIRCompileBase::setup_attributes_on_fndecl (
3737
{
3838
// if its the main fn or pub visibility mark its as DECL_PUBLIC
3939
// please see https://github.com/Rust-GCC/gccrs/pull/137
40-
bool is_pub
41-
= visibility.get_vis_type () != HIR::Visibility::PublicVisType::NONE;
40+
bool is_pub = visibility.get_vis_type () == HIR::Visibility::VisType::PUBLIC;
4241
if (is_main_entry_point || is_pub)
4342
{
4443
TREE_PUBLIC (fndecl) = 1;

gcc/rust/backend/rust-compile-implitem.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,8 @@ CompileTraitItem::visit (HIR::TraitItemFunc &func)
8484
&canonical_path);
8585
rust_assert (ok);
8686

87-
// FIXME
88-
HIR::Visibility vis (HIR::Visibility::PublicVisType::NONE,
89-
AST::SimplePath::create_empty ());
87+
// FIXME: How do we get the proper visibility here?
88+
auto vis = HIR::Visibility (HIR::Visibility::VisType::PUBLIC);
9089
HIR::TraitFunctionDecl &function = func.get_decl ();
9190
tree fndecl
9291
= compile_function (ctx, function.get_function_name (),

gcc/rust/hir/rust-ast-lower-enumitem.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#ifndef RUST_AST_LOWER_ENUMITEM
2020
#define RUST_AST_LOWER_ENUMITEM
2121

22+
#include "rust-ast-lower.h"
2223
#include "rust-diagnostics.h"
2324

2425
#include "rust-ast-lower-base.h"
@@ -51,7 +52,7 @@ class ASTLoweringEnumItem : public ASTLoweringBase
5152
if (item.has_visibility ())
5253
rust_error_at (item.get_locus (),
5354
"visibility qualifier %qs not allowed on enum item",
54-
item.get_vis ().as_string ().c_str ());
55+
item.get_visibility ().as_string ().c_str ());
5556

5657
translated = new HIR::EnumItem (mapping, item.get_identifier (),
5758
item.get_outer_attrs (), item.get_locus ());
@@ -73,12 +74,12 @@ class ASTLoweringEnumItem : public ASTLoweringBase
7374
if (item.has_visibility ())
7475
rust_error_at (item.get_locus (),
7576
"visibility qualifier %qs not allowed on enum item",
76-
item.get_vis ().as_string ().c_str ());
77+
item.get_visibility ().as_string ().c_str ());
7778

7879
std::vector<HIR::TupleField> fields;
7980
for (auto &field : item.get_tuple_fields ())
8081
{
81-
HIR::Visibility vis = HIR::Visibility::create_public ();
82+
HIR::Visibility vis = translate_visibility (field.get_visibility ());
8283
HIR::Type *type
8384
= ASTLoweringType::translate (field.get_field_type ().get ());
8485

@@ -117,12 +118,12 @@ class ASTLoweringEnumItem : public ASTLoweringBase
117118
if (item.has_visibility ())
118119
rust_error_at (item.get_locus (),
119120
"visibility qualifier %qs not allowed on enum item",
120-
item.get_vis ().as_string ().c_str ());
121+
item.get_visibility ().as_string ().c_str ());
121122

122123
std::vector<HIR::StructField> fields;
123124
for (auto &field : item.get_struct_fields ())
124125
{
125-
HIR::Visibility vis = HIR::Visibility::create_public ();
126+
HIR::Visibility vis = translate_visibility (field.get_visibility ());
126127
HIR::Type *type
127128
= ASTLoweringType::translate (field.get_field_type ().get ());
128129

@@ -165,7 +166,7 @@ class ASTLoweringEnumItem : public ASTLoweringBase
165166
if (item.has_visibility ())
166167
rust_error_at (item.get_locus (),
167168
"visibility qualifier %qs not allowed on enum item",
168-
item.get_vis ().as_string ().c_str ());
169+
item.get_visibility ().as_string ().c_str ());
169170

170171
HIR::Expr *expr = ASTLoweringExpr::translate (item.get_expr ().get ());
171172
translated

gcc/rust/hir/rust-ast-lower-extern.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "rust-ast-lower-base.h"
2323
#include "rust-ast-lower-type.h"
24+
#include "rust-ast-lower.h"
2425

2526
namespace Rust {
2627
namespace HIR {
@@ -39,7 +40,7 @@ class ASTLoweringExternItem : public ASTLoweringBase
3940

4041
void visit (AST::ExternalStaticItem &item) override
4142
{
42-
HIR::Visibility vis = HIR::Visibility::create_public ();
43+
HIR::Visibility vis = translate_visibility (item.get_visibility ());
4344
HIR::Type *static_type
4445
= ASTLoweringType::translate (item.get_type ().get ());
4546

@@ -65,7 +66,7 @@ class ASTLoweringExternItem : public ASTLoweringBase
6566
{
6667
std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
6768
HIR::WhereClause where_clause (std::move (where_clause_items));
68-
HIR::Visibility vis = HIR::Visibility::create_public ();
69+
HIR::Visibility vis = translate_visibility (function.get_visibility ());
6970

7071
std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
7172
if (function.has_generics ())

gcc/rust/hir/rust-ast-lower-implitem.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class ASTLowerImplItem : public ASTLoweringBase
5656
{
5757
std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
5858
HIR::WhereClause where_clause (std::move (where_clause_items));
59-
HIR::Visibility vis = HIR::Visibility::create_public ();
59+
HIR::Visibility vis = translate_visibility (alias.get_visibility ());
6060

6161
std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
6262
if (alias.has_generics ())
@@ -87,7 +87,7 @@ class ASTLowerImplItem : public ASTLoweringBase
8787

8888
void visit (AST::ConstantItem &constant) override
8989
{
90-
HIR::Visibility vis = HIR::Visibility::create_public ();
90+
HIR::Visibility vis = translate_visibility (constant.get_visibility ());
9191

9292
HIR::Type *type = ASTLoweringType::translate (constant.get_type ().get ());
9393
HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ().get ());
@@ -120,7 +120,7 @@ class ASTLowerImplItem : public ASTLoweringBase
120120
HIR::WhereClause where_clause (std::move (where_clause_items));
121121
HIR::FunctionQualifiers qualifiers
122122
= lower_qualifiers (function.get_qualifiers ());
123-
HIR::Visibility vis = HIR::Visibility::create_public ();
123+
HIR::Visibility vis = translate_visibility (function.get_visibility ());
124124

125125
// need
126126
std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
@@ -204,7 +204,7 @@ class ASTLowerImplItem : public ASTLoweringBase
204204
HIR::WhereClause where_clause (std::move (where_clause_items));
205205
HIR::FunctionQualifiers qualifiers
206206
= lower_qualifiers (method.get_qualifiers ());
207-
HIR::Visibility vis = HIR::Visibility::create_public ();
207+
HIR::Visibility vis = translate_visibility (method.get_visibility ());
208208

209209
// need
210210
std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;

gcc/rust/hir/rust-ast-lower-item.h

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "rust-diagnostics.h"
2323

24+
#include "rust-ast-lower.h"
2425
#include "rust-ast-lower-base.h"
2526
#include "rust-ast-lower-enumitem.h"
2627
#include "rust-ast-lower-type.h"
@@ -59,7 +60,7 @@ class ASTLoweringItem : public ASTLoweringBase
5960
mappings->get_next_localdef_id (crate_num));
6061

6162
// should be lowered from module.get_vis()
62-
HIR::Visibility vis = HIR::Visibility::create_public ();
63+
HIR::Visibility vis = translate_visibility (module.get_visibility ());
6364

6465
auto items = std::vector<std::unique_ptr<Item>> ();
6566

@@ -99,7 +100,7 @@ class ASTLoweringItem : public ASTLoweringBase
99100
}
100101

101102
HIR::WhereClause where_clause (std::move (where_clause_items));
102-
HIR::Visibility vis = HIR::Visibility::create_public ();
103+
HIR::Visibility vis = translate_visibility (alias.get_visibility ());
103104

104105
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
105106
if (alias.has_generics ())
@@ -146,15 +147,16 @@ class ASTLoweringItem : public ASTLoweringBase
146147
}
147148

148149
HIR::WhereClause where_clause (std::move (where_clause_items));
149-
HIR::Visibility vis = HIR::Visibility::create_public ();
150+
HIR::Visibility vis = translate_visibility (struct_decl.get_visibility ());
150151

151152
std::vector<HIR::TupleField> fields;
152153
for (AST::TupleField &field : struct_decl.get_fields ())
153154
{
154155
if (field.get_field_type ()->is_marked_for_strip ())
155156
continue;
156157

157-
HIR::Visibility vis = HIR::Visibility::create_public ();
158+
// FIXME: How do we get the visibility from here?
159+
HIR::Visibility vis = translate_visibility (field.get_visibility ());
158160
HIR::Type *type
159161
= ASTLoweringType::translate (field.get_field_type ().get ());
160162

@@ -209,7 +211,8 @@ class ASTLoweringItem : public ASTLoweringBase
209211
}
210212

211213
HIR::WhereClause where_clause (std::move (where_clause_items));
212-
HIR::Visibility vis = HIR::Visibility::create_public ();
214+
215+
HIR::Visibility vis = translate_visibility (struct_decl.get_visibility ());
213216

214217
bool is_unit = struct_decl.is_unit_struct ();
215218
std::vector<HIR::StructField> fields;
@@ -218,7 +221,7 @@ class ASTLoweringItem : public ASTLoweringBase
218221
if (field.get_field_type ()->is_marked_for_strip ())
219222
continue;
220223

221-
HIR::Visibility vis = HIR::Visibility::create_public ();
224+
HIR::Visibility vis = translate_visibility (field.get_visibility ());
222225
HIR::Type *type
223226
= ASTLoweringType::translate (field.get_field_type ().get ());
224227

@@ -276,7 +279,7 @@ class ASTLoweringItem : public ASTLoweringBase
276279
}
277280

278281
HIR::WhereClause where_clause (std::move (where_clause_items));
279-
HIR::Visibility vis = HIR::Visibility::create_public ();
282+
HIR::Visibility vis = translate_visibility (enum_decl.get_visibility ());
280283

281284
// bool is_unit = enum_decl.is_zero_variant ();
282285
std::vector<std::unique_ptr<HIR::EnumItem>> items;
@@ -326,15 +329,16 @@ class ASTLoweringItem : public ASTLoweringBase
326329
std::unique_ptr<HIR::WhereClauseItem> (i));
327330
}
328331
HIR::WhereClause where_clause (std::move (where_clause_items));
329-
HIR::Visibility vis = HIR::Visibility::create_public ();
332+
HIR::Visibility vis = translate_visibility (union_decl.get_visibility ());
330333

331334
std::vector<HIR::StructField> variants;
332335
for (AST::StructField &variant : union_decl.get_variants ())
333336
{
334337
if (variant.get_field_type ()->is_marked_for_strip ())
335338
continue;
336339

337-
HIR::Visibility vis = HIR::Visibility::create_public ();
340+
// FIXME: Does visibility apply here?
341+
HIR::Visibility vis = translate_visibility (variant.get_visibility ());
338342
HIR::Type *type
339343
= ASTLoweringType::translate (variant.get_field_type ().get ());
340344

@@ -375,7 +379,7 @@ class ASTLoweringItem : public ASTLoweringBase
375379

376380
void visit (AST::StaticItem &var) override
377381
{
378-
HIR::Visibility vis = HIR::Visibility::create_public ();
382+
HIR::Visibility vis = translate_visibility (var.get_visibility ());
379383

380384
HIR::Type *type = ASTLoweringType::translate (var.get_type ().get ());
381385
HIR::Expr *expr = ASTLoweringExpr::translate (var.get_expr ().get ());
@@ -401,7 +405,7 @@ class ASTLoweringItem : public ASTLoweringBase
401405

402406
void visit (AST::ConstantItem &constant) override
403407
{
404-
HIR::Visibility vis = HIR::Visibility::create_public ();
408+
HIR::Visibility vis = translate_visibility (constant.get_visibility ());
405409

406410
HIR::Type *type = ASTLoweringType::translate (constant.get_type ().get ());
407411
HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ().get ());
@@ -441,7 +445,7 @@ class ASTLoweringItem : public ASTLoweringBase
441445
HIR::WhereClause where_clause (std::move (where_clause_items));
442446
HIR::FunctionQualifiers qualifiers
443447
= lower_qualifiers (function.get_qualifiers ());
444-
HIR::Visibility vis = HIR::Visibility::create_public ();
448+
HIR::Visibility vis = translate_visibility (function.get_visibility ());
445449

446450
// need
447451
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
@@ -530,7 +534,7 @@ class ASTLoweringItem : public ASTLoweringBase
530534
}
531535

532536
HIR::WhereClause where_clause (std::move (where_clause_items));
533-
HIR::Visibility vis = HIR::Visibility::create_public ();
537+
HIR::Visibility vis = translate_visibility (impl_block.get_visibility ());
534538

535539
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
536540
if (impl_block.has_generics ())
@@ -619,7 +623,7 @@ class ASTLoweringItem : public ASTLoweringBase
619623
}
620624
HIR::WhereClause where_clause (std::move (where_clause_items));
621625

622-
HIR::Visibility vis = HIR::Visibility::create_public ();
626+
HIR::Visibility vis = translate_visibility (trait.get_visibility ());
623627

624628
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
625629
if (trait.has_generics ())
@@ -692,7 +696,7 @@ class ASTLoweringItem : public ASTLoweringBase
692696
std::unique_ptr<HIR::WhereClauseItem> (i));
693697
}
694698
HIR::WhereClause where_clause (std::move (where_clause_items));
695-
HIR::Visibility vis = HIR::Visibility::create_public ();
699+
HIR::Visibility vis = translate_visibility (impl_block.get_visibility ());
696700

697701
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
698702
if (impl_block.has_generics ())
@@ -774,7 +778,7 @@ class ASTLoweringItem : public ASTLoweringBase
774778

775779
void visit (AST::ExternBlock &extern_block) override
776780
{
777-
HIR::Visibility vis = HIR::Visibility::create_public ();
781+
HIR::Visibility vis = translate_visibility (extern_block.get_visibility ());
778782

779783
std::vector<std::unique_ptr<HIR::ExternalItem>> extern_items;
780784
for (auto &item : extern_block.get_extern_items ())

0 commit comments

Comments
 (0)