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/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(); } 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; } }