Index: clang/lib/Sema/SemaLookup.cpp =================================================================== --- clang/lib/Sema/SemaLookup.cpp +++ clang/lib/Sema/SemaLookup.cpp @@ -2820,6 +2820,13 @@ case Type::Record: { CXXRecordDecl *Class = cast(cast(T)->getDecl()); + // Class needs to be a complete type. + if (Class->getTemplateSpecializationKind() == TSK_Undeclared && + Result.InstantiationLoc.isInvalid()) { + Result.S.RequireCompleteType(Class->getLocation(), + Result.S.Context.getRecordType(Class), + diag::err_incomplete_type); + } addAssociatedClassesAndNamespaces(Result, Class); break; } Index: clang/test/SemaCXX/template-specialization.cpp =================================================================== --- clang/test/SemaCXX/template-specialization.cpp +++ clang/test/SemaCXX/template-specialization.cpp @@ -19,3 +19,16 @@ B::foo<4>(); // expected-note {{in instantiation of function template specialization 'B::foo<4>'}} return 0; } + +template +struct z { + static void aj() { + T f; +#pragma omp target map(f) + ; + } +}; + +template class ar {}; +template struct as {}; +template class z>>;