
In C, it is a common pattern to have `static inline` functions in headers to avoid ODR issues. Currently, when those headers are included in a GMF, the names are not found when two-phase name lookup and ADL is involved. Those names are removed by `Sema::AddOverloadCandidate`. Similarly, in C++, sometimes people use templates with internal linkage in headers. As the GMF was designed to be a transitional mechanism for headers, special case those functions in `Sema::AddOverloadCandidate`. This fixes <https://github.com/llvm/llvm-project/issues/98021>.
38 lines
948 B
C++
38 lines
948 B
C++
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang -std=c++20 %t/a.cppm --precompile -o %t/a.pcm \
|
|
// RUN: -DTEST_INLINE
|
|
// RUN: %clang -std=c++20 %t/test.cc -fprebuilt-module-path=%t -fsyntax-only -Xclang -verify \
|
|
// RUN: -DTEST_INLINE
|
|
//
|
|
// RUN: %clang -std=c++20 %t/a.cppm --precompile -o %t/a.pcm
|
|
// RUN: %clang -std=c++20 %t/test.cc -fprebuilt-module-path=%t -fsyntax-only -Xclang -verify
|
|
|
|
//--- a.h
|
|
#ifdef TEST_INLINE
|
|
#define INLINE inline
|
|
#else
|
|
#define INLINE
|
|
#endif
|
|
static INLINE void func(long) {}
|
|
template <typename T = long> void a() { func(T{}); }
|
|
|
|
//--- a.cppm
|
|
module;
|
|
#include "a.h"
|
|
export module a;
|
|
export using ::a;
|
|
|
|
//--- test.cc
|
|
import a;
|
|
auto m = (a(), 0);
|
|
|
|
#ifdef TEST_INLINE
|
|
// expected-no-diagnostics
|
|
#else
|
|
// expected-error@a.h:7 {{no matching function for call to 'func'}}
|
|
// expected-note@test.cc:2 {{in instantiation of function template specialization 'a<long>' requested here}}
|
|
#endif
|