diff --git a/clang/lib/Sema/SemaExceptionSpec.cpp b/clang/lib/Sema/SemaExceptionSpec.cpp --- a/clang/lib/Sema/SemaExceptionSpec.cpp +++ b/clang/lib/Sema/SemaExceptionSpec.cpp @@ -149,7 +149,7 @@ // In Microsoft mode, downgrade this to a warning. unsigned DiagID = diag::err_incomplete_in_exception_spec; bool ReturnValueOnError = true; - if (getLangOpts().MicrosoftExt) { + if (getLangOpts().MSVCCompat) { DiagID = diag::ext_incomplete_in_exception_spec; ReturnValueOnError = false; } @@ -282,7 +282,7 @@ unsigned DiagID = diag::err_mismatched_exception_spec; bool ReturnValueOnError = true; - if (getLangOpts().MicrosoftExt) { + if (getLangOpts().MSVCCompat) { DiagID = diag::ext_mismatched_exception_spec; ReturnValueOnError = false; } @@ -371,7 +371,7 @@ NewProto->getExtProtoInfo().withExceptionSpec(ESI))); } - if (getLangOpts().MicrosoftExt && ESI.Type != EST_DependentNoexcept) { + if (getLangOpts().MSVCCompat && ESI.Type != EST_DependentNoexcept) { // Allow missing exception specifications in redeclarations as an extension. DiagID = diag::ext_ms_missing_exception_specification; ReturnValueOnError = false; @@ -473,14 +473,14 @@ return false; unsigned DiagID = diag::err_mismatched_exception_spec; - if (getLangOpts().MicrosoftExt) + if (getLangOpts().MSVCCompat) DiagID = diag::ext_mismatched_exception_spec; bool Result = CheckEquivalentExceptionSpecImpl( *this, PDiag(DiagID), PDiag(diag::note_previous_declaration), Old, OldLoc, New, NewLoc); // In Microsoft mode, mismatching exception specifications just cause a warning. - if (getLangOpts().MicrosoftExt) + if (getLangOpts().MSVCCompat) return false; return Result; } @@ -959,7 +959,7 @@ } unsigned DiagID = diag::err_override_exception_spec; - if (getLangOpts().MicrosoftExt) + if (getLangOpts().MSVCCompat) DiagID = diag::ext_override_exception_spec; return CheckExceptionSpecSubset(PDiag(DiagID), PDiag(diag::err_deep_exception_specs_differ), diff --git a/clang/test/CodeGenCXX/pr18661.cpp b/clang/test/CodeGenCXX/pr18661.cpp --- a/clang/test/CodeGenCXX/pr18661.cpp +++ b/clang/test/CodeGenCXX/pr18661.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -triple %itanium_abi_triple -fcxx-exceptions -fms-extensions -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -triple %itanium_abi_triple -fcxx-exceptions -fms-compatibility -emit-llvm -o - | FileCheck %s extern "C" { void f(); diff --git a/clang/test/SemaCXX/MicrosoftCompatibility.cpp b/clang/test/SemaCXX/MicrosoftCompatibility.cpp --- a/clang/test/SemaCXX/MicrosoftCompatibility.cpp +++ b/clang/test/SemaCXX/MicrosoftCompatibility.cpp @@ -322,3 +322,47 @@ void instantiate() { ConfuseLookup::m_val::ms_test = 1; } } + +// Microsoft doesn't validate exception specification. +namespace microsoft_exception_spec { + +void foo(); // expected-note {{previous declaration}} +void foo() throw(); // expected-warning {{exception specification in declaration does not match previous declaration}} + +void r6() throw(...); // expected-note {{previous declaration}} +void r6() throw(int); // expected-warning {{exception specification in declaration does not match previous declaration}} + +struct Base { + virtual void f2(); + virtual void f3() throw(...); +}; + +struct Derived : Base { + virtual void f2() throw(...); + virtual void f3(); +}; + +class A { + virtual ~A() throw(); +#if __cplusplus <= 199711L + // expected-note@-2 {{overridden virtual function is here}} +#endif +}; + +class B : public A { + virtual ~B(); +#if __cplusplus <= 199711L + // expected-warning@-2 {{exception specification of overriding function is more lax than base version}} +#endif +}; + +} + +namespace PR25265 { +struct S { + int fn() throw(); // expected-note {{previous declaration is here}} +}; + +int S::fn() { return 0; } // expected-warning {{is missing exception specification}} +} + diff --git a/clang/test/SemaCXX/MicrosoftExtensions.cpp b/clang/test/SemaCXX/MicrosoftExtensions.cpp --- a/clang/test/SemaCXX/MicrosoftExtensions.cpp +++ b/clang/test/SemaCXX/MicrosoftExtensions.cpp @@ -6,41 +6,6 @@ #if TEST1 -// Microsoft doesn't validate exception specification. -namespace microsoft_exception_spec { - -void foo(); // expected-note {{previous declaration}} -void foo() throw(); // expected-warning {{exception specification in declaration does not match previous declaration}} - -void r6() throw(...); // expected-note {{previous declaration}} -void r6() throw(int); // expected-warning {{exception specification in declaration does not match previous declaration}} - -struct Base { - virtual void f2(); - virtual void f3() throw(...); -}; - -struct Derived : Base { - virtual void f2() throw(...); - virtual void f3(); -}; - -class A { - virtual ~A() throw(); -#if __cplusplus <= 199711L - // expected-note@-2 {{overridden virtual function is here}} -#endif -}; - -class B : public A { - virtual ~B(); -#if __cplusplus <= 199711L - // expected-warning@-2 {{exception specification of overriding function is more lax than base version}} -#endif -}; - -} - // MSVC allows type definition in anonymous union and struct struct A { @@ -495,14 +460,6 @@ }; } -namespace PR25265 { -struct S { - int fn() throw(); // expected-note {{previous declaration is here}} -}; - -int S::fn() { return 0; } // expected-warning {{is missing exception specification}} -} - class PR34109_class { PR34109_class() {} virtual ~PR34109_class() {} diff --git a/clang/test/SemaCXX/ms-exception-spec.cpp b/clang/test/SemaCXX/ms-exception-spec.cpp --- a/clang/test/SemaCXX/ms-exception-spec.cpp +++ b/clang/test/SemaCXX/ms-exception-spec.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-extensions -fexceptions -fcxx-exceptions +// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-compatibility -fexceptions -fcxx-exceptions void f() throw(...) { }