Index: clang/lib/Sema/SemaLookup.cpp =================================================================== --- clang/lib/Sema/SemaLookup.cpp +++ clang/lib/Sema/SemaLookup.cpp @@ -2578,6 +2578,8 @@ bool addClassTransitive(CXXRecordDecl *RD) { Classes.insert(RD); + if (InstantiationLoc.isInvalid()) + InstantiationLoc = RD->getLocation(); return ClassesTransitive.insert(RD); } @@ -2723,8 +2725,10 @@ if (!Result.addClassTransitive(Class)) return; - // Only recurse into base classes for complete types. - if (!Result.S.isCompleteType(Result.InstantiationLoc, + // Only recurse into base classes for complete types and for class templates + // that that have been instantiated. + if (!Result.InstantiationLoc.isValid() || + !Result.S.isCompleteType(Result.InstantiationLoc, Result.S.Context.getRecordType(Class))) return; Index: clang/test/SemaCXX/class-argument-lookup.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/class-argument-lookup.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -verify -fsyntax-only -fopenmp %s + +// expected-no-diagnostics + +template +struct z { + static void aj() { + T f; +#pragma omp target map(f) + ; + } +}; + +template class ar {}; +template struct as {}; + +template class z>>;