[llvm] r204659 - In Release modes, Visual Studio complains that the Operator destructor in User.cpp

Yaron Keren yaron.keren at gmail.com
Mon Mar 24 12:48:13 PDT 2014


Author: yrnkrn
Date: Mon Mar 24 14:48:13 2014
New Revision: 204659

URL: http://llvm.org/viewvc/llvm-project?rev=204659&view=rev
Log:
In Release modes, Visual Studio complains that the Operator destructor in User.cpp
never returns, which is true by design. 

Initially assumed that the reason is llvm_unreachable being dependent on NDEBUG.

However, even if llvm_unreachable is replaced by __assume(false), VC still warns in
Release modes but not in Debug modes...

The real reason turned out to be optimization flags.
With /Od in Debug modes the warning is not issued whereas with /O1 it is.

I could not find any documentation to this effect, but it is reproducable:

Try compiling http://msdn.microsoft.com/en-us/library/khwfyc5d(v=vs.90).aspx
with /O1 and then with /Od.



Modified:
    llvm/trunk/lib/IR/User.cpp

Modified: llvm/trunk/lib/IR/User.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/User.cpp?rev=204659&r1=204658&r2=204659&view=diff
==============================================================================
--- llvm/trunk/lib/IR/User.cpp (original)
+++ llvm/trunk/lib/IR/User.cpp Mon Mar 24 14:48:13 2014
@@ -83,8 +83,28 @@ void User::operator delete(void *Usr) {
 //                             Operator Class
 //===----------------------------------------------------------------------===//
 
+#if defined(_MSC_VER)
+// In Release modes, Visual Studio complains that the Operator destructor
+// never returns, which is true by design. 
+// This does *not* depend on llvm_unreachable being dependent on NDEBUG:
+// even if llvm_unreachable is replaced by __assume(false), VC still warns in
+// Release modes but not in Debug modes. The real reason is optimization flags.
+// With /Od in Debug modes the warning is not issued whereas with /O1 it is.
+// I could not find any documentation to this effect, it is reproducable:
+// Try compiling http://msdn.microsoft.com/en-us/library/khwfyc5d(v=vs.90).aspx
+// with /O1 and then with /Od.
+// Anyhow, solution is same as lib/Support/Process.cpp:~self_process().
+
+#pragma warning(push)
+#pragma warning(disable:4722)
+#endif
+
 Operator::~Operator() {
   llvm_unreachable("should never destroy an Operator");
 }
 
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
 } // End llvm namespace





More information about the llvm-commits mailing list