error[E0599]: no method named `closure` found for type `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope
  --> $DIR/issue-2392.rs:36:15
   |
LL | struct Obj<F> where F: FnOnce() -> u32 {
   | -------------------------------------- method `closure` not found for this
...
LL |     o_closure.closure();
   |               ^^^^^^^ field, not a method
help: to call the function stored in `closure`, surround the field access with parentheses
   |
LL |     (o_closure.closure)();
   |     ^                 ^

error[E0599]: no method named `not_closure` found for type `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope
  --> $DIR/issue-2392.rs:38:15
   |
LL | struct Obj<F> where F: FnOnce() -> u32 {
   | -------------------------------------- method `not_closure` not found for this
...
LL |     o_closure.not_closure();
   |               ^^^^^^^^^^^-- help: remove the arguments
   |               |
   |               field, not a method

error[E0599]: no method named `closure` found for type `Obj<fn() -> u32 {func}>` in the current scope
  --> $DIR/issue-2392.rs:42:12
   |
LL | struct Obj<F> where F: FnOnce() -> u32 {
   | -------------------------------------- method `closure` not found for this
...
LL |     o_func.closure();
   |            ^^^^^^^ field, not a method
help: to call the function stored in `closure`, surround the field access with parentheses
   |
LL |     (o_func.closure)();
   |     ^              ^

error[E0599]: no method named `boxed_closure` found for type `BoxedObj` in the current scope
  --> $DIR/issue-2392.rs:45:14
   |
LL | struct BoxedObj {
   | --------------- method `boxed_closure` not found for this
...
LL |     boxed_fn.boxed_closure();
   |              ^^^^^^^^^^^^^ field, not a method
help: to call the function stored in `boxed_closure`, surround the field access with parentheses
   |
LL |     (boxed_fn.boxed_closure)();
   |     ^                      ^

error[E0599]: no method named `boxed_closure` found for type `BoxedObj` in the current scope
  --> $DIR/issue-2392.rs:48:19
   |
LL | struct BoxedObj {
   | --------------- method `boxed_closure` not found for this
...
LL |     boxed_closure.boxed_closure();
   |                   ^^^^^^^^^^^^^ field, not a method
help: to call the function stored in `boxed_closure`, surround the field access with parentheses
   |
LL |     (boxed_closure.boxed_closure)();
   |     ^                           ^

error[E0599]: no method named `closure` found for type `Obj<fn() -> u32 {func}>` in the current scope
  --> $DIR/issue-2392.rs:53:12
   |
LL | struct Obj<F> where F: FnOnce() -> u32 {
   | -------------------------------------- method `closure` not found for this
...
LL |     w.wrap.closure();
   |            ^^^^^^^ field, not a method
help: to call the function stored in `closure`, surround the field access with parentheses
   |
LL |     (w.wrap.closure)();
   |     ^              ^

error[E0599]: no method named `not_closure` found for type `Obj<fn() -> u32 {func}>` in the current scope
  --> $DIR/issue-2392.rs:55:12
   |
LL | struct Obj<F> where F: FnOnce() -> u32 {
   | -------------------------------------- method `not_closure` not found for this
...
LL |     w.wrap.not_closure();
   |            ^^^^^^^^^^^-- help: remove the arguments
   |            |
   |            field, not a method

error[E0599]: no method named `closure` found for type `Obj<std::boxed::Box<(dyn std::ops::FnOnce() -> u32 + 'static)>>` in the current scope
  --> $DIR/issue-2392.rs:58:24
   |
LL | struct Obj<F> where F: FnOnce() -> u32 {
   | -------------------------------------- method `closure` not found for this
...
LL |     check_expression().closure();
   |                        ^^^^^^^ field, not a method
help: to call the function stored in `closure`, surround the field access with parentheses
   |
LL |     (check_expression().closure)();
   |     ^                          ^

error[E0599]: no method named `f1` found for type `FuncContainer` in the current scope
  --> $DIR/issue-2392.rs:64:31
   |
LL | struct FuncContainer {
   | -------------------- method `f1` not found for this
...
LL |             (*self.container).f1(1);
   |                               ^^ field, not a method
help: to call the function stored in `f1`, surround the field access with parentheses
   |
LL |             ((*self.container).f1)(1);
   |             ^                    ^

error[E0599]: no method named `f2` found for type `FuncContainer` in the current scope
  --> $DIR/issue-2392.rs:65:31
   |
LL | struct FuncContainer {
   | -------------------- method `f2` not found for this
...
LL |             (*self.container).f2(1);
   |                               ^^ field, not a method
help: to call the function stored in `f2`, surround the field access with parentheses
   |
LL |             ((*self.container).f2)(1);
   |             ^                    ^

error[E0599]: no method named `f3` found for type `FuncContainer` in the current scope
  --> $DIR/issue-2392.rs:66:31
   |
LL | struct FuncContainer {
   | -------------------- method `f3` not found for this
...
LL |             (*self.container).f3(1);
   |                               ^^ field, not a method
help: to call the function stored in `f3`, surround the field access with parentheses
   |
LL |             ((*self.container).f3)(1);
   |             ^                    ^

error: aborting due to 11 previous errors

For more information about this error, try `rustc --explain E0599`.
