[PATCH] D18657: Propagate missing empty exception spec from function declared in system header

Denis Zobnin via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 31 10:32:47 PDT 2016


d.zobnin.bugzilla created this revision.
d.zobnin.bugzilla added reviewers: doug.gregor, rjmccall.
d.zobnin.bugzilla added a subscriber: cfe-commits.

If new function is missing empty exception specification "throw()" and "throw()" came from system header, don't emit errors. It is already implemented in Clang, but taking into account only last redeclaration of a function. Look for declaration in system header up to the first declaration in redeclaration chain, as GCC seems to do.

This patch enables compilation of Facebook/ds2 application.

http://reviews.llvm.org/D18657

Files:
  lib/Sema/SemaExceptionSpec.cpp
  test/SemaCXX/Inputs/malloc.h
  test/SemaCXX/builtin-exception-spec.cpp

Index: lib/Sema/SemaExceptionSpec.cpp
===================================================================
--- lib/Sema/SemaExceptionSpec.cpp
+++ lib/Sema/SemaExceptionSpec.cpp
@@ -254,9 +254,15 @@
   // to many libc functions as an optimization. Unfortunately, that
   // optimization isn't permitted by the C++ standard, so we're forced
   // to work around it here.
-  if (MissingEmptyExceptionSpecification && NewProto &&
-      (Old->getLocation().isInvalid() ||
-       Context.getSourceManager().isInSystemHeader(Old->getLocation())) &&
+  bool IsFromSystemHeader = false;
+  for (const FunctionDecl *Prev = Old; Prev; Prev = Prev->getPreviousDecl())
+    if (Prev->getLocation().isInvalid() ||
+        Context.getSourceManager().isInSystemHeader(Prev->getLocation())) {
+      IsFromSystemHeader = true;
+      break;
+    }
+
+  if (MissingEmptyExceptionSpecification && NewProto && IsFromSystemHeader &&
       Old->isExternC()) {
     New->setType(Context.getFunctionType(
         NewProto->getReturnType(), NewProto->getParamTypes(),
Index: test/SemaCXX/builtin-exception-spec.cpp
===================================================================
--- test/SemaCXX/builtin-exception-spec.cpp
+++ test/SemaCXX/builtin-exception-spec.cpp
@@ -4,4 +4,7 @@
 
 extern "C" {
 void *malloc(__SIZE_TYPE__);
+
+void MyFunc() __attribute__((__weak__));
+void MyFunc() { return; }
 }
Index: test/SemaCXX/Inputs/malloc.h
===================================================================
--- test/SemaCXX/Inputs/malloc.h
+++ test/SemaCXX/Inputs/malloc.h
@@ -1,3 +1,5 @@
 extern "C" {
 extern void *malloc (__SIZE_TYPE__ __size) throw () __attribute__ ((__malloc__)) ;
+
+void MyFunc() throw();
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18657.52231.patch
Type: text/x-patch
Size: 1699 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160331/b6ee3182/attachment.bin>


More information about the cfe-commits mailing list