From: David Majnemer Date: Thu, 9 Jun 2016 05:26:56 +0000 (+0000) Subject: [Sema] Don't crash when a field w/ a mem-initializer clashes with a record name X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9b3527b069830d903a8fad7f93d76eb461d9f414;p=clang [Sema] Don't crash when a field w/ a mem-initializer clashes with a record name It is possible for a field and a class to have the same name. In such cases, performing lookup for the field might return a result set with more than one entry. An overzealous assertion fired, causing us to crash instead of using the non-class lookup result. This fixes PR28060. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272247 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 554d1abbed..24a47d1942 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -2637,8 +2637,7 @@ Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation, Instantiation->getTemplateInstantiationPattern(); DeclContext::lookup_result Lookup = ClassPattern->lookup(Field->getDeclName()); - assert(Lookup.size() == 1); - FieldDecl *Pattern = cast(Lookup[0]); + FieldDecl *Pattern = cast(Lookup.front()); InstantiateInClassInitializer(PointOfInstantiation, Field, Pattern, TemplateArgs); } diff --git a/test/SemaCXX/member-init.cpp b/test/SemaCXX/member-init.cpp index b3ee30b456..65c8873117 100644 --- a/test/SemaCXX/member-init.cpp +++ b/test/SemaCXX/member-init.cpp @@ -192,3 +192,13 @@ struct S { int x[3] = {[N] = 3}; }; } + +namespace PR28060 { +template +void foo(T v) { + struct s { + T *s = 0; + }; +} +template void foo(int); +}