[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