zequanwu created this revision.
zequanwu added a reviewer: hans.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
zequanwu requested review of this revision.
Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D86369

Files:
  clang/include/clang/Basic/DiagnosticSemaKinds.td
  clang/lib/Sema/SemaCast.cpp
  clang/test/SemaCXX/ms_dynamic_cast.cpp


Index: clang/test/SemaCXX/ms_dynamic_cast.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/ms_dynamic_cast.cpp
@@ -0,0 +1,17 @@
+// RUN:  %clang_cc1 %s -fno-rtti-data -fsyntax-only -verify
+
+class B {
+public:
+    virtual ~B() = default;
+};
+
+class D1 : public B {
+public:
+    ~D1() = default;
+
+};
+
+void  f() {
+    B *b = new D1();
+    auto d = dynamic_cast<D1 *>(b); // expected-warning{{should not use 
dynamic_cast with /GR-}}
+}
\ No newline at end of file
Index: clang/lib/Sema/SemaCast.cpp
===================================================================
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -890,6 +890,11 @@
     return;
   }
 
+  // MSVC warns when dynamic_cast is used with /GR-.
+  if (!Self.getLangOpts().RTTIData) {
+    Self.Diag(OpRange.getBegin(), diag::warn_no_dynamic_cast_with_no_GR);
+  }
+
   // Done. Everything else is run-time checks.
   Kind = CK_Dynamic;
 }
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -7433,6 +7433,8 @@
   "use of typeid requires -frtti">;
 def err_no_dynamic_cast_with_fno_rtti : Error<
   "use of dynamic_cast requires -frtti">;
+def warn_no_dynamic_cast_with_no_GR: Warning<
+  "should not use dynamic_cast with /GR-">;
 
 def err_cannot_form_pointer_to_member_of_reference_type : Error<
   "cannot form a pointer-to-member to member %0 of reference type %1">;


Index: clang/test/SemaCXX/ms_dynamic_cast.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/ms_dynamic_cast.cpp
@@ -0,0 +1,17 @@
+// RUN:  %clang_cc1 %s -fno-rtti-data -fsyntax-only -verify
+
+class B {
+public:
+    virtual ~B() = default;
+};
+
+class D1 : public B {
+public:
+    ~D1() = default;
+
+};
+
+void  f() {
+    B *b = new D1();
+    auto d = dynamic_cast<D1 *>(b); // expected-warning{{should not use dynamic_cast with /GR-}}
+}
\ No newline at end of file
Index: clang/lib/Sema/SemaCast.cpp
===================================================================
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -890,6 +890,11 @@
     return;
   }
 
+  // MSVC warns when dynamic_cast is used with /GR-.
+  if (!Self.getLangOpts().RTTIData) {
+    Self.Diag(OpRange.getBegin(), diag::warn_no_dynamic_cast_with_no_GR);
+  }
+
   // Done. Everything else is run-time checks.
   Kind = CK_Dynamic;
 }
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -7433,6 +7433,8 @@
   "use of typeid requires -frtti">;
 def err_no_dynamic_cast_with_fno_rtti : Error<
   "use of dynamic_cast requires -frtti">;
+def warn_no_dynamic_cast_with_no_GR: Warning<
+  "should not use dynamic_cast with /GR-">;
 
 def err_cannot_form_pointer_to_member_of_reference_type : Error<
   "cannot form a pointer-to-member to member %0 of reference type %1">;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to