From 069ecf65e55ce1cede1bfcaca7a35d6513072821 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Thu, 20 Nov 2014 22:56:34 +0000 Subject: [PATCH] Fix crash-on-valid if a lambda-expression appears lexically directly within a local class inside a template. llvm-svn: 222476 --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 5 ++++- clang/test/SemaCXX/cxx1y-generic-lambdas.cpp | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 891cf73..c05960b 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -2555,7 +2555,10 @@ Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation, // Always skip the injected-class-name, along with any // redeclarations of nested classes, since both would cause us // to try to instantiate the members of a class twice. - if (Record->isInjectedClassName() || Record->getPreviousDecl()) + // Skip closure types; they'll get instantiated when we instantiate + // the corresponding lambda-expression. + if (Record->isInjectedClassName() || Record->getPreviousDecl() || + Record->isLambda()) continue; MemberSpecializationInfo *MSInfo = Record->getMemberSpecializationInfo(); diff --git a/clang/test/SemaCXX/cxx1y-generic-lambdas.cpp b/clang/test/SemaCXX/cxx1y-generic-lambdas.cpp index 8e07b80..f3aae21 100644 --- a/clang/test/SemaCXX/cxx1y-generic-lambdas.cpp +++ b/clang/test/SemaCXX/cxx1y-generic-lambdas.cpp @@ -918,3 +918,10 @@ int run2 = x2.fooG3(); } //end ns inclass_lambdas_within_nested_classes + +namespace lambda_in_default_mem_init { + template void f() { + struct S { int n = []{ return 0; }(); }; + } + template void f(); +} -- 2.7.4