[PATCH] D67590: Properly ignore mismatched exception specifiers in MSVC Compat mode.

Reid Kleckner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 17 13:27:59 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL372178: Ignore exception specifier mismatch when merging redeclarations (authored by rnk, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D67590?vs=220564&id=220565#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67590/new/

https://reviews.llvm.org/D67590

Files:
  cfe/trunk/lib/Sema/SemaDecl.cpp
  cfe/trunk/test/SemaCXX/ms-exception-spec.cpp


Index: cfe/trunk/test/SemaCXX/ms-exception-spec.cpp
===================================================================
--- cfe/trunk/test/SemaCXX/ms-exception-spec.cpp
+++ cfe/trunk/test/SemaCXX/ms-exception-spec.cpp
@@ -1,9 +1,36 @@
-// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-compatibility -fexceptions -fcxx-exceptions
+// RUN: %clang_cc1 -std=c++11 %s -fsyntax-only -verify -fms-compatibility -fexceptions -fcxx-exceptions
+// RUN: %clang_cc1 -std=c++17 %s -fsyntax-only -verify -fms-compatibility -fexceptions -fcxx-exceptions
 
+// FIXME: Should -fms-compatibility soften these errors into warnings to match
+// MSVC? In practice, MSVC never implemented dynamic exception specifiers, so
+// there isn't much Windows code in the wild that uses them.
+#if __cplusplus >= 201703L
+// expected-error at +3 {{ISO C++17 does not allow dynamic exception specifications}}
+// expected-note at +2 {{use 'noexcept(false)' instead}}
+#endif
 void f() throw(...) { }
 
 namespace PR28080 {
 struct S;           // expected-note {{forward declaration}}
+#if __cplusplus >= 201703L
+// expected-error at +3 {{ISO C++17 does not allow dynamic exception specifications}}
+// expected-note at +2 {{use 'noexcept(false)' instead}}
+#endif
 void fn() throw(S); // expected-warning {{incomplete type}} expected-note{{previous declaration}}
 void fn() throw();  // expected-warning {{does not match previous declaration}}
 }
+
+template <typename T> struct FooPtr {
+  template <typename U> FooPtr(U *p) : m_pT(nullptr) {}
+
+  template <>
+      // FIXME: It would be better if this note pointed at the primary template
+      // above.
+      // expected-note at +1 {{previous declaration is here}}
+  FooPtr(T *pInterface) throw() // expected-warning {{exception specification in declaration does not match previous declaration}}
+      : m_pT(pInterface) {}
+
+  T *m_pT;
+};
+struct Bar {};
+template struct FooPtr<Bar>; // expected-note {{requested here}}
Index: cfe/trunk/lib/Sema/SemaDecl.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp
+++ cfe/trunk/lib/Sema/SemaDecl.cpp
@@ -3562,7 +3562,12 @@
       }
     }
 
-    if (OldQTypeForComparison == NewQType)
+    // If the function types are compatible, merge the declarations. Ignore the
+    // exception specifier because it was already checked above in
+    // CheckEquivalentExceptionSpec, and we don't want follow-on diagnostics
+    // about incompatible types under -fms-compatibility.
+    if (Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
+                                                         NewQType))
       return MergeCompatibleFunctionDecls(New, Old, S, MergeTypeWithOld);
 
     // If the types are imprecise (due to dependent constructs in friends or


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67590.220565.patch
Type: text/x-patch
Size: 2794 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190917/34e863c8/attachment.bin>


More information about the llvm-commits mailing list