Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

*Syntactically* permit visibilities on trait items & enum variants #66183

Merged
merged 1 commit into from
Nov 23, 2019

Conversation

Centril
Copy link
Contributor

@Centril Centril commented Nov 7, 2019

Fixes #65041

Suppose we have $vis trait_item or $vis enum_variant and $vis is a :vis macro fragment. Before this PR, this would fail to parse. This is now instead allowed as per language team consensus in #65041 (comment). (See added tests for elaboration.)

Moreover, we now also permit visibility modifiers on trait items & enum variants syntactically but reject them with semantic checks (in ast_validation):

#[cfg(FALSE)]
trait Foo { pub fn bar(); } // OK

#[cfg(FALSE)]
enum E { pub U } // OK

@Centril Centril added T-lang Relevant to the language team, which will review and decide on the PR/issue. relnotes Marks issues that should be documented in the release notes of the next release. labels Nov 7, 2019
@Centril Centril added this to the 1.40 milestone Nov 7, 2019
@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Nov 7, 2019
@bors

This comment has been minimized.

@Centril Centril force-pushed the empty-vis-trait-decl branch from eff6bbe to 24ccd5b Compare November 7, 2019 12:48
@Centril Centril modified the milestones: 1.40, 1.41 Nov 7, 2019
src/libsyntax/parse/parser.rs Outdated Show resolved Hide resolved
@petrochenkov petrochenkov self-assigned this Nov 7, 2019
| ^^^ unexpected token
| -^^^^^^ expected one of 7 possible tokens here
| |
| help: `}` may belong here
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is... unfortunate.

@estebank
Copy link
Contributor

estebank commented Nov 7, 2019

LGTM, but saw that @petrochenkov self-assigned, letting him sign off on it.

@petrochenkov
Copy link
Contributor

So, I agree with the (direction of) the change for trait items, because that's a part of the syntactic unification of free/trait/impl/foreign items.
The parser should accept any visibilities on them (inherited or not), and then AST validation will produce semantic errors if necessary. (If that requires AST changes that you don't want to do in this PR, then it can be reported in the parser for now.)

I don't agree with accepting empty vis on variants, or at least don't feel confident about it.
Even in the token-based model vis is rather a delimited group with an empty token stream inside it rather than an empty token stream literally and I'm not sure we should accept it unless we accept visibilities on variants in general (syntactically).
We can certainly parse visibilities on variants for recovery though (while always producing an error).

@petrochenkov petrochenkov added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Nov 7, 2019
@bors

This comment has been minimized.

@Centril Centril force-pushed the empty-vis-trait-decl branch from 21e6c21 to a428ba2 Compare November 8, 2019 23:56
@Centril Centril closed this Nov 9, 2019
@Centril Centril reopened this Nov 9, 2019
@Centril Centril added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Nov 9, 2019
@Centril Centril changed the title parser: allow empty :vis before trait item & enum variant *Syntactically* permit visibilities on trait items & enum variants Nov 9, 2019
@Centril
Copy link
Contributor Author

Centril commented Nov 9, 2019

@petrochenkov Adjusted the PR to syntactically accept any visibility on enum variants & trait items now (discussion in https://rust-lang.zulipchat.com/#narrow/stream/213817-t-lang/topic/.2366183 -- cc @rust-lang/lang again in case anyone missed it)

@rust-highfive

This comment has been minimized.

@petrochenkov
Copy link
Contributor

LGTM, but needs commit squashing and a pprust test update.

@petrochenkov
Copy link
Contributor

Let's pass this through an FCP, I'm not sure the enum variant change has enough motivation and thus don't want to take responsibility for it.

@petrochenkov petrochenkov added needs-fcp This change is insta-stable, so needs a completed FCP to proceed. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Nov 9, 2019
@rust-highfive
Copy link
Collaborator

Your PR failed (pretty log, raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
2019-11-22T18:21:18.3594442Z do so (now or later) by using -b with the checkout command again. Example:
2019-11-22T18:21:18.3594598Z 
2019-11-22T18:21:18.3594826Z   git checkout -b <new-branch-name>
2019-11-22T18:21:18.3595006Z 
2019-11-22T18:21:18.3595369Z HEAD is now at 0eedbab12 Auto merge of #66183 - Centril:empty-vis-trait-decl, r=petrochenkov
2019-11-22T18:21:18.3989593Z ##[section]Starting: Decide whether to run this job
2019-11-22T18:21:18.4106310Z ==============================================================================
2019-11-22T18:21:18.4106410Z Task         : Bash
2019-11-22T18:21:18.4106508Z Description  : Run a Bash script on macOS, Linux, or Windows
---
2019-11-22T18:21:19.6589892Z 
2019-11-22T18:21:19.6590195Z 
2019-11-22T18:21:19.6590707Z 
2019-11-22T18:21:19.6590978Z 
2019-11-22T18:21:19.6591461Z #[cfg(FALSE)]
2019-11-22T18:21:19.6591771Z #[cfg(FALSE)]
2019-11-22T18:21:19.6598487Z *Syntactically* permit visibilities on trait items & enum variants
2019-11-22T18:21:19.6605533Z AGENT_DISABLELOGPLUGIN_TESTFILEPUBLISHERPLUGIN=true
2019-11-22T18:21:19.6605669Z AGENT_DISABLELOGPLUGIN_TESTRESULTLOGPLUGIN=true
2019-11-22T18:21:19.6605748Z AGENT_HOMEDIRECTORY=C:\agents\2.160.1
2019-11-22T18:21:19.6605839Z AGENT_ID=523
---
2019-11-22T18:21:19.6611607Z BUILD_SOURCEBRANCHNAME=auto
2019-11-22T18:21:19.6611677Z BUILD_SOURCESDIRECTORY=D:\a\1\s
2019-11-22T18:21:19.6611775Z BUILD_SOURCEVERSION=0eedbab12a768ade8b707af6cfbe88d02456f27d
2019-11-22T18:21:19.6611852Z BUILD_SOURCEVERSIONAUTHOR=bors
2019-11-22T18:21:19.6611963Z BUILD_SOURCEVERSIONMESSAGE=Auto merge of #66183 - Centril:empty-vis-trait-decl, r=petrochenkov
2019-11-22T18:21:19.6612135Z CI_JOB_NAME=x86_64-msvc-1
2019-11-22T18:21:19.6612204Z COBERTURA_HOME=C:\cobertura-2.1.1
2019-11-22T18:21:19.6612303Z COMMONPROGRAMFILES=C:\Program Files\Common Files
2019-11-22T18:21:19.6612402Z COMMON_TESTRESULTSDIRECTORY=D:\a\1\TestResults
---
2019-11-22T18:21:19.6617282Z MSDEPLOY_HTTP_USER_AGENT=VSTS_d439fc94-e01f-4249-b63e-d8392bc0247c_build_10_0
2019-11-22T18:21:19.6617368Z MSMPI_BIN=C:\Program Files\Microsoft MPI\Bin\
2019-11-22T18:21:19.6617454Z MSYSTEM=MINGW64
2019-11-22T18:21:19.6617548Z MonAgentClientLocation=C:\Packages\Plugins\Microsoft.Azure.Geneva.GenevaMonitoring\2.12.0.1\Monitoring\Agent
2019-11-22T18:21:19.6617701Z Moreover, we now also permit visibility modifiers on trait items & enum variants *syntactically* but reject them with semantic checks (in `ast_validation`):
2019-11-22T18:21:19.6618119Z NO_LLVM_ASSERTIONS=1
2019-11-22T18:21:19.6618208Z NPM_CONFIG_CACHE=C:\npm\cache
2019-11-22T18:21:19.6618275Z NPM_CONFIG_PREFIX=C:\npm\prefix
2019-11-22T18:21:19.6618361Z NUMBER_OF_PROCESSORS=2
---
2019-11-22T18:21:19.6627314Z SYSTEM_TEAMPROJECTID=e71b0ddf-dd27-435a-873c-e30f86eea377
2019-11-22T18:21:19.6627395Z SYSTEM_TIMELINEID=34549683-05e3-4960-b79f-690564712d94
2019-11-22T18:21:19.6627483Z SYSTEM_TOTALJOBSINPHASE=16
2019-11-22T18:21:19.6627562Z SYSTEM_WORKFOLDER=D:\a
2019-11-22T18:21:19.6627719Z Suppose we have `$vis trait_item` or `$vis enum_variant` and `$vis` is a `:vis` macro fragment. Before this PR, this would fail to parse. This is now instead allowed as per language team consensus in https://github.com/rust-lang/rust/issues/65041#issuecomment-538105286. (See added tests for elaboration.)
2019-11-22T18:21:19.6627969Z TEMP=/tmp
2019-11-22T18:21:19.6628028Z TERM=cygwin
2019-11-22T18:21:19.6628101Z TF_BUILD=True
2019-11-22T18:21:19.6628158Z TMP=/tmp
---
2019-11-22T18:21:19.6629534Z _=/usr/bin/printenv
2019-11-22T18:21:19.6629593Z ```
2019-11-22T18:21:19.6629661Z ```rust
2019-11-22T18:21:19.6629715Z agent.jobstatus=Succeeded
2019-11-22T18:21:19.6629817Z enum E { pub U } // OK
2019-11-22T18:21:19.6629886Z trait Foo { pub fn bar(); } // OK
2019-11-22T18:21:19.6630003Z disk usage:
2019-11-22T18:21:19.7268712Z Filesystem            Size  Used Avail Use% Mounted on
2019-11-22T18:21:19.7274620Z C:/Program Files/Git  256G  141G  116G  55% /
2019-11-22T18:21:19.7275810Z D:                     14G  2.0G   13G  15% /d
---
2019-11-22T18:21:31.9379460Z  29  480M   29  139M    0     0  20.8M      0  0:00:22  0:00:06  0:00:16 21.7M
2019-11-22T18:21:33.2914590Z  34  480M   34  164M    0     0  21.3M      0  0:00:22  0:00:07  0:00:15 22.0M
2019-11-22T18:21:33.3637205Z  38  480M   38  186M    0     0  20.5M      0  0:00:23  0:00:09  0:00:14 20.3M
2019-11-22T18:21:33.3649227Z  39  480M   39  188M    0     0  20.6M      0  0:00:23  0:00:09  0:00:14 19.2M
2019-11-22T18:21:33.3649600Z curl: (56) OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
2019-11-22T18:21:33.3670392Z 
2019-11-22T18:21:33.3679353Z gzip: stdin: unexpected end of file
2019-11-22T18:21:33.3679579Z tar: Unexpected EOF in archive
2019-11-22T18:21:33.3679662Z tar: Unexpected EOF in archive
2019-11-22T18:21:33.3679772Z tar: Error is not recoverable: exiting now
2019-11-22T18:21:33.3758739Z 
2019-11-22T18:21:33.3837962Z ##[error]Bash exited with code '2'.
2019-11-22T18:21:33.4040992Z ##[section]Starting: Checkout
2019-11-22T18:21:33.4144165Z ==============================================================================
2019-11-22T18:21:33.4144281Z Task         : Get sources
2019-11-22T18:21:33.4144370Z Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@bors
Copy link
Contributor

bors commented Nov 22, 2019

💔 Test failed - checks-azure

@bors bors added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Nov 22, 2019
@petrochenkov
Copy link
Contributor

@bors retry

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Nov 22, 2019
Centril added a commit to Centril/rust that referenced this pull request Nov 22, 2019
…rochenkov

*Syntactically* permit visibilities on trait items & enum variants

Fixes rust-lang#65041

Suppose we have `$vis trait_item` or `$vis enum_variant` and `$vis` is a `:vis` macro fragment. Before this PR, this would fail to parse. This is now instead allowed as per language team consensus in rust-lang#65041 (comment). (See added tests for elaboration.)

Moreover, we now also permit visibility modifiers on trait items & enum variants *syntactically* but reject them with semantic checks (in `ast_validation`):

```rust
#[cfg(FALSE)]
trait Foo { pub fn bar(); } // OK

#[cfg(FALSE)]
enum E { pub U } // OK
```
@bors
Copy link
Contributor

bors commented Nov 22, 2019

⌛ Testing commit 9a88364 with merge 6e59650f84e783a1753508623e68e81f58175a85...

@Centril
Copy link
Contributor Author

Centril commented Nov 22, 2019

@bors retry in r0llup

bors added a commit that referenced this pull request Nov 22, 2019
Rollup of 8 pull requests

Successful merges:

 - #66183 (*Syntactically* permit visibilities on trait items & enum variants)
 - #66566 (Document pitfall with `impl PartialEq<B> for A`)
 - #66575 (Remove pretty printing of specific nodes in AST)
 - #66587 (Handle statics in MIR as const pointers)
 - #66619 (follow the convention in this file to use third-person singular verbs)
 - #66633 (Error code's long explanation cleanup)
 - #66637 (fix reoccuring typo: dereferencable -> dereferenceable)
 - #66639 (resolve: more declarative `fresh_binding`)

Failed merges:

r? @ghost
@bors
Copy link
Contributor

bors commented Nov 23, 2019

⌛ Testing commit 9a88364 with merge a449535...

@bors bors merged commit 9a88364 into rust-lang:master Nov 23, 2019
@Centril Centril deleted the empty-vis-trait-decl branch November 23, 2019 01:14
@rfcbot rfcbot added finished-final-comment-period The final comment period is finished for this PR / Issue. and removed final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. labels Dec 1, 2019
@XAMPPRocky
Copy link
Member

@Centril What specifically about this should be mentioned in the release notes? For practical purposes nothing has really changed on the user facing side as far as I can tell, since they will get an error no matter what.

@Centril
Copy link
Contributor Author

Centril commented Jan 6, 2020

@XAMPPRocky Most of the time nothing has changed for users. However, in niche circumstances, e.g. with a procedural macro, you can do e.g.:

#[my_funky_attr]
enum Foo { pub Bar }

// ...expands to the following because `my_funky_attr` is funky:

struct Bar;
enum Foo { Bar(Bar) }

The same logic applies to trait items.

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Feb 17, 2020
Version 1.41.0 (2020-01-30)
===========================

Language
--------

- [You can now pass type parameters to foreign items when implementing
  traits.][65879] E.g. You can now write `impl<T> From<Foo> for Vec<T> {}`.
- [You can now arbitrarily nest receiver types in the `self` position.][64325] E.g. you can
  now write `fn foo(self: Box<Box<Self>>) {}`. Previously only `Self`, `&Self`,
  `&mut Self`, `Arc<Self>`, `Rc<Self>`, and `Box<Self>` were allowed.
- [You can now use any valid identifier in a `format_args` macro.][66847]
  Previously identifiers starting with an underscore were not allowed.
- [Visibility modifiers (e.g. `pub`) are now syntactically allowed on trait items and
  enum variants.][66183] These are still rejected semantically, but
  can be seen and parsed by procedural macros and conditional compilation.

Compiler
--------

- [Rustc will now warn if you have unused loop `'label`s.][66325]
- [Removed support for the `i686-unknown-dragonfly` target.][67255]
- [Added tier 3 support\* for the `riscv64gc-unknown-linux-gnu` target.][66661]
- [You can now pass an arguments file passing the `@path` syntax
  to rustc.][66172] Note that the format differs somewhat from what is
  found in other tooling; please see [the documentation][argfile-docs] for
  more information.
- [You can now provide `--extern` flag without a path, indicating that it is
  available from the search path or specified with an `-L` flag.][64882]

\* Refer to Rust's [platform support page][forge-platform-support] for more
information on Rust's tiered platform support.

[argfile-docs]: https://doc.rust-lang.org/nightly/rustc/command-line-arguments.html#path-load-command-line-flags-from-a-path

Libraries
---------

- [The `core::panic` module is now stable.][66771] It was already stable
  through `std`.
- [`NonZero*` numerics now implement `From<NonZero*>` if it's a smaller integer
  width.][66277] E.g. `NonZeroU16` now implements `From<NonZeroU8>`.
- [`MaybeUninit<T>` now implements `fmt::Debug`.][65013]

Stabilized APIs
---------------

- [`Result::map_or`]
- [`Result::map_or_else`]
- [`std::rc::Weak::weak_count`]
- [`std::rc::Weak::strong_count`]
- [`std::sync::Weak::weak_count`]
- [`std::sync::Weak::strong_count`]

Cargo
-----

- [Cargo will now document all the private items for binary crates
  by default.][cargo/7593]
- [`cargo-install` will now reinstall the package if it detects that it is out
  of date.][cargo/7560]
- [Cargo.lock now uses a more git friendly format that should help to reduce
  merge conflicts.][cargo/7579]
- [You can now override specific dependencies's build settings][cargo/7591] E.g.
  `[profile.dev.overrides.image] opt-level = 2` sets the `image` crate's
  optimisation level to `2` for debug builds. You can also use
  `[profile.<profile>.build_overrides]` to override build scripts and
  their dependencies.

Misc
----

- [You can now specify `edition` in documentation code blocks to compile the block
  for that edition.][66238] E.g. `edition2018` tells rustdoc that the code sample
  should be compiled the 2018 edition of Rust.
- [You can now provide custom themes to rustdoc with `--theme`, and check the
  current theme with `--check-theme`.][54733]
- [You can use `#[cfg(doc)]` to compile an item when building documentation.][61351]

Compatibility Notes
-------------------

- [As previously announced 1.41.0 will be the last tier 1 release for 32-bit
  Apple targets.][apple-32bit-drop] This means that the source code is still
  available to build, but the targets are no longer being tested and release
  binaries for those platforms will no longer be distributed by the Rust project.
  Please refer to the linked blog post for more information.

[54733]: rust-lang/rust#54733
[61351]: rust-lang/rust#61351
[67255]: rust-lang/rust#67255
[66661]: rust-lang/rust#66661
[66771]: rust-lang/rust#66771
[66847]: rust-lang/rust#66847
[66238]: rust-lang/rust#66238
[66277]: rust-lang/rust#66277
[66325]: rust-lang/rust#66325
[66172]: rust-lang/rust#66172
[66183]: rust-lang/rust#66183
[65879]: rust-lang/rust#65879
[65013]: rust-lang/rust#65013
[64882]: rust-lang/rust#64882
[64325]: rust-lang/rust#64325
[cargo/7560]: rust-lang/cargo#7560
[cargo/7579]: rust-lang/cargo#7579
[cargo/7591]: rust-lang/cargo#7591
[cargo/7593]: rust-lang/cargo#7593
[`Result::map_or_else`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or_else
[`Result::map_or`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or
[`std::rc::Weak::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.weak_count
[`std::rc::Weak::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.strong_count
[`std::sync::Weak::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.weak_count
[`std::sync::Weak::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.strong_count
[apple-32bit-drop]: https://blog.rust-lang.org/2020/01/03/reducing-support-for-32-bit-apple-targets.html
@dtolnay
Copy link
Member

dtolnay commented Aug 15, 2020

Concrete use case: DSL for a Java-style enum (https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).

Java:

public enum Planet {
    MERCURY (3.301e+23, 2.440e+6),
    VENUS   (4.868e+24, 6.052e+6),
    EARTH   (5.972e+24, 6.371e+6),
    MARS    (6.417e+23, 3.390e+6),
    JUPITER (1.898e+27, 6.991e+7),
    SATURN  (5.683e+26, 5.823e+7),
    URANUS  (8.681e+25, 2.536e+7),
    NEPTUNE (1.024e+26, 2.462e+7);

    private final double mass;
    private final double radius;

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    // additional methods
}

Rust:

#[aux_enum_data]
pub enum Planet {
    Mercury = (3.301e+23, 2.440e+6),
    Venus   = (4.868e+24, 6.052e+6),
    Earth   = (5.972e+24, 6.371e+6),
    Mars    = (6.417e+23, 3.390e+6),
    Jupiter = (1.898e+27, 6.991e+7),
    Saturn  = (5.683e+26, 5.823e+7),
    Uranus  = (8.681e+25, 2.536e+7),
    Neptune = (1.024e+26, 2.462e+7),

    pub PlanetFacts {
        pub mass: f64,
        pub radius: f64,
    }
}

Expands to:

#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub enum Planet {
    Mercury,
    Venus,
    Earth,
    Mars,
    Jupiter,
    Saturn,
    Uranus,
    Neptune,
}

pub struct PlanetFacts {
    pub mass: f64,
    pub radius: f64,
}

impl std::ops::Deref for Planet {
    type Target = PlanetFacts;

    fn deref(&self) -> &Self::Target {
        match self {
            Planet::Mercury => &PlanetFacts { mass: 3.301e+23, radius: 2.440e+6 },
            Planet::Venus   => &PlanetFacts { mass: 4.868e+24, radius: 6.052e+6 },
            Planet::Earth   => &PlanetFacts { mass: 5.972e+24, radius: 6.371e+6 },
            Planet::Mars    => &PlanetFacts { mass: 6.417e+23, radius: 3.390e+6 },
            Planet::Jupiter => &PlanetFacts { mass: 1.898e+27, radius: 6.991e+7 },
            Planet::Saturn  => &PlanetFacts { mass: 5.683e+26, radius: 5.823e+7 },
            Planet::Uranus  => &PlanetFacts { mass: 8.681e+25, radius: 2.536e+7 },
            Planet::Neptune => &PlanetFacts { mass: 1.024e+26, radius: 2.462e+7 },
        }
    }
}
println!("1 earth mass = {} kg", Earth.mass);

tmandry added a commit to tmandry/rust that referenced this pull request Sep 10, 2020
Syntactically permit unsafety on mods

Similar to rust-lang#66183; we will accept these constructs syntactically but reject with a semantic check after macro expansion if a proc macro hasn't replaced it with something else meaningful to Rust.

```rust
#[mymacro]
unsafe mod m {
    ...
}

#[mymacro]
unsafe extern "C++" {
    ...
}
```

The intention is that this might be used as a kind of "item-level unsafe" in attribute macro DSLs -- holding things which are unsafe to declare but potentially safe to use. For example I look forward to using this in https://github.com/dtolnay/cxx.

In the absence of a procedural macro rewriting them to something else, they'll continue to be rejected at compile time though with a better error message than before.

### Before:

```console
error: expected item, found keyword `unsafe`
 --> src/main.rs:1:1
  |
1 | unsafe mod m {
  | ^^^^^^ expected item
```

### After:

```console
error: module cannot be declared unsafe
 --> src/main.rs:1:1
  |
1 | unsafe mod m {
  | ^^^^^^

error: extern block cannot be declared unsafe
 --> src/main.rs:4:1
  |
4 | unsafe extern "C++" {
  | ^^^^^^
```

Closes rust-lang#68048.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. needs-fcp This change is insta-stable, so needs a completed FCP to proceed. relnotes Marks issues that should be documented in the release notes of the next release. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-lang Relevant to the language team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

an empty :vis doesn't work in trait declaration
8 participants