Hi Kim,

Thanks for your report!

My GCC 4.9.3 is *not* able to reproduce the issue with reduced testcase[1]

But it is able to reproduce the issue by compiling LLVM with GCC toolchain[2]


In file included from /home/loongson/llvm/lib/Support/JSON.cpp:10:0:
/home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = bool]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:393:23:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     return *reinterpret_cast<T *>(Union.buffer);
                                               ^
/home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = double]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:398:25:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = long int]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:400:26:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = std::basic_string<char>]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:418:46:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = llvm::StringRef]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:420:34:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = llvm::json::Object]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:424:62:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = llvm::json::Array]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:430:60:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
In file included from /home/loongson/llvm/lib/TableGen/JSONBackend.cpp:20:0:
/home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = bool]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:393:23:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     return *reinterpret_cast<T *>(Union.buffer);
                                               ^
/home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = double]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:398:25:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = long int]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:400:26:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = std::basic_string<char>]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:418:46:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = llvm::StringRef]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:420:34:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = llvm::json::Object]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:424:62:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] /home/loongson/llvm/include/llvm/Support/JSON.h: In instantiation of ‘T& llvm::json::Value::as() const [with T = llvm::json::Array]’:
/home/loongson/llvm/include/llvm/Support/JSON.h:430:60:   required from here
/home/loongson/llvm/include/llvm/Support/JSON.h:455:47: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]


Hi GCC developers,

Thanks for your patch to gcc-7-branch!

Could you test to compile LLVM with GCC old versions 4/5/6? Does it need to backport your patch to GCC old version?


1.
$ cat punning.cpp
template<unsigned _Len, unsigned _Align>
struct aligned_storage
{
  union type
    {
      unsigned char __data[_Len];
      struct __attribute__((__aligned__((_Align)))) { } __align;
    };
};

aligned_storage<sizeof(int), alignof(int)>::type storage;

int main()
{
  *reinterpret_cast<int*>(&storage) = 42;
}

2.
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/mips64el-redhat-linux/4.9.3/lto-wrapper
Target: mips64el-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-arch=loongson3a --enable-languages=c,c++,objc,obj-c++,fortran,go,lto --enable-plugin --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.9.3/obj-mips64el-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.9.3/obj-mips64el-redhat-linux/cloog-install --enable-gnu-indirect-function --with-long-double-128 --build=mips64el-redhat-linux
Thread model: posix
gcc version 4.9.3 20150626 (Red Hat 4.9.3-8) (GCC)


在 2018年08月09日 04:31, Kim Gräsman via llvm-dev 写道:
Hello,

For the IWYU project, we have a buildbot on Ubuntu 16.04 and its
bundled GCC (which I think is some GCC 5 variant).

We're getting a number of -Wstrict-aliasing warnings from JSON.h on this line:
https://github.com/llvm-mirror/llvm/blob/master/include/llvm/Support/JSON.h#L455

I'm not sure if GCC has a point here but GCC 7.2 does not complain, so
I'm going to guess no.

Would you consider patches to disable -Wstrict-aliasing wholesale for
GCC 5 and older?
But it is *no* warning when bootstrap with LLVM toolchain, and Sam should test it before code review https://reviews.llvm.org/D45753


- Kim
_______________________________________________
LLVM Developers mailing list
llvm-...@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

--
Regards,
Leslie Zhai


Reply via email to