https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116440

            Bug ID: 116440
           Summary: [C++20] std::tuple<std::tuple<std::any>> does not
                    compile
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tianchengyu at tencent dot com
  Target Milestone: ---

The following code (minimized reproduction) does not compile since gcc 14
(tested on 14.1.0 and 14.2.0), also failed on trunk (as of 20240821).

template <typename T>
using TupleTuple = std::tuple<std::tuple<T>>; // can be replaced with
std::tuple<std::tuple<...>> in following code, just to make it shorter.

struct EmbedAny {
    std::any content;
};

// Does not compile: struct with only one std::any field
static_assert(std::is_copy_constructible<TupleTuple<EmbedAny>>::value);
// Does not compile: just std::any in nested std::tuple
static_assert(std::is_copy_constructible<TupleTuple<std::any>>::value);

However, if we add anything before the std::any field, it compiles fine (even a
zero-sized array!):

struct EmbedAnyWithZeroSizeArray {
    void* pad[0];  // or, e.g. int pad; would also compile
    std::any content;
};

// Compiles: add a zero-sized (or any size) field **before** std::any field.
Adding the field after std::any does not work.
static_assert(std::is_copy_constructible<TupleTuple<EmbedAnyWithZeroSizeArray>>::value);

This only fails on gcc 14+ with -std=c++20 or higher. On older gcc versions
with -std=c++20 or gcc 14+ with -std=c++17 it compiles fine.

I also observed that clang trunk failed to compile with similar errors, but
clang 18 works fine, too.

Godbolt sample: https://godbolt.org/z/Gds4ar716

Reply via email to