Index: lib/Sema/SemaExceptionSpec.cpp =================================================================== --- lib/Sema/SemaExceptionSpec.cpp +++ lib/Sema/SemaExceptionSpec.cpp @@ -254,10 +254,10 @@ // 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())) && - Old->isExternC()) { + FunctionDecl *First = Old->getFirstDecl(); + if (MissingEmptyExceptionSpecification && NewProto && First->isExternC() && + (First->getLocation().isInvalid() || + Context.getSourceManager().isInSystemHeader(First->getLocation()))) { New->setType(Context.getFunctionType( NewProto->getReturnType(), NewProto->getParamTypes(), NewProto->getExtProtoInfo().withExceptionSpec(EST_DynamicNone))); 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; } }