Skip to content

Compilation error for std::variant using GCC's 7.1 libstdc++ #32569

Closed
@llvmbot

Description

@llvmbot
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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillac++17

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions