
We can't read a deduced return type until we are sure that the types referred to by it are not in the middle of being loaded. So defer all reading of such deduced return types until the end of the recursive deserialization step. Also, when we load a function type that has a deduced return type, update all other redeclarations of the function to have that deduced return type. llvm-svn: 338798
52 lines
1.2 KiB
C++
52 lines
1.2 KiB
C++
// RUN: %clang_cc1 -fmodules -verify %s -emit-llvm-only
|
|
// expected-no-diagnostics
|
|
|
|
#pragma clang module build A
|
|
module A {}
|
|
#pragma clang module contents
|
|
#pragma clang module begin A
|
|
template<typename T> auto f() { return []{}; }
|
|
#pragma clang module end
|
|
#pragma clang module endbuild
|
|
|
|
#pragma clang module build B
|
|
module B {}
|
|
#pragma clang module contents
|
|
#pragma clang module begin B
|
|
#pragma clang module import A
|
|
inline auto x1() { return f<int>(); }
|
|
inline auto z() { return []{}; }
|
|
inline auto x2() { return z(); }
|
|
#pragma clang module end
|
|
#pragma clang module endbuild
|
|
|
|
#pragma clang module build C
|
|
module C {}
|
|
#pragma clang module contents
|
|
#pragma clang module begin C
|
|
#pragma clang module import A
|
|
inline auto y1() { return f<int>(); }
|
|
inline auto z() { return []{}; }
|
|
inline auto y2() { return z(); }
|
|
inline auto q() { return []{}; }
|
|
inline auto y3() { return q(); }
|
|
#pragma clang module end
|
|
#pragma clang module endbuild
|
|
|
|
inline auto q() { return []{}; }
|
|
inline auto x3() { return q(); }
|
|
|
|
#pragma clang module import B
|
|
#pragma clang module import C
|
|
using T = decltype(x1);
|
|
using T = decltype(y1);
|
|
|
|
using U = decltype(x2);
|
|
using U = decltype(y2);
|
|
|
|
using V = decltype(x3);
|
|
using V = decltype(y3);
|
|
|
|
#pragma clang module import A
|
|
void (*p)() = f<int>();
|