[libcxx] r179608 - addressof misbehaving for type with an implicit conversion operator to char&. This fixes http://llvm.org/bugs/show_bug.cgi?id=15754

Howard Hinnant hhinnant at apple.com
Tue Apr 16 10:27:57 PDT 2013


Author: hhinnant
Date: Tue Apr 16 12:27:56 2013
New Revision: 179608

URL: http://llvm.org/viewvc/llvm-project?rev=179608&view=rev
Log:
addressof misbehaving for type with an implicit conversion operator to char&.  This fixes http://llvm.org/bugs/show_bug.cgi?id=15754

Modified:
    libcxx/trunk/include/memory
    libcxx/trunk/test/utilities/memory/specialized.algorithms/specialized.addressof/addressof.pass.cpp

Modified: libcxx/trunk/include/memory
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/memory?rev=179608&r1=179607&r2=179608&view=diff
==============================================================================
--- libcxx/trunk/include/memory (original)
+++ libcxx/trunk/include/memory Tue Apr 16 12:27:56 2013
@@ -621,7 +621,7 @@ inline _LIBCPP_INLINE_VISIBILITY
 _Tp*
 addressof(_Tp& __x) _NOEXCEPT
 {
-    return (_Tp*)&(char&)__x;
+    return (_Tp*)&reinterpret_cast<const volatile char&>(__x);
 }
 
 #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF)

Modified: libcxx/trunk/test/utilities/memory/specialized.algorithms/specialized.addressof/addressof.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/memory/specialized.algorithms/specialized.addressof/addressof.pass.cpp?rev=179608&r1=179607&r2=179608&view=diff
==============================================================================
--- libcxx/trunk/test/utilities/memory/specialized.algorithms/specialized.addressof/addressof.pass.cpp (original)
+++ libcxx/trunk/test/utilities/memory/specialized.algorithms/specialized.addressof/addressof.pass.cpp Tue Apr 16 12:27:56 2013
@@ -19,8 +19,17 @@ struct A
     void operator&() const {}
 };
 
+struct nothing {
+    operator char&()
+    {
+        static char c;
+        return c;
+    }
+};
+
 int main()
 {
+    {
     int i;
     double d;
     assert(std::addressof(i) == &i);
@@ -30,4 +39,13 @@ int main()
     assert(std::addressof(*tp) == tp);
     assert(std::addressof(*ctp) == tp);
     delete tp;
+    }
+    {
+    union
+    {
+        nothing n;
+        int i;
+    };
+    assert(std::addressof(n) == (void*)std::addressof(i));
+    }
 }





More information about the cfe-commits mailing list