Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

If the contents of a nullptr_t are modified through type-punned union, conversions from that nullptr_t to bool don't behave the same as conversion from nullptr to bool #23833

Open Quuxplusone opened 9 years ago

Quuxplusone commented 9 years ago
Bugzilla Link PR23833
Status REOPENED
Importance P normal
Reported by Andrey V (andrey.vul@gmail.com)
Reported on 2015-06-12 13:39:11 -0700
Last modified on 2018-11-02 19:23:55 -0700
Version 3.6
Hardware PC Linux
CC dgregor@apple.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk
Fixed by commit(s) rL345562, rL346065
Attachments
Blocks
Blocked by
See also
According to [conv.ptr]/1, conversion from nullptr_t to bool is equivalent to
conversion from null pointer to bool.
The Standard does not specify whether conversion should happen from internal
state initialized at construction or from some pseudo-function `constexpr
nullpt_t::operator bool() const { return false; }`.

The test case uses a union to mutate the internals of a nullptr_t and then
checks if nullptr_t still converts correctly to bool, as if it were an
invariant of the type. In effect, the value of the nullptr_t need not be
accessed at cast since it's intended to decay to null pointer constant when
used as a prvalue.
But the value is accessed, causing the test case to fail.

### SOURCE: cat a.cc
#include <cassert>
union {
int x;
nullptr_t y;
} a = {37};

int main() {
assert(!static_cast<bool>(a.y));
}

## INVOCATION: clang++ -std=c++11 -v a.cc
clang version 3.6.1 (tags/RELEASE_361/final)
Target: powerpc64le-unknown-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/lib/gcc/powerpc64le-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/powerpc64le-linux-gnu/4.9.1
Selected GCC installation: /usr/lib/gcc/powerpc64le-linux-gnu/4.9
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/gsa/tlbgsa-h1/09/andreyv/clang/bin/clang-3.6" -cc1 -triple powerpc64le-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -main-file-name a.cc -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu ppc64le -target-abi elfv2 -v -dwarf-column-info -resource-dir /gsa/tlbgsa-h1/09/andreyv/clang/bin/../lib/clang/3.6.1 -internal-isystem /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../../include/c++/4.9 -internal-isystem /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../../include/powerpc64le-linux-gnu/c++/4.9 -internal-isystem /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../../include/powerpc64le-linux-gnu/c++/4.9 -internal-isystem /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../../include/c++/4.9/backward -internal-isystem /usr/local/include -internal-isystem /gsa/tlbgsa-h1/09/andreyv/clang/bin/../lib/clang/3.6.1/include -internal-externc-isystem /usr/include/powerpc64le-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /tmp -ferror-limit 19 -fmessage-length 129 -mstackrealign -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/a-98ec2a.o -x c++ a.cc
clang -cc1 version 3.6.1 based upon LLVM 3.6.1 default target powerpc64le-
unknown-linux-gnu
ignoring nonexistent directory "/include"
ignoring duplicate directory "/usr/lib/gcc/powerpc64le-linux-
gnu/4.9/../../../../include/powerpc64le-linux-gnu/c++/4.9"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../../include/c++/4.9
 /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../../include/powerpc64le-linux-gnu/c++/4.9
 /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../../include/c++/4.9/backward
 /usr/local/include
 /gsa/tlbgsa-h1/09/andreyv/clang/bin/../lib/clang/3.6.1/include
 /usr/include/powerpc64le-linux-gnu
 /usr/include
End of search list.
 "/usr/bin/ld" --eh-frame-hdr -m elf64lppc -dynamic-linker /lib64/ld64.so.2 -o a.out /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../powerpc64le-linux-gnu/crt1.o /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../powerpc64le-linux-gnu/crti.o /usr/lib/gcc/powerpc64le-linux-gnu/4.9/crtbegin.o -L/usr/lib/gcc/powerpc64le-linux-gnu/4.9 -L/usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../powerpc64le-linux-gnu -L/lib/powerpc64le-linux-gnu -L/lib/../lib64 -L/usr/lib/powerpc64le-linux-gnu -L/usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../.. -L/gsa/tlbgsa-h1/09/andreyv/clang/bin/../lib -L/lib -L/usr/lib /tmp/a-98ec2a.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/powerpc64le-linux-gnu/4.9/crtend.o /usr/lib/gcc/powerpc64le-linux-gnu/4.9/../../../powerpc64le-linux-gnu/crtn.o
Quuxplusone commented 6 years ago

Fixed in r345562.

Quuxplusone commented 6 years ago

Fix reverted in r346065 due to PR39528.