-
Notifications
You must be signed in to change notification settings - Fork 92
Description
Note: Since this issue was created, chapter (and maybe section) numbers have changed!
[Although this is an issue for V9, Jon suggested we discuss the general principle soon. That is, how hard should we try to keep all unsafe-related text in the unsafe chapter? Are there reasonable exceptions for not doing so?]
Support for unsafe mode is optional, and 1-2 years ago, we made the decision to push almost all the unsafe-related stuff into the unsafe chapter, §22, except for bits in the grammar, which we’ve flagged as “unsafe-mode only.”
I’ve nearly completed getting the MS v9 proposal for function pointers into shape for use by TG2. However, I have a situation for which I’m looking for guidance.
The addition of support for function pointers requires unsafe support, so most of the spec for that proposal will necessarily go in §22. However, this feature also impacts type inference, as described in six subsections of §11.6.3, “Type inference.”
I see two alternate approaches:
-
Following the current approach of putting as much as possible unsafe stuff into 22, I can add text to the corresponding sections in §11.6.3.* saying “This subclause is extended in unsafe code (§forward-pointer to §22.x.y).” And then describe those extensions in the new sections §22.x.y.
-
I can put the unsafe-related stuff in-line in §11.6.3.*, and somehow mark it as being unsafe-related.
Approach 1 is pure, but has the problem that some text in §22.x.y needs to be “merged” into specific places in lists in §11.6.3.*. For example, this would result in the following:
§22.6.(x) Output type inferences [new section]
In §11.6.3.7, the following bullet is added between the second and third bullets:
- If
Eis an address-of method group andTis a function pointer type with parameter typesT1..Tkand return typeTb, and overload resolution ofEwith the typesT1..Tkyields a single method with return typeU, then a lower-bound inference is made fromUtoTb.
The reader of this new section, §22.6.x, will have to flip between this text and that in §11.6.3.7 to make sense of it. And then, we are at the mercy of this positional dependence of that list, which could easily get out of sync as §11.6.3.7 evolves.
Here’s a similar case:
§22.6.(y) Lower-bound inferences [new section]
In §11.6.3.10, the following case is added to the third bullet:
Vis a function pointer typedelegate*<V2..Vk, V1>and there is a function pointer typedelegate*<U2..Uk, U1>such thatUis identical todelegate*<U2..Uk, U1>, and the calling convention ofVis identical toU, and the refness ofViis identical toUi.
The first bullet of inference from
UitoViis modified to:
- If
Uis not a function pointer type andUiis not known to be a reference type, or ifUis a function pointer type andUiis not known to be a function pointer type or a reference type, then an exact inference is made
Then, added after the third bullet of inference from
UitoVi:
- Otherwise, if
Visdelegate*<V2..Vk, V1>then inference depends on the i-th parameter ofdelegate*<V2..Vk, V1>:
- If V1:
- If the return is by value, then a lower-bound inference is made.
- If the return is by reference, then an exact inference is made.
- If V2..Vk:
- If the parameter is by value, then an upper-bound inference is made.
- If the parameter is by reference, then an exact inference is made.
This enhancement involves a change of existing words, not just the addition of new words, which complicates things further. That said, if we push this stuff back into §11.6.3.x., we likely can find a way to have two branches for this: with and without unsafe support.
The longer I study the problem, the more I lean towards putting this stuff in §11.6.3.* with suitable unsafe-conditional text. Putting it in §22 makes it stand out, but not positively so, and looks somewhat like the situation we had previously with the grammar in earlier chapters being augmented by unsafe extensions in §22. And we dropped that approach and pushed the unsafe grammar back into the main spec.