Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ clang/lib/Sema/SemaTemplate.cpp @@ -398,7 +398,7 @@ assert(SS.isEmpty() && "ObjectType and scope specifier cannot coexist"); LookupCtx = computeDeclContext(ObjectType); IsDependent = !LookupCtx && ObjectType->isDependentType(); - assert((IsDependent || !ObjectType->isIncompleteType() || + assert((IsDependent || !ObjectType->getAs() || !ObjectType->isIncompleteType() || ObjectType->castAs()->isBeingDefined()) && "Caller should have completed object type"); Index: clang/test/SemaCXX/member-expr.cpp =================================================================== --- clang/test/SemaCXX/member-expr.cpp +++ clang/test/SemaCXX/member-expr.cpp @@ -228,3 +228,19 @@ .i; // expected-error {{member reference type 'S *' is a pointer; did you mean to use '->'}} } } + +namespace LookupTemplateNameAssert { +void f() {} + +typedef int at[]; +const at& f2(){} + +void g() { + f().junk(); // expected-error {{member reference base type 'void' is not a structure or union}} +// expected-error@-1 {{expected '(' for function-style cast or type construction}} +// expected-error@-2 {{expected expression}} + f2().junk(); // expected-error {{member reference base type 'const at' (aka 'const int[]') is not a structure or union}} +// expected-error@-1 {{expected '(' for function-style cast or type construction}} +// expected-error@-2 {{expected expression}} +} +}