aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-04-26 08:45:21 +0000
committerGitHub <noreply@github.com>2022-04-26 08:45:21 +0000
commitd7c5bbe6af7189a95d1e4f2d4171fd8b53e826b3 (patch)
tree88cf4a3e201420dde427f004471c6898fea54af5 /gcc
parentb74044fb6278e373da607a8f1f5df2193ce27d65 (diff)
parente69e162462c6fb3d886460d96ce649207b7c9e3f (diff)
downloadgcc-d7c5bbe6af7189a95d1e4f2d4171fd8b53e826b3.zip
gcc-d7c5bbe6af7189a95d1e4f2d4171fd8b53e826b3.tar.gz
gcc-d7c5bbe6af7189a95d1e4f2d4171fd8b53e826b3.tar.bz2
Merge #1166
1166: Support inference of generic parameters on paths behind reference's r=philberty a=philberty We used a hack in the parser to turn simple cases such as &Foo(..) into: BorrowExpr CallExpr( IdentifierExpr + <Argument-expressions>)) The IdentifierExpr here is parsed as a PathExpression but to simplify things at the time it seemed logic to see these as identifier expressions but this is actually a Path and we need to be careful about generic arguments here. Identifiers are simply identifiers and must not be changed or coherence of inference variables will become a jumble of inference variables trying to infer one another inside purely generic code. This patch leaves the PathInExpressions as Path's instead of trying to be clever and turn them into identifiers. Fixes #1165 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/parse/rust-parse-impl.h20
-rw-r--r--gcc/testsuite/rust/compile/issue-1165.rs5
2 files changed, 5 insertions, 20 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 25979ce..6715a77 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -12591,16 +12591,6 @@ Parser<ManagedTokenSource>::null_denotation (const_TokenPtr tok,
// struct/enum expr struct
if (!restrictions.can_be_struct_expr && !not_a_block)
{
- // assume path is returned if not single segment
- if (path.is_single_segment ())
- {
- // have to return an identifier expression or something
- /* HACK: may have to become permanent, but this is my
- * current identifier expression */
- return std::unique_ptr<AST::IdentifierExpr> (
- new AST::IdentifierExpr (tok->get_str (), {},
- tok->get_locus ()));
- }
// HACK: add outer attrs to path
path.set_outer_attrs (std::move (outer_attrs));
return std::unique_ptr<AST::PathInExpression> (
@@ -12613,16 +12603,6 @@ Parser<ManagedTokenSource>::null_denotation (const_TokenPtr tok,
// struct/enum expr tuple
if (!restrictions.can_be_struct_expr)
{
- // assume path is returned if not single segment
- if (path.is_single_segment ())
- {
- // have to return an identifier expression or something, idk
- /* HACK: may have to become permanent, but this is my
- * current identifier expression */
- return std::unique_ptr<AST::IdentifierExpr> (
- new AST::IdentifierExpr (tok->get_str (), {},
- tok->get_locus ()));
- }
// HACK: add outer attrs to path
path.set_outer_attrs (std::move (outer_attrs));
return std::unique_ptr<AST::PathInExpression> (
diff --git a/gcc/testsuite/rust/compile/issue-1165.rs b/gcc/testsuite/rust/compile/issue-1165.rs
new file mode 100644
index 0000000..f588969
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-1165.rs
@@ -0,0 +1,5 @@
+struct Foo<T>(T);
+
+fn main() {
+ &Foo(123);
+}