Function pointer with a reference argument cannot derive Debug











up vote
0
down vote

favorite
1












I have a enum where I want to generalize an function pointer. As soon as I add a reference inside the function pointer definition. it fails to compile because it cannot print it with Debug:



fn div1(t: i64, b: i64) -> i64 {
t / b
}

fn div2(t: i64, b: &i64) -> i64 {
t / b
}

#[derive(Debug)]
enum Enum {
FnTest1(fn(i64, i64) -> i64),
FnTest2(fn(i64, &i64) -> i64),
}

fn main() {
println!("{:?}", Enum::FnTest1(div1));
println!("{:?}", Enum::FnTest2(div2));
}


The error I get is this



error[E0277]: `for<'r> fn(i64, &'r i64) -> i64` doesn't implement `std::fmt::Debug`
--> src/main.rs:12:13
|
12 | FnTest2(fn(i64, &i64) -> i64),
| ^^^^^^^^^^^^^^^^^^^^ `for<'r> fn(i64, &'r i64) -> i64` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
= help: the trait `std::fmt::Debug` is not implemented for `for<'r> fn(i64, &'r i64) -> i64`
= note: required because of the requirements on the impl of `std::fmt::Debug` for `&for<'r> fn(i64, &'r i64) -> i64`
= note: required for the cast to the object type `dyn std::fmt::Debug`


It only shows an error for FnTest2 which has a reference argument while FnTest1 works fine.



Is this a bug in Rust or is there a solution or an alternative method to this issue?



I am running Rust nightly (rustup says: rustc 1.30.0-nightly (ae7fe84e8 2018-09-26)).










share|improve this question




























    up vote
    0
    down vote

    favorite
    1












    I have a enum where I want to generalize an function pointer. As soon as I add a reference inside the function pointer definition. it fails to compile because it cannot print it with Debug:



    fn div1(t: i64, b: i64) -> i64 {
    t / b
    }

    fn div2(t: i64, b: &i64) -> i64 {
    t / b
    }

    #[derive(Debug)]
    enum Enum {
    FnTest1(fn(i64, i64) -> i64),
    FnTest2(fn(i64, &i64) -> i64),
    }

    fn main() {
    println!("{:?}", Enum::FnTest1(div1));
    println!("{:?}", Enum::FnTest2(div2));
    }


    The error I get is this



    error[E0277]: `for<'r> fn(i64, &'r i64) -> i64` doesn't implement `std::fmt::Debug`
    --> src/main.rs:12:13
    |
    12 | FnTest2(fn(i64, &i64) -> i64),
    | ^^^^^^^^^^^^^^^^^^^^ `for<'r> fn(i64, &'r i64) -> i64` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
    |
    = help: the trait `std::fmt::Debug` is not implemented for `for<'r> fn(i64, &'r i64) -> i64`
    = note: required because of the requirements on the impl of `std::fmt::Debug` for `&for<'r> fn(i64, &'r i64) -> i64`
    = note: required for the cast to the object type `dyn std::fmt::Debug`


    It only shows an error for FnTest2 which has a reference argument while FnTest1 works fine.



    Is this a bug in Rust or is there a solution or an alternative method to this issue?



    I am running Rust nightly (rustup says: rustc 1.30.0-nightly (ae7fe84e8 2018-09-26)).










    share|improve this question


























      up vote
      0
      down vote

      favorite
      1









      up vote
      0
      down vote

      favorite
      1






      1





      I have a enum where I want to generalize an function pointer. As soon as I add a reference inside the function pointer definition. it fails to compile because it cannot print it with Debug:



      fn div1(t: i64, b: i64) -> i64 {
      t / b
      }

      fn div2(t: i64, b: &i64) -> i64 {
      t / b
      }

      #[derive(Debug)]
      enum Enum {
      FnTest1(fn(i64, i64) -> i64),
      FnTest2(fn(i64, &i64) -> i64),
      }

      fn main() {
      println!("{:?}", Enum::FnTest1(div1));
      println!("{:?}", Enum::FnTest2(div2));
      }


      The error I get is this



      error[E0277]: `for<'r> fn(i64, &'r i64) -> i64` doesn't implement `std::fmt::Debug`
      --> src/main.rs:12:13
      |
      12 | FnTest2(fn(i64, &i64) -> i64),
      | ^^^^^^^^^^^^^^^^^^^^ `for<'r> fn(i64, &'r i64) -> i64` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
      |
      = help: the trait `std::fmt::Debug` is not implemented for `for<'r> fn(i64, &'r i64) -> i64`
      = note: required because of the requirements on the impl of `std::fmt::Debug` for `&for<'r> fn(i64, &'r i64) -> i64`
      = note: required for the cast to the object type `dyn std::fmt::Debug`


      It only shows an error for FnTest2 which has a reference argument while FnTest1 works fine.



      Is this a bug in Rust or is there a solution or an alternative method to this issue?



      I am running Rust nightly (rustup says: rustc 1.30.0-nightly (ae7fe84e8 2018-09-26)).










      share|improve this question















      I have a enum where I want to generalize an function pointer. As soon as I add a reference inside the function pointer definition. it fails to compile because it cannot print it with Debug:



      fn div1(t: i64, b: i64) -> i64 {
      t / b
      }

      fn div2(t: i64, b: &i64) -> i64 {
      t / b
      }

      #[derive(Debug)]
      enum Enum {
      FnTest1(fn(i64, i64) -> i64),
      FnTest2(fn(i64, &i64) -> i64),
      }

      fn main() {
      println!("{:?}", Enum::FnTest1(div1));
      println!("{:?}", Enum::FnTest2(div2));
      }


      The error I get is this



      error[E0277]: `for<'r> fn(i64, &'r i64) -> i64` doesn't implement `std::fmt::Debug`
      --> src/main.rs:12:13
      |
      12 | FnTest2(fn(i64, &i64) -> i64),
      | ^^^^^^^^^^^^^^^^^^^^ `for<'r> fn(i64, &'r i64) -> i64` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
      |
      = help: the trait `std::fmt::Debug` is not implemented for `for<'r> fn(i64, &'r i64) -> i64`
      = note: required because of the requirements on the impl of `std::fmt::Debug` for `&for<'r> fn(i64, &'r i64) -> i64`
      = note: required for the cast to the object type `dyn std::fmt::Debug`


      It only shows an error for FnTest2 which has a reference argument while FnTest1 works fine.



      Is this a bug in Rust or is there a solution or an alternative method to this issue?



      I am running Rust nightly (rustup says: rustc 1.30.0-nightly (ae7fe84e8 2018-09-26)).







      rust






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 19 at 17:46









      Shepmaster

      144k11268401




      144k11268401










      asked Nov 19 at 17:44









      Johan Bjäreholt

      3071217




      3071217
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          4
          down vote



          accepted











          Is this a bug in Rust




          No, but it is a limitation:




          • Cannot derive(Debug) for a struct with a function with a reference parameter (#45048)

          • #[derive] Debug, PartialEq, Hash, etc. for any function pointers, regardless of type signature (#54508)



          is there a solution or an alternative method




          Yes, you must implement Debug for the type Enum yourself.






          share|improve this answer























          • Oh, that's unfortunate. Works for a few of my test cases but I also now get a stack overflow in one apparently but that's a seperate issue. Thanks!
            – Johan Bjäreholt
            Nov 19 at 18:46











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53380040%2ffunction-pointer-with-a-reference-argument-cannot-derive-debug%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          4
          down vote



          accepted











          Is this a bug in Rust




          No, but it is a limitation:




          • Cannot derive(Debug) for a struct with a function with a reference parameter (#45048)

          • #[derive] Debug, PartialEq, Hash, etc. for any function pointers, regardless of type signature (#54508)



          is there a solution or an alternative method




          Yes, you must implement Debug for the type Enum yourself.






          share|improve this answer























          • Oh, that's unfortunate. Works for a few of my test cases but I also now get a stack overflow in one apparently but that's a seperate issue. Thanks!
            – Johan Bjäreholt
            Nov 19 at 18:46















          up vote
          4
          down vote



          accepted











          Is this a bug in Rust




          No, but it is a limitation:




          • Cannot derive(Debug) for a struct with a function with a reference parameter (#45048)

          • #[derive] Debug, PartialEq, Hash, etc. for any function pointers, regardless of type signature (#54508)



          is there a solution or an alternative method




          Yes, you must implement Debug for the type Enum yourself.






          share|improve this answer























          • Oh, that's unfortunate. Works for a few of my test cases but I also now get a stack overflow in one apparently but that's a seperate issue. Thanks!
            – Johan Bjäreholt
            Nov 19 at 18:46













          up vote
          4
          down vote



          accepted







          up vote
          4
          down vote



          accepted







          Is this a bug in Rust




          No, but it is a limitation:




          • Cannot derive(Debug) for a struct with a function with a reference parameter (#45048)

          • #[derive] Debug, PartialEq, Hash, etc. for any function pointers, regardless of type signature (#54508)



          is there a solution or an alternative method




          Yes, you must implement Debug for the type Enum yourself.






          share|improve this answer















          Is this a bug in Rust




          No, but it is a limitation:




          • Cannot derive(Debug) for a struct with a function with a reference parameter (#45048)

          • #[derive] Debug, PartialEq, Hash, etc. for any function pointers, regardless of type signature (#54508)



          is there a solution or an alternative method




          Yes, you must implement Debug for the type Enum yourself.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 19 at 18:23

























          answered Nov 19 at 17:52









          Shepmaster

          144k11268401




          144k11268401












          • Oh, that's unfortunate. Works for a few of my test cases but I also now get a stack overflow in one apparently but that's a seperate issue. Thanks!
            – Johan Bjäreholt
            Nov 19 at 18:46


















          • Oh, that's unfortunate. Works for a few of my test cases but I also now get a stack overflow in one apparently but that's a seperate issue. Thanks!
            – Johan Bjäreholt
            Nov 19 at 18:46
















          Oh, that's unfortunate. Works for a few of my test cases but I also now get a stack overflow in one apparently but that's a seperate issue. Thanks!
          – Johan Bjäreholt
          Nov 19 at 18:46




          Oh, that's unfortunate. Works for a few of my test cases but I also now get a stack overflow in one apparently but that's a seperate issue. Thanks!
          – Johan Bjäreholt
          Nov 19 at 18:46


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53380040%2ffunction-pointer-with-a-reference-argument-cannot-derive-debug%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Feedback on college project

          Futebolista

          Albești (Vaslui)