<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/56649>56649</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            APFloat optional/default valued parameter in Attrdef
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          bhatuzdaname
      </td>
    </tr>
</table>

<pre>
    Hi, I'm trying to create an Attrdef which has a default valued APFloatParameter field.
```
def optionalFloat : APFloatParameter<""> {
  let isOptional = 1;
  let defaultValue = "APFloat(3.0f)";
}

def MyStructAttr : AttrDef<My_Dialect, "StructHMM"> {
  let parameters = (ins optionalFloat:$foo);
  let mnemonic = "struct";
  let assemblyFormat = "`<` struct(params) `>`";
}
```

The problem is that in the generated printer/parser to check if the field exists, we simply generate if(getFoo()). This fails for APFloat as it cannot be implicitly converted to bool. Thinking about this, I am not sure if this is a good strategy even for ints/bools etc, as just because the value ==0, does not mean it is optional..

Errors:
```
 error: invalid argument type 'llvm::APFloat' to unary expression
        if (::mlir::succeeded(_result_foo) && !*_result_foo) {
...
 error: value of type '::llvm::APFloat' is not contextually convertible to 'bool'
    if ((getFoo()) && !(getFoo().bitwiseIsEqual(APFloat(3.0f))))) {
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJxtVFuTmzoM_jXkRVOGQG488JA2m-k-7LQz7ZzXHQMC3Bo7tU12019_JANJ04bxcNPtk_RJpakvxWcZpZ_gOUq3PXh7kboFb6CyKDyC0LD33tbYwFsnqw464UAAfYtBeTgLNWAN-69HZYT_Kqzo0aOFRqKq4yg5RMk-2iTTCZ_sypy8NFqoYAVRtv_HQ5R9itKUT_YE0fbjaAug0IN0XyZ7Mj3AMsruxBO2_xhaUCAvk_so3WVx0kRpHjxPZtH2ML1cAb5cvnk7VJ5zH_HRywEbgvVyeT1IobDyXDbyM2p-fnl5jPY0p-QmMDup3X0FKECUrhpjGNh9Mr3G3mhZzYm4EOxP9KOecA77Ul2OxvahpEGbi06F3CQw2-0CHEeBIAif-P6wFvddG-_fO4STNaXCnroAvqNQUtMToUWNlhhTk4LU3MH0SLEckYHZ1GH1E2QTVAM5AN-l845r-IbgZH9Sl6sT0iSoLfoj12QX-pXH8L2joI2Qiu7Gzpyh3EF6qITWxkNJxuRLVtKTw8roM1pGRSBKY1Rwon8yyUVpBk-AZADxDKIHduAGiyNSCiaZ7K0xNReQgLUXwDPqEJ6yJMsje3WAvmIvBOXH4BhFJQaHId3zTEQ6CSvVBl0I1SONl2RCX_kQx3_W-8laYx3T41FPAFnM7JSagsgahG2HHjVldTlRyHSr1Lln82x_nYAtl2LQwlIq7yeLzlHgmUrjRdlz1YNdr6Qd39xQVYg11iR7JTuasdeRs6S9oUOPZZTu_5bN4xDPud1wj6UxzRXvGOkhajnWjDrq8d0PQt3aK4mQnBWpcTfYzzWfKZd_2HSH-U4Yl9K_SYfP7ukXhaGfD7bH7dwSvLZnURdZnWe5WHhiIRYzUecmE2v-WqDXJcHjNC3cxWBV0Xl_CgRIj3Ra6buhjCvT00eo0vj4QEP5I2yko3RuQOblerNZ5YuuyPJVnm-2DVa7dFWW6zSr8lUiEqzrZdmsNgslSlSuiNYfaRFofIPggpfC-rCQRZqkabJNl3StsnVcZ-vdMt-JdSO2nGO0SrCnkYwZR2xsu7BFgFQOrSOh4im_CWlPyVYjhnDkXwy-M7YoaZMMv2uhqQqLEL8I-P8H7-YKcw">