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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect mangling of __bf16 in template parameter with nested namespaces.
        </td>
    </tr>

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

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

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

<pre>
    ```
namespace NS1 {

    namespace NS2 {
        struct NS2_struct1 {};
    }

    template<typename tpVal, typename tpVal1>
    class Class1 {};

    template<typename tpVal>
    using Name1 = Class1<tpVal, NS2::NS2_struct1>;
}

template <typename dtype>
void MyFunc(NS1::Name1<dtype>& input) {}

typedef __bf16 bfloat16;

struct bf16_struct {
    short a;
};

int main() {
    NS1::Class1<bfloat16, NS1::NS2::NS2_struct1> input;
 MyFunc<bfloat16>(input);

    NS1::Class1<bf16_struct, NS1::NS2::NS2_struct1> input1;
    MyFunc<bf16_struct>(input1);

 return 0;
}
```

For __bf16 case the mangling comes out to be -
`_Z6MyFuncIu6__bf16EvRN3NS16Class1IT_NS0_3NS211NS2_struct1EEE`

which demangled comes out to be -
`void MyFunc<__bf16>(NS1::Class1<__bf16, __bf16::NS2::NS2_struct1>&)`

which is incorrect, as __bf16 is treated as a namespace here.


For bf16_struct, right mangling is produced -
`_Z6MyFuncI11bf16_structEvRN3NS16Class1IT_NS1_3NS211NS2_struct1EEE`

and the demangling comes out to be -
`void MyFunc<bf16_struct>(NS1::Class1<bf16_struct, NS1::NS2::NS2_struct1>&)`



https://godbolt.org/z/dTWxYbqhM



</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVU1vqzgU_TVmc9UIGxrIgkVfGqQumsXkaUYzm8jGN8EjwIxt2un8-pHDR0iKqkqvqhwCvuece-4J5taqc4OYkccf5PE54J0rtckO_MzNKy_Rlu_cqM0mEFp-ZGQdDv_hMwmfGl6jbXmBsD9QIMmP_na_AgDMN7DrBhj-rDNd4fyzY3_ZgyTPJJrt9N_vcB3WbcUdkmjrPlr0NODa33lF2BZu71AS7a6FRcWtha1fP3F9B36O1VnVnGHPa6RAoucB1deMSvYHRqInEj3NOvQQE-NtZyMtzHmlv5p437SS8PqRd01BWLo_0AHfiyDRdtrM1qCatnOEbcY250QfLUo8wfEoTnQN4lRp7uj6zolhOn7LIP52grbUxgG_6eYWQTUOaq4awtJRyFQ9aZ9sm2RcnKOTc0sWDt1NMRksmYF4E9LRg4UZL_FPjX5fAr2J6kzGFeuqhC5IMeg600C4EIrbH1u_5tqMYyu4RXAlQs2bc-WzWOgaLejOgdMgEB4moONf617bS7fuy3dvv-2j_YGu-_5ffh73h_AY7Q-M0lmju93uTsF7qYoSJF5YUX5BOg9rtO1pezc-mz88ZVsY931hPWFr7-SSLmVBNYU2BvspcjvapSw4g9yh9Df57N1UosHVHOpq9V0mjDqX7uq3stAaLbsC5aLXlM7qlwyn3zGcN_Iy5sHyrwd96_mnGP5y6hetn6-lc631lSwnLD9rKXTlVtqcCcv_IyyXP__490_xT_n6uTSQWSQ30YYHmNEkomGaxCwMyqyIRcoSyUW6oaKIYxo_hhGjAk_x6SS4CFTGQhZTGqY0iZIwXIlYijQpkjQMqcQ0IXGINVfVqqreaq8mUNZ2mFH6-MhoUHGBlb2cgYw1-A6Xp4QxfySazBc9iO5sSRxWyjp7hXHKVZi9jJG7ZkNPr1fVTAcKtNzwGh0aeFeuhAatz-MURbsKOlNldx4qV3ZiVeiasNwTDx8PrdF_X2KeX-RawvKhn7eM_R8AAP__ihVJoA">