Description
Bugzilla Link | 33222 |
Resolution | FIXED |
Resolved on | Jun 11, 2019 10:38 |
Version | trunk |
OS | Linux |
Blocks | #38454 |
Attachments | Preprocessed source code, Full compilation error output |
Reporter | LLVM Bugzilla Contributor |
CC | @Nedra1998,@davidbolvansky,@drrlvn,@Dushistov,@egorpugin,@gemorin,@zmodem,@mizvekov,@zygoloid,@Tilka,@tstellar,@SuperV1234,@fiesh,@jwakely |
Fixed by commit(s) | r341775 r341778 r345409 r345412 |
Extended Description
Simple std::variant code, compilation fails at line caling std::visit both with clang-4.0 and trunk. With GCC-7.1 compiles fine.
// CODE:
#include
struct A {};
struct B {};
struct Visitor
{
auto operator ()(A) -> void {}
auto operator ()(B) -> void {}
};
auto main() -> int
{
auto variant = std::variant<A, B>{ A{} };
visit(Visitor{}, variant);
}
// COMPILATION OUTPUT (STRIPPED):
$ clang++ -std=c++1z variant.cpp
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/variant:235:46: error: cannot cast 'std::variant<A, B>' to its private base class 'std::__detail::__variant::_Variant_storage<true, A, B>'
return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u);
// MY THOUGHTS:
std::variant contains friend declaration in its body:
https://github.com/gcc-mirror/gcc/blob/gcc-7_1_0-release/libstdc%2B%2B-v3/include/std/variant#L1154
for some reason it is ignored when compiling std::__detail::__variant::_get
https://github.com/gcc-mirror/gcc/blob/gcc-7_1_0-release/libstdc%2B%2B-v3/include/std/variant#L232
I'm not sure whether it's clang or libstdc++ bug
// SOFTWARE VERSIONS:
$ clang -v
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/7.1.1
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/7.1.1
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1
Candidate multilib: .;@m64
Selected multilib: .;@m64
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 7.1.1 20170516 (GCC)