Author: faisalv
Date: Mon May  8 23:17:15 2017
New Revision: 302507

URL: http://llvm.org/viewvc/llvm-project?rev=302507&view=rev
Log:
Fix PR32638 : Make sure we switch Sema's CurContext to the substituted 
FunctionDecl when instantiating the exception specification.

This fixes the bug: https://bugs.llvm.org/show_bug.cgi?id=32638

  int main()
  {
    [](auto x) noexcept(noexcept(x)) { } (0);
  }

In the above code, prior to this patch, when substituting into the noexcept 
expression, i.e. transforming the DeclRefExpr that represents 'x' - clang 
attempts to capture 'x' because Sema's CurContext is still pointing to the 
pattern FunctionDecl (i.e. the templated-decl set in 
FinishTemplateArgumentDeduction) which does not match the substituted 'x's 
DeclContext, which leads to an attempt to capture and an assertion failure.  

We fix this by adjusting Sema's CurContext to point to the substituted 
FunctionDecl under which the noexcept specifier's argument should be 
transformed, and so the ParmVarDecl that 'x' refers to has the same declcontext 
and no capture is attempted. 

I briefly investigated whether the SwitchContext should occur right after 
VisitMethodDecl creates the new substituted FunctionDecl, instead of only 
during instantiating the exception specification - but seeing no other code 
that seemed to rely on that, I decided to leave it just for the duration of the 
exception specification instantiation.


Modified:
    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
    cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=302507&r1=302506&r2=302507&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Mon May  8 23:17:15 2017
@@ -3660,6 +3660,7 @@ TemplateDeclInstantiator::InitFunctionIn
       New->setType(SemaRef.Context.getFunctionType(
           NewProto->getReturnType(), NewProto->getParamTypes(), EPI));
     } else {
+      Sema::ContextRAII SwitchContext(SemaRef, New);
       SemaRef.SubstExceptionSpec(New, Proto, TemplateArgs);
     }
   }

Modified: cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp?rev=302507&r1=302506&r2=302507&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp Mon May  8 23:17:15 2017
@@ -986,3 +986,10 @@ class Enclosing3 {
   );
 };
 }
+
+namespace PR32638 {
+ //https://bugs.llvm.org/show_bug.cgi?id=32638
+ void test() {
+    [](auto x) noexcept(noexcept(x)) { } (0);
+ }
+}
\ No newline at end of file


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to