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

    <tr>
        <th>Summary</th>
        <td>
            [C++20] [Modules] We don't merge deduction guide correctly
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:modules
      </td>
    </tr>

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

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

<pre>
    Reproducer:
```
// foo.h
template <typename T>
class Templ {
public:
    Templ(T a) {}
};

// A.cppm
module;
#include "foo.h"
export module M:A;
export using ::Templ;

// B.cppm
module;
#include "foo.h"
export module M:B;

// M.cppm
export module M;
export import :A;
export import :B;

// Use.cpp
import M;

void func() {
    Templ t(5);
}
```

Compile it by:
```
clang++ -std=c++20 --precompile A.cppm -o M-A.pcm
clang++ -std=c++20 --precompile B.cppm -o M-B.pcm
clang++ -std=c++20 --precompile M.cppm -fprebuilt-module-path=.  -o M.pcm
clang++ -std=c++20 Use.cpp -fprebuilt-module-path=. -fsyntax-only
```

then we'll meet:
```
Use.cpp:4:11: error: ambiguous deduction for template arguments of 'Templ'
    Templ t(5);
          ^
/home/chuanqi.xcq/workspace.xuchuanqi/llvm-project-for-work/build/modules_deduction_guide/foo.h:4:5: note: candidate function [with T = int]
    Templ(T a) {}
    ^
/home/chuanqi.xcq/workspace.xuchuanqi/llvm-project-for-work/build/modules_deduction_guide/foo.h:4:5: note: candidate function [with T = int]
```

The error message is clearly wrong. 

A workaround could be to add a user-defined deduction guide:
```
// foo.h
template <typename T>
class Templ {
public:
    Templ(T a) {}
};

template<typename T>
Templ(T t) -> Templ<T>;
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVVU2TozYQ_TX40gWFhbHNgYM_dm6-pJxKblsCCVAiJBZJO-N_nxbC9szEs9mk9rBxYWOpW0-vu59alWaX8hc-jJq5mo9RtovSY5TuonU6P2FInvCBRuukCzOW94OklkOUHexl4Ir2HM5R9imYa0mNgbN3gmizD5ODq6Sob3sAfiaPiGzPQCNSTK6b47wn_snmlW9Y7JJ6GPow1SNvye9-JBOqlo4hL0ICXUKCjb8MerQQVsAJaexu62abM0K14Almu8DsIYH9jyKwf4x_eoX_t0VvGYt-ej0K5m76YJtfDfcbhbnZ-_TO9asWDBqnaqzRtUBviwcWTTna7itvFXwnoun3oPtBYCjCQnX5SG8oH9VGZI8PxMayKDvWYUhSiONh5PUME8QAsYZTvEuGuv-3APtXAPv_AnCaARqcq5yQNg7FigdqO1yWwAT-ndBzUb4FFzfmoix9ibWSl29k2nZcwTOPyEZK6Dm3H2X7KoRst8Lvcok_wMdR-3YAtK9E67QzwDj2CCu0wj4wwq0B0LF1PVfWgG5Q9Jv5SG_-USdw-0T5p5syO90j5ae6c1R9EclL_QVHz3r80wy05smLmy04K-XXHiuh_-C1jZFT7N1w3qeN4Tskzny-Ef_cOsE8ejiYId7cR6m05f5dU8UE82F50U_BRvn-WdgOzniUjiCUjfLjdzWw_3FkD_V07niQBYrJGNriGTZQS05HeYHnUas2gdf-O_Cs6aidYlBrJxlUHKwGyhhQbLZ8jBlvhOLslbZCID_1PXTd8_GWdyjroWI0zPDZYfK6gV1jW_Byuc6LvNgUxXbByowVWUEXVljJSyzS4dodsD6-aKdQfT_6jQPTCk8bXhF8xJK8SyTmfcRWZeVl4UZZdtYOxgc-5bHF4rsqwUY2S-6d8nAojHG4E3nK18VyvehK3hBWkVW1Xm5YVi83FVtR3lS02WZkyZp0IWnFpfG08eILrS6bb0njr8L8uBAlSQlJt-kq3ZB1tk1WeVHQPCPVarvM6_U2WqW8p0Imnk2ix3YxlhOxyrUGjVIYa-5GLLFoFZ9y5fGps50ey0M4Tr-7YjGFUU4x_AWUvJ3R">