diff --git a/clang/docs/DiagnosticsReference.rst b/clang/docs/DiagnosticsReference.rst --- a/clang/docs/DiagnosticsReference.rst +++ b/clang/docs/DiagnosticsReference.rst @@ -14014,6 +14014,6 @@ --------------------- **Diagnostic text:** -+----------------------------------------------------------------------------------------------------------------+ -|:warning:`warning:` |nbsp| :diagtext:`dynamic exception specifications with types are currently ignored in wasm`| -+----------------------------------------------------------------------------------------------------------------+ ++-----------------------------------------------------------------------------------------------------------------------------------+ +|:warning:`warning:` |nbsp| :diagtext:`dynamic exception specifications with types are currently ignored in wasm exception handling`| ++-----------------------------------------------------------------------------------------------------------------------------------+ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1591,8 +1591,8 @@ def err_exception_spec_incomplete_type : Error< "exception specification needed for member of incomplete class %0">; def warn_wasm_dynamic_exception_spec_ignored : ExtWarn< - "dynamic exception specifications with types are currently ignored in wasm">, - InGroup; + "dynamic exception specifications with types are currently ignored in wasm " + "exception handling">, InGroup; // C++ access checking def err_class_redeclared_with_different_access : Error< diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -472,7 +472,7 @@ // In wasm we currently treat 'throw()' in the same way as 'noexcept'. In // case of throw with types, we ignore it and print a warning for now. // TODO Correctly handle exception specification in wasm - if (getTarget().getCXXABI() == TargetCXXABI::WebAssembly) { + if (CGM.getLangOpts().WasmExceptions) { if (EST == EST_DynamicNone) EHStack.pushTerminate(); else @@ -560,7 +560,7 @@ // In wasm we currently treat 'throw()' in the same way as 'noexcept'. In // case of throw with types, we ignore it and print a warning for now. // TODO Correctly handle exception specification in wasm - if (getTarget().getCXXABI() == TargetCXXABI::WebAssembly) { + if (CGM.getLangOpts().WasmExceptions) { if (EST == EST_DynamicNone) EHStack.popTerminate(); return; diff --git a/clang/test/CodeGenCXX/wasm-eh.cpp b/clang/test/CodeGenCXX/wasm-eh.cpp --- a/clang/test/CodeGenCXX/wasm-eh.cpp +++ b/clang/test/CodeGenCXX/wasm-eh.cpp @@ -393,17 +393,18 @@ // RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=WARNING-DEFAULT // RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -Wwasm-exception-spec -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=WARNING-ON // RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -Wno-wasm-exception-spec -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=WARNING-OFF +// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fexceptions -fcxx-exceptions -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=NOT-WASM-EH -// Wasm ignores dynamic exception specifications with types at the moment. This -// is controlled by -Wwasm-exception-spec, which is on by default. This warning -// can be suppressed with -Wno-wasm-exception-spec. -// Checks if a warning message is correctly printed or not printed depending on -// the options. +// Wasm EH ignores dynamic exception specifications with types at the moment. +// This is controlled by -Wwasm-exception-spec, which is on by default. This +// warning can be suppressed with -Wno-wasm-exception-spec. Checks if a warning +// message is correctly printed or not printed depending on the options. void test9() throw(int) { } -// WARNING-DEFAULT: warning: dynamic exception specifications with types are currently ignored in wasm -// WARNING-ON: warning: dynamic exception specifications with types are currently ignored in wasm -// WARNING-OFF-NOT: warning: dynamic exception specifications with types are currently ignored in wasm +// WARNING-DEFAULT: warning: dynamic exception specifications with types are currently ignored in wasm exception handling +// WARNING-ON: warning: dynamic exception specifications with types are currently ignored in wasm exception handling +// WARNING-OFF-NOT: warning: dynamic exception specifications with types are currently ignored in wasm exception handling +// NOT-WASM-EH-NOT: warning: dynamic exception specifications with types are currently ignored in wasm exception handling // Wasm curremtly treats 'throw()' in the same way as 'noexept'. Check if the // same warning message is printed as if when a 'noexcept' function throws.