]> granicus.if.org Git - clang/commitdiff
Emulate (some of) Microsoft's looser semantic checking of exception
authorDouglas Gregor <dgregor@apple.com>
Mon, 30 Aug 2010 15:04:51 +0000 (15:04 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 30 Aug 2010 15:04:51 +0000 (15:04 +0000)
specifications, from Martin Vejnar!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112482 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExceptionSpec.cpp
test/SemaCXX/MicrosoftExtensions.cpp
test/SemaCXX/exception-spec.cpp

index 101d7417249a10bea75bce605c8256b9dfcbe91b..c902e7787096d488a5805243ae93736f2a32a393 100644 (file)
@@ -261,6 +261,14 @@ bool Sema::CheckEquivalentExceptionSpec(const PartialDiagnostic &DiagID,
 
   bool OldAny = !Old->hasExceptionSpec() || Old->hasAnyExceptionSpec();
   bool NewAny = !New->hasExceptionSpec() || New->hasAnyExceptionSpec();
+  if (getLangOptions().Microsoft) {
+    // Treat throw(whatever) as throw(...) to be compatible with MS headers.
+    if (New->hasExceptionSpec() && New->getNumExceptions() > 0)
+      NewAny = true;
+    if (Old->hasExceptionSpec() && Old->getNumExceptions() > 0)
+      OldAny = true;
+  }
+
   if (OldAny && NewAny)
     return false;
   if (OldAny || NewAny) {
index c143e59fb3ec4aa2710bf0bd5438f8200fdca83b..48d41941970e4cccc5a70d07eb17063d7754e986 100644 (file)
@@ -1,7 +1,31 @@
-// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-extensions
+// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-extensions -fexceptions
 
 
 // ::type_info is predeclared with forward class declartion
 void f(const type_info &a);
 
+// The following three are all equivalent when ms-extensions are on
+void foo() throw(int);
+void foo() throw(int, long);
+void foo() throw(...); 
+void foo(); // expected-note {{previous declaration}}
 
+// Only nothrow specification is treated specially.
+void foo() throw(); // expected-error {{exception specification in declaration does not match previous declaration}}
+
+// throw(...)
+void r3();
+void r3() throw(...);
+
+void r6() throw(...);
+void r6() throw(int); // okay
+
+struct Base {
+  virtual void f2();
+  virtual void f3() throw(...);
+};
+
+struct Derived : Base {
+  virtual void f2() throw(...);
+  virtual void f3();
+};
index 498611ee8599398dfd43560948181486eacaa54a..b4bc78aa9a6d3ec57463dea3a32330fe02afa5ac 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -fexceptions -fms-extensions %s
+// RUN: %clang_cc1 -fsyntax-only -verify -fexceptions %s
 
 // Straight from the standard:
 // Plain function with spec
@@ -43,18 +43,12 @@ void r2() throw(int);
 void r2() throw(INT);
 
 // throw-any spec and no spec at all are semantically equivalent
-void r3();
-void r3() throw(...);
-
 void r4() throw(int, float);
 void r4() throw(float, int);
 
 void r5() throw(int); // expected-note {{previous declaration}}
 void r5(); // expected-warning {{missing exception specification}}
 
-void r6() throw(...); // expected-note {{previous declaration}}
-void r6() throw(int); // expected-error {{exception specification in declaration does not match}}
-
 void r7() throw(int); // expected-note {{previous declaration}}
 void r7() throw(float); // expected-error {{exception specification in declaration does not match}}
 
@@ -89,8 +83,6 @@ struct P : private A
 struct Base
 {
   virtual void f1() throw();
-  virtual void f2();
-  virtual void f3() throw(...);
   virtual void f4() throw(int, float);
 
   virtual void f5() throw(int, float);
@@ -107,8 +99,6 @@ struct Base
 struct Derived : Base
 {
   virtual void f1() throw();
-  virtual void f2() throw(...);
-  virtual void f3();
   virtual void f4() throw(float, int);
 
   virtual void f5() throw(float);