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

    <tr>
        <th>Summary</th>
        <td>
            friend function with default parameters causes "redefinition of default argument" error in templates
        </td>
    </tr>

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

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

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

<pre>
    ### Summary:
Starting from commit `38b3d87bd384a469a6618ec6a971352cb4f813ba` in LLVM, Clang 20 reports 
`error: redefinition of default argument` when using `friend` functions 
in template classes, even though the default argument is only defined once.

### Steps to Reproduce:
Compile the following minimal example with Clang 20:

```cpp
#include <iostream>
#include <memory>

namespace Work {

namespace detail {
    class Obj;
} // namespace detail

using Ptr = std::unique_ptr<detail::Obj>;

template <int>
Ptr Create(const void* key = nullptr);  // default argument only once.

namespace detail {

class Obj {
protected:
    Obj(const void* key) {
        std::cout << "Obj::Obj\n";
    }
};

template <int>
class ObjImpl : public Obj {
public:
    ObjImpl(const void* key)
        : Obj(key) {
 std::cout << "ObjImpl::ObjImpl\n";
    }
    template <int>
    friend Ptr Work::Create(const void*);
};

} // namespace detail

template <int i>
Ptr Create(const void* key) {  // error: redefinition of default argument
    return Ptr(new detail::ObjImpl<i>(key));
}

} // namespace Work

int main() {
    auto ptr = Work::Create<192>(nullptr);
    return 0;
}
```
### Result:
clang++ reports:
```
./build/bin/clang++ -std=c++20 /mnt/e/test/error.cpp
/mnt/e/test/error.cpp:38:24: error: redefinition of default argument
   13 | Ptr Create(const void* key) {
 |                        ^
/mnt/e/test/error.cpp:39:20: note: in instantiation of template class 'Work::detail::ObjImpl<192>' requested here
 39 |     return Ptr(new detail::ObjImpl<i>(key));
      | ^
/mnt/e/test/error.cpp:45:22: note: in instantiation of function template specialization 'Work::Create<192>' requested here
   45 |     auto ptr = Work::Create<192>(nullptr);
      | ^
/mnt/e/test/error.cpp:32:40: note: previous definition is here
   32 | friend Ptr Work::Create(const void*);
      | ^
1 error generated.
```
### Workaround:
If we remove the default parameter from Ptr Create(const void* key = nullptr);, then Clang++ compiles correctly.
If we remove the friend declaration, Clang++ also compiles correctly.
### Regression:
git branch: release/20.x
First bad commit: 38b3d87bd384a469a6618ec6a971352cb4f813ba
This issue does not occur in earlier versions of branch.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykV1-P2rgX_TTm5aoosQOBBx4yzCBVavX7qV3tavdl5Tg34NaxU_-Z6eynX9kOFGaYdrpFSEBsX59z7vH1hTsn9xpxQxY3ZHE748EfjN08SL1H-9ef72et6R43hLL8ho9hGLh9JKwhRfPRc-ul3kNvzQDCDIP0QJYFW7WsW9Vtx1YVr5ZrvlyWKxRLvq5LtqCirfpVyVpOlgVIDe_e_f6e0C1sFdd7oAVYHI31DkjRkGWB1hpLWAMWO-ylll4aDaaHDnselAdu92FA7WO4hwNqCC6CIsuitxJ1F5_3QYu4LgWVGjwOo-IeQSjuHLq4P96jBn8wYX8Af8Bn8UE6MFo9QoKBHRgtcB5BFs2ZQh5HB97ABxyt6YLALNbWDKNUmCL3RikTNYZBajlwBfiVD6NCeJD-cBIiL8wq5LcYx7yZ1EKFDoGwrTTOW-QDYXfPxgYcTMzWXY6j-YBu5ALhD2M_A6lvnj7v0HOpphEAyPrA_9pPhKXJ9S0QuiN0B08X5VBZ-_97C4TdgvNdJMGaoOWXgH-P3hK2neangRT5bgpeNKe8RGLaZ-Qx2tYi90joShjtPNwb2RHawGd8TBvpoFQMTteE3cAR4rMMpvSdpe0F4qRoTrynR6M1HoXHLiclShOhX8FD6PpMv_g6qSBM8JEZYVsglCbuRxEWW00ozULERaS-zXp_X5sTzrfDqCAekzG0Sopz6OnBBe44-QXsZ7hjtEzyktZ3-KTAR07px3Ve8dtVPnEgH9tkoujTHO-6AXLCnwj1Q5M-2Rnka3w2CXAy1-vrUmZl0QerIytCVxof4MkxyNJtE5aj4hf0XuaWVErDkc3ApSZ0delDHryBcTqWz1Rl23JN88YXJ-kSenGB5ViTLqrfB3RB-ew1EcsYoTeE3hxL-lTRzpbOCd21Qaoufkbcu_Nlb5LVbkX-SYtIfdCe0B0SuvPo0teYiPmxNH5vnDVsRVhDq5i2n8xfyYDUW3iVR-KKOPmFF1ncvQbqOkKNlwBoE3PUxMtSaue59pIf0V7eZEBo_S271x12THUNFr8EdB47OKDFiJqtT8B_ya8T0Xr7SrLVIpKlPyJ7vMa_sXYjCsmV_CfPuaD_zNzXGANUixPnXzolP8OXRarVRXJHi_fSBAdnbpTuDCejaYP_Uh2fwiuz-2GPGi332M1fPNFxD25N0NPN97aHBwSLg7nHizZp5JYP6NHmdvBnL-3YgfnYvW3Pzr_ITZMDYaxF4dXj_BqESZIOheI2GeHUT06BuHLmhWjnxWtv0bm4PFHdSw-t5VoccplQyF3MJy3mX0nR7KR1HlreTa1vnPTq1rdofjtIB9K5gNAZdNEHYIQINjofuVUSLdyjdaltNf0EZT7rNqxbszWf4aasq7JeVmVdzw6bZSlwRZd9yVeiR04ruu5XuMaW0b4UdTeTG1rQRcFKWtSULup5XQom6kowUfUVFz2pChy4VHOl7oe5sftZwrcpWbEu65niLSqX_ipQGitCGo23--J2Zjdx0Zs27B2pCiWdd9_CeOkVbqY0nQ5xanaf2ceB4MFhLGX0h6WZ0snJZz29mwWrNgfvx3TfpMtyL_0htHNhBkJ3Edb08Wa05hOKeDwTGUfobmJ7v6H_BgAA__9RfPrg">