[clang] ea4fd66 - [clang] fix crash on generic lambda with lambda in decltype

via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 20 01:30:43 PST 2023


Author: v1nh1shungry
Date: 2023-01-20T17:11:07+08:00
New Revision: ea4fd668c2cd88d13b36a5d64e3dedb1106340bc

URL: https://github.com/llvm/llvm-project/commit/ea4fd668c2cd88d13b36a5d64e3dedb1106340bc
DIFF: https://github.com/llvm/llvm-project/commit/ea4fd668c2cd88d13b36a5d64e3dedb1106340bc.diff

LOG: [clang] fix crash on generic lambda with lambda in decltype

Relevant issue: https://github.com/llvm/llvm-project/issues/59771

During the instantiation of a generic lambda, a non-generic lambda in
the trailing `decltype` is a `DeclContext` but not a dependent context,
so we shouldn't call `PerformDependentDiagnostics` on it.

Differential Revision: https://reviews.llvm.org/D140838

Added: 
    

Modified: 
    clang/lib/Sema/SemaTemplateInstantiate.cpp
    clang/test/SemaCXX/lambda-unevaluated.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp
index 89502937cc30b..2790e78aa53a3 100644
--- a/clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -1231,7 +1231,7 @@ namespace {
 
       // We recreated a local declaration, but not by instantiating it. There
       // may be pending dependent diagnostics to produce.
-      if (auto *DC = dyn_cast<DeclContext>(Old))
+      if (auto *DC = dyn_cast<DeclContext>(Old); DC && DC->isDependentContext())
         SemaRef.PerformDependentDiagnostics(DC, TemplateArgs);
     }
 

diff  --git a/clang/test/SemaCXX/lambda-unevaluated.cpp b/clang/test/SemaCXX/lambda-unevaluated.cpp
index 6d8c3b88c2eaf..da00cb48a87fd 100644
--- a/clang/test/SemaCXX/lambda-unevaluated.cpp
+++ b/clang/test/SemaCXX/lambda-unevaluated.cpp
@@ -142,3 +142,7 @@ using c = decltype([]() static noexcept(noexcept([] { return 0; }())) { return 0
 using d = decltype(sizeof([] static { return 0; }));
 
 }
+
+namespace lambda_in_trailing_decltype {
+auto x = ([](auto) -> decltype([] {}()) {}(0), 2);
+}


        


More information about the cfe-commits mailing list