Skip to content

Commit 6af4be8

Browse files
committed
WIP Deduplicate error types
gcc/rust/ChangeLog: * ast/rust-ast.cc (AttributeParser::parse_meta_item_lit): * expand/rust-macro-builtins-helpers.cc (parse_single_string_literal): * expand/rust-macro-expand.cc (MacroExpander::match_fragment): * parse/rust-cfg-parser.cc (parse_cfg_option): * parse/rust-parse-error.h (struct SimplePath): (struct DelimTokenTree): (struct Token): (struct TokenTree): (class LifetimeParam): (struct LifetimeParam): (class Lifetime): (enum class): (struct BlockExpr): * parse/rust-parse-impl-expr.hxx: * parse/rust-parse-impl-path.hxx: * parse/rust-parse-impl-ttree.hxx: * parse/rust-parse-impl.hxx: * parse/rust-parse.h: Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
1 parent 8c2fac6 commit 6af4be8

File tree

10 files changed

+103
-168
lines changed

10 files changed

+103
-168
lines changed

gcc/rust/ast/rust-ast.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3816,7 +3816,7 @@ DelimTokenTree::to_token_stream () const
38163816
std::unique_ptr<MetaItemLitExpr>
38173817
AttributeParser::parse_meta_item_lit ()
38183818
{
3819-
std::unique_ptr<LiteralExpr> lit_expr = parser->parse_literal_expr ({});
3819+
auto lit_expr = parser->parse_literal_expr ({});
38203820

38213821
// TODO: return nullptr instead?
38223822
if (!lit_expr)
@@ -3825,7 +3825,7 @@ AttributeParser::parse_meta_item_lit ()
38253825
lexer->peek_token ()->get_locus ()));
38263826

38273827
return std::unique_ptr<MetaItemLitExpr> (
3828-
new MetaItemLitExpr (std::move (*lit_expr)));
3828+
new MetaItemLitExpr (std::move (*lit_expr.value ())));
38293829
}
38303830

38313831
bool

gcc/rust/expand/rust-macro-builtins-helpers.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ parse_single_string_literal (BuiltinMacro kind,
188188

189189
if (parser.peek_current_token ()->get_id () == STRING_LITERAL)
190190
{
191-
lit_expr = parser.parse_literal_expr ();
191+
lit_expr = parser.parse_literal_expr ().value ();
192192
parser.maybe_skip_token (COMMA);
193193
if (parser.peek_current_token ()->get_id () != last_token_id)
194194
{

gcc/rust/expand/rust-macro-expand.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ MacroExpander::match_fragment (Parser<MacroInvocLexer> &parser,
427427
break;
428428

429429
case AST::MacroFragSpec::LITERAL:
430-
parser.parse_literal_expr ();
430+
std::ignore = parser.parse_literal_expr ();
431431
break;
432432

433433
case AST::MacroFragSpec::ITEM:

gcc/rust/parse/rust-cfg-parser.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ parse_cfg_option (std::string &input, std::string &key, std::string &value)
5151
{
5252
rust_assert (parser.skip_token (EQUAL));
5353

54-
auto value_expr = parser.parse_literal_expr ();
54+
auto value_expr_res = parser.parse_literal_expr ();
5555
// We had an equal sign but no value, error out
56-
if (!value_expr)
56+
if (!value_expr_res)
5757
return false;
58+
auto value_expr = std::move (value_expr_res.value ());
5859

5960
if (value_expr->get_lit_type () != AST::Literal::LitType::STRING)
6061
return false;

gcc/rust/parse/rust-parse-error.h

Lines changed: 22 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,6 @@ struct Attribute
5555
Attribute (Kind kind) : kind (kind) {}
5656
};
5757

58-
struct SimplePath
59-
{
60-
static tl::expected<AST::SimplePath, SimplePath> make_malformed ()
61-
{
62-
return tl::unexpected<SimplePath> (SimplePath (Kind::MALFORMED));
63-
}
64-
65-
enum class Kind
66-
{
67-
MALFORMED,
68-
} kind;
69-
70-
private:
71-
SimplePath (Kind kind) : kind (kind) {}
72-
};
73-
7458
struct AttributeBody
7559
{
7660
static tl::expected<Parse::AttributeBody, AttributeBody> make_invalid_path ()
@@ -172,81 +156,6 @@ struct AttrInput
172156
AttrInput (Kind kind) : kind (kind) {}
173157
};
174158

175-
struct DelimTokenTree
176-
{
177-
static tl::expected<AST::DelimTokenTree, DelimTokenTree>
178-
make_expected_delimiter ()
179-
{
180-
return tl::unexpected<DelimTokenTree> (
181-
DelimTokenTree (Kind::EXPECTED_DELIMITER));
182-
}
183-
184-
static tl::expected<AST::DelimTokenTree, DelimTokenTree>
185-
make_invalid_token_tree ()
186-
{
187-
return tl::unexpected<DelimTokenTree> (
188-
DelimTokenTree (Kind::INVALID_TOKEN_TREE));
189-
}
190-
191-
static tl::expected<AST::DelimTokenTree, DelimTokenTree>
192-
make_mismatched_delimiters ()
193-
{
194-
return tl::unexpected<DelimTokenTree> (
195-
DelimTokenTree (Kind::INVALID_TOKEN_TREE));
196-
}
197-
198-
enum class Kind
199-
{
200-
EXPECTED_DELIMITER,
201-
INVALID_TOKEN_TREE,
202-
MISMATCHED_DELIMITERS,
203-
} kind;
204-
205-
private:
206-
DelimTokenTree (Kind kind) : kind (kind) {}
207-
};
208-
209-
struct Token
210-
{
211-
static tl::expected<std::unique_ptr<AST::Token>, Token> make_malformed ()
212-
{
213-
return tl::unexpected<Token> (Token (Kind::MALFORMED));
214-
}
215-
216-
enum class Kind
217-
{
218-
MALFORMED,
219-
} kind;
220-
221-
private:
222-
Token (Kind kind) : kind (kind) {}
223-
};
224-
225-
struct TokenTree
226-
{
227-
static tl::expected<std::unique_ptr<AST::TokenTree>, TokenTree>
228-
make_malformed ()
229-
{
230-
return tl::unexpected<TokenTree> (TokenTree (Kind::MALFORMED));
231-
}
232-
233-
static tl::expected<std::unique_ptr<AST::TokenTree>, TokenTree>
234-
make_malformed_delimited_token_tree ()
235-
{
236-
return tl::unexpected<TokenTree> (
237-
TokenTree (Kind::MALFORMED_DELIMITED_TOKEN_TREE));
238-
}
239-
240-
enum class Kind
241-
{
242-
MALFORMED,
243-
MALFORMED_DELIMITED_TOKEN_TREE,
244-
} kind;
245-
246-
private:
247-
TokenTree (Kind kind) : kind (kind) {}
248-
};
249-
250159
struct Item
251160
{
252161
static tl::expected<std::unique_ptr<AST::Item>, Item> make_end_of_file ()
@@ -319,17 +228,26 @@ struct Visibility
319228
Visibility (Kind kind) : kind (kind) {}
320229
};
321230

322-
class LifetimeParam
231+
struct LifetimeParam
323232
{
324-
};
233+
static tl::expected<AST::LifetimeParam, LifetimeParam>
234+
make_not_a_lifetime_param ()
235+
{
236+
return tl::unexpected<LifetimeParam> (
237+
LifetimeParam (Kind::NOT_A_LIFETIME_PARAM));
238+
}
325239

326-
class Lifetime
327-
{
240+
enum class Kind
241+
{
242+
NOT_A_LIFETIME_PARAM,
243+
} kind;
244+
245+
private:
246+
LifetimeParam (Kind kind) : kind (kind) {}
328247
};
329248

330-
enum class AnonConst
249+
class Lifetime
331250
{
332-
InvalidSizeExpr,
333251
};
334252

335253
struct LoopLabel
@@ -385,21 +303,14 @@ struct Self
385303
Self (Kind kind) : kind (kind) {}
386304
};
387305

388-
struct BlockExpr
306+
// Generic intermediate AST node error used when the errors need no special
307+
// handling
308+
enum class Node
389309
{
390-
static tl::expected<std::unique_ptr<AST::BlockExpr>, BlockExpr>
391-
make_malformed ()
392-
{
393-
return tl::unexpected<BlockExpr> (BlockExpr (Kind::MALFORMED));
394-
}
395-
396-
enum class Kind
397-
{
398-
MALFORMED,
399-
} kind;
400-
401-
private:
402-
BlockExpr (Kind kind) : kind (kind) {}
310+
// Unexpected or missing token whilst parsing the node
311+
MALFORMED,
312+
// Error whilst parsing a child construct for the current node
313+
CHILD_ERROR,
403314
};
404315

405316
} // namespace Error

0 commit comments

Comments
 (0)