On 19/12/24 14:49 +0100, Giuseppe D'Angelo wrote:
diff --git a/libstdc++-v3/testsuite/23_containers/span/init_list_cons_neg.cc
b/libstdc++-v3/testsuite/23_containers/span/init_list_cons_neg.cc
new file mode 100644
index 00000000000..ef43541b769
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/span/init_list_cons_neg.cc
@@ -0,0 +1,31 @@
+// { dg-do run { target c++20 } }
+
+#include <span>
+#include <utility>
+#include <any>
+
+#include <testsuite_hooks.h>
+
+// Examples from P2447R4
+void one(std::pair<int, int>) {}
+void one(std::span<const int>) {}
+void two(std::span<const int, 2>) {}
+constexpr std::size_t three(std::span<void * const> v) { return v.size(); }
+constexpr std::size_t four(std::span<const std::any> v) { return v.size(); }
+
+int main()
+{
+ one({1, 2}); // { dg-error "call of overloaded" "should be ambiguous with the
one(std::pair) overload" { target c++26 } }
+ two({{1, 2}}); // { dg-error "would use explicit constructor" "should prefer the
initializer_list constructor, which is explicit" { target c++26 } }
+
+ void *array3[10];
+ std::any array4[10];
+
+#if __cpp_lib_span_initializer_list
+ static_assert(three({array3, 0}) == 2);
+ VERIFY(four({array4, array4 + 10}) == 2);
This runtime VERIFY assertion doesn't make sense because the file
doesn't compile at all in C++26 mode, it fails due to the errors
above.
+#else
+ static_assert(three({array3, 0}) == 0);
+ VERIFY(four({array4, array4 + 10}) == 10);
+#endif
+}
--
2.34.1
I'm seeing failures for this new test when compiled as C++26, e.g.
when using
GLIBCXX_TESTSUITE_STDS=20,23,26 make check
RUNTESTFLAGS="conformance.exp=23_containers/span/init_list_cons_neg.cc -a"
The results are:
PASS: 23_containers/span/init_list_cons_neg.cc -std=gnu++20 (test for excess
errors)
PASS: 23_containers/span/init_list_cons_neg.cc -std=gnu++20 execution test
PASS: 23_containers/span/init_list_cons_neg.cc -std=gnu++23 (test for excess
errors)
PASS: 23_containers/span/init_list_cons_neg.cc -std=gnu++23 execution test
PASS: 23_containers/span/init_list_cons_neg.cc -std=gnu++26 should be
ambiguous with the one(std::pair) overload (test for errors, line 18)
PASS: 23_containers/span/init_list_cons_neg.cc -std=gnu++26 should prefer the
initializer_list constructor, which is explicit (test for errors, line 19)
PASS: 23_containers/span/init_list_cons_neg.cc -std=gnu++26 (test for excess
errors)
UNRESOLVED: 23_containers/span/init_list_cons_neg.cc -std=gnu++26 compilation
failed to produce executable
The problem is that { dg-do run ... } means that dejagnu expects the
file to compile and run, but it fails to compile for C++26 so cannot
be run.
I think what's needed is:
// { dg-do run { target { c++20 && c++23_down } } }
// { dg-do compile { target c++26 } }
This makes it a compile+link+run test for C++20/23 but only a compile
test for C++26, so it won't complain about it being UNRESOLVED for the
run step.
To solve the problem of the VERIFY not being checked for C++26, let's
repalce std::any with a constexpr-compatible Any type and move the
arrays to namespace scope, like so:
// { dg-do run { target { c++20 && c++23_down } } }
// { dg-do compile { target c++26 } }
#include <span>
#include <utility>
#include <testsuite_hooks.h>
struct Any {
constexpr Any() { }
template<typename T> constexpr Any(T) { }
};
// Examples from P2447R4
void one(std::pair<int, int>) {}
void one(std::span<const int>) {}
void two(std::span<const int, 2>) {}
constexpr std::size_t three(std::span<void * const> v) { return v.size(); }
constexpr std::size_t four(std::span<const Any> v) { return v.size(); }
void *array3[10];
Any array4[10];
int main()
{
one({1, 2}); // { dg-error "call of overloaded" "should be ambiguous with the
one(std::pair) overload" { target c++26 } }
two({{1, 2}}); // { dg-error "would use explicit constructor" "should prefer the
initializer_list constructor, which is explicit" { target c++26 } }
#if __cpp_lib_span_initializer_list
static_assert(three({array3, 0}) == 2);
static_assert(four({array4, array4 + 10}) == 2);
#else
static_assert(three({array3, 0}) == 0);
static_assert(four({array4, array4 + 10}) == 10);
#endif
}
With this, I get seven PASS results for this test.