Sorry for the delay. Attaching the new version.
Vassil
On 14/11/14 02:47, Richard Smith wrote:
+    }
+ else { // FPT->getExceptionSpecType() is resolved and the other is not

You're not checking for this condition; the code here is getting run even if both or neither are unresolved.

The patch needs rebasing (we have a new helper function in ASTContext to update the exception specification of a declaration), but looks like the right direction.

On Thu, Nov 6, 2014 at 4:23 AM, Vassil Vassilev <[email protected] <mailto:[email protected]>> wrote:

    Hi Richard,
      I am attaching the patch we discussed at the dev meeting. Still
    haven't found small reproducer...
      The issue appears to stem from the fact that module A contains
    only a forward declaration of a function and it exception spec
    cannot be computed. In module B is the definition with computed
    exception spec, which gets deserialized after the one in module A.
    This patch teaches the ASTDeclReader to update all the exception
    specs of the previous decls to the current one.

      Could you review, please?
    Many thanks,
    Vassil


commit b7209a33ece8c5f426a41d9f2f92c7caa9bba0ae
Author: Vassil Vassilev <[email protected]>
Date:   Mon Nov 24 19:58:23 2014 +0100

    [modules] Update exception specs of the redecl chain when deserializing a 
module.
    
    The issue appears to stem from the fact that module A contains only a 
forward
    declaration of a function and it exception spec cannot be computed. In 
module B
    is the definition with computed exception spec, which gets deserialized 
after
    the one in module A. This patch teaches the ASTDeclReader to update all the
    exception specs of the previous decls to the current one.
    
    Test case: still didn't manage to reduce it to something that makes sense.

Index: lib/Serialization/ASTReaderDecl.cpp
===================================================================
--- lib/Serialization/ASTReaderDecl.cpp
+++ lib/Serialization/ASTReaderDecl.cpp
@@ -2779,11 +2779,22 @@ void ASTDeclReader::attachPreviousDeclImpl(ASTReader 
&Reader,
   // specification now.
   auto *FPT = FD->getType()->getAs<FunctionProtoType>();
   auto *PrevFPT = PrevFD->getType()->getAs<FunctionProtoType>();
-  if (FPT && PrevFPT &&
-      isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) &&
-      !isUnresolvedExceptionSpec(PrevFPT->getExceptionSpecType())) {
-    Reader.Context.adjustExceptionSpec(
+  if (FPT && PrevFPT) {
+    if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) &&
+        !isUnresolvedExceptionSpec(PrevFPT->getExceptionSpecType())) {
+      Reader.Context.adjustExceptionSpec(
         FD, PrevFPT->getExtProtoInfo().ExceptionSpec);
+    }
+    else if (!isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) &&
+             isUnresolvedExceptionSpec(PrevFPT->getExceptionSpecType())) {
+      // Happens in cases where module A contains only a fwd decl and module B
+      // contains the definition.
+      FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
+      while (PrevFD) {
+        Reader.Context.adjustExceptionSpec(PrevFD, EPI.ExceptionSpec);
+        PrevFD = PrevFD->getPreviousDecl();
+      }
+    }
   }
 }
 }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to