diff options
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 36 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp | 53 | ||||
| -rw-r--r-- | clang/test/SemaCXX/lambda-expressions.cpp | 18 | 
3 files changed, 5 insertions, 102 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index a2bb440dbe7..57bf94c0f0b 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1004,8 +1004,10 @@ static LinkageInfo getLVForClosure(const DeclContext *DC, Decl *ContextDecl,      else        return getLVForDecl(cast<NamedDecl>(ContextDecl), computation);    } +    if (const NamedDecl *ND = dyn_cast<NamedDecl>(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<CXXRecordDecl>( -      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/clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp b/clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp deleted file mode 100644 index d763d417a39..00000000000 --- a/clang/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<class T> -struct L { -    T t2 = ([](int a) { return [](int b) { return b; };})(T{})(T{});     -}; -L<int> l; -} - - - diff --git a/clang/test/SemaCXX/lambda-expressions.cpp b/clang/test/SemaCXX/lambda-expressions.cpp index e2904247c4b..e8e2eb612a0 100644 --- a/clang/test/SemaCXX/lambda-expressions.cpp +++ b/clang/test/SemaCXX/lambda-expressions.cpp @@ -265,21 +265,3 @@ namespace TypeDeduction {  #endif    }  } - - -namespace lambdas_in_NSDMIs { -  template<class T> -  struct L { -      T t{}; -      T t2 = ([](int a) { return [](int b) { return b; };})(t)(t);     -  }; -  L<int> 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  | 

