<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/66182>66182</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Forward declared templates error in clang, but not in gcc / msvc
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang,
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
MichielJazzy1
</td>
</tr>
</table>
<pre>
See: https://godbolt.org/z/svqjxWbYf
Code that doesn't compile with LLVM 16.0, but does compile with gcc 13.2, msvc 17.6:
If you think this is c++ compliant, how would you solve this?
```
// Vector3.h
template <class T> struct Vector2;
template <class T>
struct [[nodiscard]] Vector3
{
public:
Vector3() {}
constexpr Vector3(T v) noexcept {}
constexpr Vector3(T x, T y, T z) noexcept {}
constexpr Vector2<T> xy() const noexcept;
private:
T x = {};
T y = {};
T z = {};
};
// Vector3.inl
template <class T> constexpr Vector2<T> Vector3<T>::xy() const noexcept { return Vector2<T>(x, y); }
template struct Vector3<double>;
// Vector2.h
template <class T>
struct [[nodiscard]] Vector2
{
public:
Vector2() noexcept =default;
Vector2(T d)
{
data = d;
};
constexpr Vector2(T x, T y) noexcept;
constexpr Vector3<T> xyz(T z) const noexcept;
private:
T data;
T x = {};
T y = {};
};
// Vector2.inl
template <class T> constexpr Vector3<T> Vector2<T>::xyz(T z) const noexcept
{
return Vector3(x, y, z);
}
template <class T> constexpr
Vector2<T>::Vector2(T x, T y) noexcept
: x(x)
, y(y)
{
}
template struct Vector2<double>;
// main.cpp
int main() {
Vector2<double> foo;
Vector3<double> tree;
auto c = tree.xy();
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUlsuOozgUhp_GbI4agV1JYMGiUplIM-peTdSjWRrbCe5xMGOb3J6-ZUMCpJKuaqkUVPb5z_UzmFord7UQBZot0WwV0dZV2hTfJKukUH_Ry-WcRqXm5-JvIRB5hcq5xiLyivAa4fVO81IrF2uzQ3h9QXhtD___OP1T_rtFyQolr93vm-YCXEUdcC1sjfDCAdP7RioBR-kq-Pr1-zdI53GC8BuUbWc3NdkxBimJsbfY2wODdBHPfSIhwp9bOOsWXCXr__yvBWmBIbxEeBn8KElr57WVPsJRt4oHgdXqIIIAkfU4ZTRP-r_u31AufBfMaUPiqlt1Yt8o6gQg8sYUtRY2iPwB1pmWud4YI7IcO36s6fZ6YZjFstZcWkYNR7MVmq2usXtfi94pQNOWSrJbJwDgZoozhHPwtovVOAdvw3RtnTg1ZmS9gYMX1FqcmGjcnTJ_LDn5rm7g3D0uTx28i4gReQv9Op37TIPFTX3XOIDGyAN1AUMAGErZwAkQWV2jDbJ8A-dHO53o8lA0cfBg9LJWvxz-sypRkl-71i-QV0Ren9Tu0wIjXGvqez84Cx0_I5wjsoS70d6ymkDoY3LdlkqEwNP63leJfw34p2HF97A-ZRX3XRjqJysutrRVbjK1wXoD3HfgtjME4dTRMFo-kXaT7cjJnzKN75jOn-P46AzdiL4EP5ePqR6gHrPpa3gQ8LdJ_wBnPOD8W1DfCr1js0f6efFTHlCSTxgnI7jfgn5SyKcy7Kwe5fXhgK85-RfMqUtlAKVPKzsPi4unud1_AT53-PZU1jFrmvGWrF1YH73L3x2GkXvYaj1Q_-DwgzP-Qz7yQlungQV4_F58fSPdDsukxNt3MeIF4TnJaSSKdJ6_zHKSzrKoKlLGy5QmIk9oRhmns_lim5fbBItsnicpiWSBE0ySPCVJluZpFicpZ6WgDOdZOWckQS-J2FOpYqUOe3-3iKS1rSjm8zTDkaKlUDZcWDBmitY7hP2tAGFciyMEU78yW0Wm8B6-lO3OopdESevs4NNJp0Sx1uZIDQcumKJGcLjO0IIwRhuQNfRBuptJrZ1f89eRMDN7YFFrVHF3MZKuasuY6T3Cax-yf3xpjP4hmEN4HRK1CK9DWT8DAAD__94Gtis">