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

    <tr>
        <th>Summary</th>
        <td>
            Method Constraints with Full Specialization Fails to Link (Undefined Symbols)
        </td>
    </tr>

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

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

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

<pre>
    Please refer to [this](https://github.com/llvm/llvm-project/issues/102548) previous issue I posted, as the problem is very related. This issue was resolved, as it appeared to be fixed in the most recent clang version. However, it is still causing problems with the linker.

I can only assume that the problem stems from how the symbols are named by clang, and that the full specialization of a method with constraints is being named inconsistently between the declaration and implementation.

This inconsistency also appears to only present itself in between different translation units.

Minimal example of failure:
To compile:
`clang++ -std=c++20 -c fail.cpp -o fail.o`
`clang++ -std=c++20 fail.o main.cpp`

**fail.h**
```
#pragma once
#include <concepts>

template <typename T>
struct test
{
        void method() requires(std::floating_point<T>);
};
```

**fail.cpp**
```
#include "fail.h"
#include <iostream>

template <>
void test<double>::method()
{
        std::cout << "Sucess\n";
}
```

**main.cpp** 
```
#include <iostream>
#include "fail.h"

int main()
{
        test<double> t;
        t.method();
}
```

This compiles and links in gcc, but fails to compile using clang.
```
clang++ --version
clang version 20.0.0git (https://github.com/llvm/llvm-project.git 101cf540e698529d3dd899d00111bcb654a3c12b)
Target: arm64-apple-darwin23.5.0
Thread model: posix
InstalledDir: /usr/local/bin
```

PS: Although I wasn't able to replicate this by adding "-g" to this minimal example, this problem only presented itself in the release build of my project.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVt2u2zYMfhrlhohhy3ESX-TinKTBCqxAgdNdD7JEx2plyZXopNnTD5Lzc9J1px0GBI4tkp_IT_yRCEEfLOKGVc-s2s3ESJ3zm88yfF3OGqfOm48GRUDw2KIHcsCqZ-p0YNWO8XVHNARWPjG-Z3x_0NSNTSZdz_jemOP1bz549xklMb7XIYwYGN8XOa8Wa8ZrGDwetRsDJBm8h8EFQsX4FkQA6hAG7xqDPegAR_Rn8GgEocrgU6evZicRwGNw5ngz1QRiGFB4VNHxBqHV31CBtgm1d4HAo0RLII2whwgetLMZ_OZOeEQfcTTFbQNpY0CKMWh7uPoT4KSpS1hG2y_oM5bvWP40Pd-DFBacNWcQIYw9AnWCHuIJFEFa73ro3CmJwrlvnAkgPIIVPSpozpN3KSir7ijtaAyEAaUWRv8lSDsLrgUBPVLn1OScdDaQF9pSJAoajP5PwNpGoQ6ElswZGqQT4kSNQmmEnyDjnrofDPZoKS09hDkdwR1KnkGY4C7Mh0h84mDwGCLTmgKaNp7BdUOl2xZ9lJEXNphp29FqCg87fdBW98IAfhPRnRhrK7QZPcYEnJxxIF0_aHNfYsv8Qt8z488wD6RYuZPTJ89hLhNKJocB5m56d2yZ_5r1pA690DYi3O2mJ4-_pNNN7zfUy--iVg5eHHoBzkq8rWkrzagQWLmVUTBQYOW71_iE_RArIarQecB4rvDpphTIj5KAMNDFavV8Na-PTqtLpjCe6tDj11H7WJzrFOYTK59a4wRpe_hzcNoSK7cJndesvCKtdvf378L6noNI0Jss3CLm_Eoa_xEd2gXyKPo36LiJUpyJgnKr3NjE1Hg3Bfc6-n8SdONAupEmyG307GWUGAKrtjZ695qHn5Fwy5L0BT9l4UeBvklSempLKR__La7vuQC6B5HXlD2w8mvhpR5wKbyQGkbsh7EtwEHK2LiakVKtpH5w0YSpmab6yn6I_lB680t3fiW6NmzgeZZn-UET_OeZlEWrIi9kWy1yXNbriteqVGpd1yrPi6JoZLOsFqKUBW9uhH4S_oDEyicQvl8u5mIYDM6V8CdteZlVWX5lxqNQ0DuFJmoPLuhvl_lgAwljUO20jyLG92Pw0TsnhWF832j7BucfX6LRk6HOjYcO3scBaBlfEYjGYKTZ42C0jPUQ53WcI0KpyDjjfH5gnEelJOofO2s8sLR-nVOvG3gcHLcWHmeFx-mC0IzaqNiU-6g7cTtTm1LVZS1muClWvKzWi3Vdz7pNu1C8WXFVrnK5rJfNuqq4EIJzLBclX-QzveE5X-TrouRFuajqrG2rosibVtXLXGJZsEWOfcz_eJiZ84dZugdsirxcrKqZEQ2akG41nFs8TbeEWCrVbuY3KQOa8RDYIjc6ULjDkCaDmw_TDN2-Gp9pnu7j0H15HLr7a2L_ru2XmIF_WIWttqjgZRrnjNez0ZvN_7kupbCOG_53AAAA__-IDf6P">