From: Faisal Vali Date: Sun, 29 Sep 2013 20:27:06 +0000 (+0000) Subject: Revert the linkage fix. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c6867ddf541925c4dede00295fa2d06e8a39e89c;p=clang Revert the linkage fix. I got a bunch of buildbot failures that i don't understand - sorry. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191647 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index a2bb440dbe..57bf94c0f0 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1004,8 +1004,10 @@ static LinkageInfo getLVForClosure(const DeclContext *DC, Decl *ContextDecl, else return getLVForDecl(cast(ContextDecl), computation); } + if (const NamedDecl *ND = dyn_cast(DC)) return getLVForDecl(ND, computation); + return LinkageInfo::external(); } @@ -1090,19 +1092,6 @@ static LinkageInfo getLVForLocalDecl(const NamedDecl *D, LV.isVisibilityExplicit()); } -static inline const CXXRecordDecl* -getOutermostEnclosingLambda(const CXXRecordDecl *Record) { - const CXXRecordDecl *Ret = Record; - while (Record && Record->isLambda()) { - Ret = Record; - if (!Record->getParent()) break; - // Get the Containing Class of this Lambda Class - Record = dyn_cast_or_null( - Record->getParent()->getParent()); - } - return Ret; -} - static LinkageInfo computeLVForDecl(const NamedDecl *D, LVComputationKind computation) { // Objective-C: treat all Objective-C declarations as having external @@ -1133,24 +1122,9 @@ static LinkageInfo computeLVForDecl(const NamedDecl *D, return LinkageInfo::internal(); } - // This lambda has its linkage/visibility determined: - // - either by the outermost lambda if that lambda has no mangling - // number. - // - or by the parent of the outer most lambda - // This prevents infinite recursion in settings such as nested lambdas - // used in NSDMI's, for e.g. - // struct L { - // int t{}; - // int t2 = ([](int a) { return [](int b) { return b; };})(t)(t); - // }; - const CXXRecordDecl *OuterMostLambda = - getOutermostEnclosingLambda(Record); - if (!OuterMostLambda->getLambdaManglingNumber()) - return LinkageInfo::internal(); - - return getLVForClosure( - OuterMostLambda->getDeclContext()->getRedeclContext(), - OuterMostLambda->getLambdaContextDecl(), computation); + // This lambda has its linkage/visibility determined by its owner. + return getLVForClosure(D->getDeclContext()->getRedeclContext(), + Record->getLambdaContextDecl(), computation); } break; diff --git a/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp b/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp deleted file mode 100644 index d763d417a3..0000000000 --- a/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s - -// CHECK-LABEL: define void @_ZN19non_inline_function3fooEv() -// CHECK-LABEL: define internal void @"_ZZN19non_inline_function3fooEvENK3$_0clEi" -// CHECK-LABEL: define internal signext i8 @"_ZZZN19non_inline_function3fooEvENK3$_0clEiENKUlcE_clEc" -namespace non_inline_function { -void foo() { - auto L = [](int a) { - return [](char b) { - return b; - }; - }; - L(3)('a'); -} -} -// CHECK-LABEL: define linkonce_odr i32 @_ZN15inline_function3fooEv -// CHECK-LABEL: define linkonce_odr void @_ZZN15inline_function3fooEvENKUliE_clEi -// CHECK-LABEL: define linkonce_odr signext i8 @_ZZZN15inline_function3fooEvENKUliE_clEiENKUlcE_clEc -namespace inline_function { -inline int foo() { - auto L = [](int a) { - return [](char b) { - return b; - }; - }; - L(3)('a'); -} -int use = foo(); -} - -// CHECK-LABEL: define linkonce_odr void @_ZN12non_template1LC1Ev -// CHECK-LABEL: define linkonce_odr void @_ZNK12non_template1L1tMUliE_clEi(%class.anon -// CHECK-LABEL: define linkonce_odr i32 @_ZZNK12non_template1L1tMUliE_clEiENKUliE_clEi(%class.anon -namespace non_template { - struct L { - int t = ([](int a) { return [](int b) { return b; };})(2)(3); - }; - L l; -} - -// CHECK-LABEL: define linkonce_odr void @_ZN32lambdas_in_NSDMIs_template_class1LIiEC2Ev -// CHECK-LABEL: define linkonce_odr void @_ZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEi(%class.anon -// CHECK-LABEL: linkonce_odr i32 @_ZZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEiENKUliE_clEi(%class.anon -namespace lambdas_in_NSDMIs_template_class { -template -struct L { - T t2 = ([](int a) { return [](int b) { return b; };})(T{})(T{}); -}; -L l; -} - - - diff --git a/test/SemaCXX/lambda-expressions.cpp b/test/SemaCXX/lambda-expressions.cpp index e2904247c4..e8e2eb612a 100644 --- a/test/SemaCXX/lambda-expressions.cpp +++ b/test/SemaCXX/lambda-expressions.cpp @@ -265,21 +265,3 @@ namespace TypeDeduction { #endif } } - - -namespace lambdas_in_NSDMIs { - template - struct L { - T t{}; - T t2 = ([](int a) { return [](int b) { return b; };})(t)(t); - }; - L l; - - namespace non_template { - struct L { - int t = 0; - int t2 = ([](int a) { return [](int b) { return b; };})(t)(t); - }; - L l; - } -} \ No newline at end of file