AsmPrinter: Suppress warnings on GCC from r238362, NFC
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Thu, 28 May 2015 18:09:13 +0000 (18:09 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Thu, 28 May 2015 18:09:13 +0000 (18:09 +0000)
GCC seems to have some overzealous warnings about strict aliasing.
Rafael reports that this patch suppresses them on GCC 4.9, and I'm
hoping this will work for GCC 4.7 as well.  I'll watch [1] and iterate
if necessary.

[1]: http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/8597

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

include/llvm/CodeGen/DIE.h

index c843f3fd1a6249ca19c63d8afdf75d9ff56ff914..e247d46ba5b503900b974d71413423ccafe385bf 100644 (file)
@@ -340,11 +340,11 @@ private:
     new (reinterpret_cast<void *>(Val.buffer)) T(V);
   }
 
-  template <class T> T &get() { return *reinterpret_cast<T *>(Val.buffer); }
-  template <class T> const T &get() const {
-    return *reinterpret_cast<const T *>(Val.buffer);
+  template <class T> T *get() { return reinterpret_cast<T *>(Val.buffer); }
+  template <class T> const T *get() const {
+    return reinterpret_cast<const T *>(Val.buffer);
   }
-  template <class T> void destruct() { get<T>().~T(); }
+  template <class T> void destruct() { get<T>()->~T(); }
 
   /// Destroy the underlying value.
   ///
@@ -378,11 +378,11 @@ private:
       return;
 #define HANDLE_DIEVALUE_SMALL(T)                                               \
   case is##T:                                                                  \
-    construct<DIE##T>(X.get<DIE##T>());                                        \
+    construct<DIE##T>(*X.get<DIE##T>());                                       \
     return;
 #define HANDLE_DIEVALUE_LARGE(T)                                               \
   case is##T:                                                                  \
-    construct<const DIE##T *>(X.get<const DIE##T *>());                        \
+    construct<const DIE##T *>(*X.get<const DIE##T *>());                       \
     return;
 #include "llvm/CodeGen/DIEValue.def"
     }
@@ -425,12 +425,12 @@ public:
 #define HANDLE_DIEVALUE_SMALL(T)                                               \
   const DIE##T &getDIE##T() const {                                            \
     assert(getType() == is##T && "Expected " #T);                              \
-    return get<DIE##T>();                                                      \
+    return *get<DIE##T>();                                                     \
   }
 #define HANDLE_DIEVALUE_LARGE(T)                                               \
   const DIE##T &getDIE##T() const {                                            \
     assert(getType() == is##T && "Expected " #T);                              \
-    return *get<const DIE##T *>();                                             \
+    return **get<const DIE##T *>();                                            \
   }
 #include "llvm/CodeGen/DIEValue.def"