<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/78173>78173</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
static function used in template function in C++-20 module not found
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ZhalgasFromMSU
</td>
</tr>
</table>
<pre>
Hi!
NB:
Here is a sample project, depicting the problem: https://godbolt.org/z/neo8M8orM
Imagine, that I have a `static inline` function `foo_header`, defined in some header:
```c++
// header.hpp
#pragma once
static inline int foo_header(int x) {
return x;
}
```
And this function is used in a template function `foo_module` in some module:
```c++
// module.cpp
module;
#include "header.hpp"
export module Mod;
export template<typename T>
T foo_module(T x) {
return foo_header(x);
}
```
Now I want to use latter in my `main.cpp`:
```c++
// main.cpp
import Mod;
int main() {
int x = foo_module(5);
return 0;
}
```
However, clang **falsely** claims, that there is no matching function `foo_header`:
```
In file included from /app/main.cpp:1:
module.cpp:9:12: error: no matching function for call to 'foo_header'
9 | return foo_header(x);
| ^~~~~~~~~~
main.cpp:4:13: note: in instantiation of function template specialization 'foo_module<int>' requested here
4 | int x = foo_module(5);
| ^
1 error generated.
```
Here are some observation, based on which, I make an assumption that this is a clang bug:
1) This code compiles/works properly on trunk of gcc
2) This code compiles/works properly if I explicitly cast template parameter `T` to `int` like this:
```c++
// module.cpp
export template<typename T>
T foo_module(T x) {
return foo_header(static_cast<int>(x));
}
```
3) This code compiles/works properly if I remove keyword `static` from `foo_header` function declaration
Based on those observations, I could assume that body of `foo_module` template function gets compiled in different translation unit, from where header was included, and therefore `static` specifier on `foo_header` hides this function
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk1z2zgS_TXQpSsqCtTnQQfZjio-OJf1XvaSAokmiTUIcAHQsnLY3z7VAClRcTLxTA1LZUtAA-j3-F43hPeqNoh7trpjq4eZ6ENj3f4_jdC18Edn26d__XtWWHnef1GML1j2wLJD-vv1juXD1y_oEJQHAV60nUbonP0vloHxe5DYqTIoU0No4kShsWX5AZoQOk9b8CPjx9rKwuowt65m_Pid8aNBu33aWvc0PfSxFbUySBuHRgR4hEa8Ighg68wHEVQJymiKWGdQ9aYMyhqarKz91qCQ6Ng6S3lVyqAEZcDbFmGYHCFRVPyUjN_RJ43GXIfYedN143DeOVG3AqwpcZrvTU6gTIBJInxLA2-M74BthhMAAByG3hl4Y_l47Obhh6zSz4OREBrlr0iVh94nVAICtp0WAd8R0VrZ60jRiH4Y-RD6FDsvR_Tj2ktUrkype4nAOJ9QxfmUGXzrrAvDZvBk5XWD6fyIgeX34dyhES3CM8s_p6BnmMDh2-dfk3lDO0X9ltyv9gSPcBImQLDEKmgRAjrirD0Tla1QJtKwzj7I3LggDqo2InwPnVRBoYxvb-FEuQDLH25hr6ZwJpiz32Ic7GtP-ErE3EOphamB8QPjh0poj_qcftCMav3FeKEZPG8stCKUDTn814Z7R89gZwOV0mSMKBgJlbMtMH4UpJfjha_8sLhsMZFfftjRFKdygs5Zsu_PE6qsg1JoTa-S8c1UDZsrb8T1PXxINTEqhrPV5_-Pz5DhNe0l5ZentEjE9A5BGR-ECUrE1Gx1TfPiWN9hqYRW31PMkPLotHtlAnmAb8Dh_3r0ASXQC7nmtrxA-aho4LJifNhqsNkisQs1GnQioJz_mZpIGMJhKiy28OheIwrSTiGoOlkDp0aVDY08QiteEIQB4X3fdomHJDHlU1dJqiz6-iKCBRnjmQJKKxFK23ZKo2f8eLLuxVOf6dDpMx0VXG9eiOa6LNNq_tHVqoJHwLdOq1IFfYZS-GtJgk440SKVBLbOnqmckrrWGb2ddQZavWAE8ffK6j9SAH-m49STvhGWiZSSvD9QF_O_RJ7D1r4ivOD5ZJ28tunYn6PZfygVVzNILLVwSToTfd2NEgqN9TcC80lPpe21TGrCpCS6wJAA3rW_9x2yxuBHTLGNSlVV6JC6gBPG62TI3qh4u4kQTrEWJgRwEv5SzihCxB6NDivr8BZ_NHml0MFPSiY0SqK_be8zuc_lLt-JGe4Xm2yV07OcNftitaskF7IQWc55uc1ylMvlRpQoVpLvljO15xlfZovFarFa8sVyvliss2KXY7Fd7lY7kbNlhq1Qeq71a0u3sJnyvsf9ZrvY5DMtCtQ-3hI5N3iCOEkdffUwc3ta86noa8-WmVY--OsuQQWN--EadGF5vKO8518ZuE_m-MSz8XZgLN2beiNnvdP7Hy6OKjR9MS9ty_iRjh3-fbrcQY8xWRJoBPNHAAAA__8Cd16O">