Hi everyone, I would be interested to hear the opinions of C++ standard experts on which compiler is correctly dealing with the below code (GCC 12.2 -std=c++20 compiles fine, MSVC19.33 /std:c++20 compiles fine, Clang 15.0.0 -std=c++20 barfs) #include #include #include struct X; template struct J { typedef typename T::x aoeu; }; struct S { ::std::vector<::std::shared_ptr>> v; }; static ::std::optional opt; struct X { typedef int x; }; int main () { } Clang barfs with: incomplete type 'X' named in nested name specifier typedef typename T::x aoeu Interestingly if S::v is not a vector, i.e. instead of ::std::vector<::std::shared_ptr>> v; v is just ::std::shared_ptr> v; ... then clang compiles fine. Also, if optional is replaced with say unique_ptr, clang also builds fine. I would be interested in being educated on the standard (of which I am not a lawyer :) ) what would be the correctly mandated behavior? Kind regards Leon.