Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up`hr_lifetime_in_assoc_type` future-compatibility warnings #33685
Comments
nikomatsakis
added
B-RFC-approved
T-compiler
B-unstable
and removed
B-RFC-approved
labels
May 17, 2016
This comment has been minimized.
This comment has been minimized.
|
Let's move this to Deny by default. |
arielb1
added
I-nominated
P-high
labels
Nov 17, 2016
nikomatsakis
added a commit
to nikomatsakis/rust
that referenced
this issue
Nov 17, 2016
nikomatsakis
referenced this issue
Nov 17, 2016
Merged
make HR_LIFETIME_IN_ASSOC_TYPE deny-by-default #37843
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
rfcbot
commented
Nov 17, 2016
•
|
Team member @nikomatsakis has proposed to close this. The next step is review by the rest of the tagged teams: No concerns currently listed. Once these reviewers reach consensus, this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up! See this document for info about what commands tagged team members can give me. |
bors
added a commit
that referenced
this issue
Nov 22, 2016
brson
added
P-medium
and removed
P-high
labels
Dec 1, 2016
nikomatsakis
removed
the
I-nominated
label
Dec 1, 2016
stjepang
added a commit
to stjepang/rust
that referenced
this issue
Dec 16, 2016
This comment has been minimized.
This comment has been minimized.
What if the returned value lives in the closure's environment? I don't think |
This comment has been minimized.
This comment has been minimized.
|
@vadimcn |
This comment has been minimized.
This comment has been minimized.
|
Is this ready to be closed? |
This comment has been minimized.
This comment has been minimized.
|
@aturon it is deny-by-default now, but I have not yet opened the PR to remove the underlying problem. It is all but ready though, hopefully I will get to it today. |
sanxiyn
referenced this issue
Jan 10, 2017
Closed
rustc assertion failed when building in release mode with -g #31702
This comment has been minimized.
This comment has been minimized.
rfcbot
commented
Jan 23, 2017
|
psst @nikomatsakis, I wasn't able to add the |
This comment has been minimized.
This comment has been minimized.
rfcbot
commented
Feb 2, 2017
|
The final comment period is now complete. |
arielb1
referenced this issue
Mar 31, 2017
Closed
Regression in nametable_codegen-0.1.2, Rust 1.17 #40960
This comment has been minimized.
This comment has been minimized.
|
No more compat warnings since #38897. |
nikomatsakis commentedMay 17, 2016
•
edited
This is the summary issue for the
hr_lifetime_in_assoc_typefuture-compatibility warning and other related errors. The goal of this page is describe why this change was made and how you can fix code that is affected by it. It also provides a place to ask questions or register a complaint if you feel the change should not be made. For more information on the policy around future-compatibility warnings, see our [breaking change policy guidelines][].What is the warning for?
The warning is issued in two cases. First, if you have a where-clause where a higher-ranked lifetime appears only in the associated type. This most commonly occurs when the lifetime appears in the return type for one of the closure traits:
But could also occur in other associated type bindings:
The second situation is when you have a
fntype with a lifetime that appears only in the return type:How to fix
Note that it is perfectly fine for a higher-ranked lifetime to appear in an associated type or function return type if it also appears in the trait inputs or function arguments:
In cases where the lifetime appears only in the return type, it is also generally better to use
'static:More details and future errors
These constructs are being rejected as part of the fix for issue #32330. This is a soundness bug that concerns cases like these. In general, all higher-ranked lifetimes that are used in the value of an associated type (and in this case, the function return type is an associated type) must also appear in the trait's input types. This constraint is already enforced for impls, but enforcement was overlooked for where-clauses.
These sorts of where-clauses and types are not only ill-formed, they are useless. For example, now that #32330 is fixed, there are no types that could satisfy such a where-clause, nor are there any functions with a type like
for<'a> fn() -> &'a i32(see next section for more details).Once #32330 is fully fixed, there are some cases of code that will yield errors which will not currently receive warnings. The crux of the problem concerns lifetime parameters that only appear in the return type of a fn declaration -- these are changing to no longer be considered "higher-ranked" (or "late-bound"). This change is usually harmless, but it can trigger compilation errors of various kinds. For engineering reasons, there are some cases where it was not possible to issue warnings, though we will try to cause the error message to direct people to this issue.
Here is an example of an affected function:
Merely calling this function should work as before. But assigning it to a fn pointer variable will trigger an error, depending on the type of that variable:
Another, more subtle, error can occur when a function is stored into a variable and then invoked multiple times:
Essentially, the change is that each time you reference
foo(directly!), there is now a single lifetime assigned for its parameter'a, no matter how many times you call it. In cases likebarabove, we need to assign distinct references to each call, so we have to referencefootwice.Related bugs
Also related is #33684, which can cause these warnings to be issued more frequently than one might expect. In particular, due to #33684, the compiler fails to recognize certain equivalences around lifetime parameters. For example, this function:
probably ought to be considered equivalent to this function:
and both of them ought to be usable in a context where
for<'a> fn(&'a u32) -> &'a u32is required. But because of #33684, only the version that explicitly uses'staticis considered to satisfy the higher-ranked type.When will this warning become a hard error?
The typical process is as follows: at the beginning of each 6-week release cycle, the Rust compiler team will review the set of outstanding future compatibility warnings and nominate some of them for Final Comment Period. Toward the end of the cycle, we will review any comments and make a final determination whether to convert the warning into a hard error or remove it entirely.