Hi!
These two tests behave differently when using in-tree testing vs.
out-of-tree testing.
In the former case, libstdc++-v3/scripts/testsuite_flags uses
-nostdinc++ -I.../libstdc++-v3/include/x86_64-pc-linux-gnu etc.,
so the libstdc++ headers aren't considered system headers, while
with out-of-tree testing they are.
And the aka printing uses user_facing_original_type_p which depends on
/* Look through any typedef in "user" code. */
if (!DECL_IN_SYSTEM_HEADER (decl) && !DECL_IS_UNDECLARED_BUILTIN (decl))
return true;
and so behaves differently (and arguably in this case the non-system headers
output is nicer).
Anyway, the following patch adjusts the tests so that they accept both
forms.
Tested on x86_64-linux in-tree and Torbjorn has tested it in arm-none-eabi
out-of-tree testing. Ok for trunk?
2026-03-25 Jakub Jelinek <[email protected]>
PR testsuite/124621
* g++.dg/reflect/reflect_constant_array2.C: Allow different aka
argument in diagnostics for in-tree vs. out-of-tree testing.
* g++.dg/reflect/reflect_constant_string2.C: Likewise.
--- gcc/testsuite/g++.dg/reflect/reflect_constant_array2.C.jj 2026-01-15
16:33:47.014097840 +0100
+++ gcc/testsuite/g++.dg/reflect/reflect_constant_array2.C 2026-03-25
11:27:34.568796335 +0100
@@ -10,8 +10,8 @@ using namespace std::meta;
struct A { int a, b; mutable int c; };
constexpr auto a = reflect_constant_array (std::vector <A> { A { 1, 2, 3 } });
-// { dg-error "'reflect_constant_array' argument with
'std::ranges::range_value_t<std::vector<A> >' \\\{aka 'A'\\\} which is not a
structural type" "" { target *-*-* } .-1 }
+// { dg-error "'reflect_constant_array' argument with
'std::ranges::range_value_t<std::vector<A> >' \\\{aka
'(A|std::iter_value_t<__gnu_cxx::__normal_iterator<A\\\*, std::vector<A> >
>)'\\\} which is not a structural type" "" { target *-*-* } .-1 }
struct B { constexpr B (int x, int y) : a (x), b (y) {} constexpr ~B () {} B
(const B &) = delete; int a, b; };
constexpr B b[2] = { { 1, 2 }, { 2, 3 } };
constexpr auto c = reflect_constant_array (b);
-// { dg-error "'reflect_constant_array' argument with
'std::ranges::range_value_t<const B \\\[2\\\]>' \\\{aka 'B'\\\} which is not
copy constructible" "" { target *-*-* } .-1 }
+// { dg-error "'reflect_constant_array' argument with
'std::ranges::range_value_t<const B \\\[2\\\]>' \\\{aka
'(B|std::iter_value_t<const B\\\*>)'\\\} which is not copy constructible" "" {
target *-*-* } .-1 }
--- gcc/testsuite/g++.dg/reflect/reflect_constant_string2.C.jj 2026-01-15
16:33:47.015097823 +0100
+++ gcc/testsuite/g++.dg/reflect/reflect_constant_string2.C 2026-03-25
11:28:21.181009946 +0100
@@ -11,4 +11,4 @@ using namespace std::meta;
struct V { int a, b, c; };
constexpr auto a = reflect_constant_string (std::vector <int> { 42, 43, 44 });
// { dg-error "'reflect_constant_string' called with
'std::ranges::range_value_t<std::vector<int> >' \\\{aka 'int'\\\} rather than
'char', 'wchar_t', 'char8_t', 'char16_t' or 'char32_t'" }
constexpr auto b = reflect_constant_string (std::vector <float> {});
// { dg-error "'reflect_constant_string' called with
'std::ranges::range_value_t<std::vector<float> >' \\\{aka 'float'\\\} rather
than 'char', 'wchar_t', 'char8_t', 'char16_t' or 'char32_t'" }
-constexpr auto c = reflect_constant_string (std::vector <V> { V { 1, 2, 3 }
}); // { dg-error "'reflect_constant_string' called with
'std::ranges::range_value_t<std::vector<V> >' \\\{aka 'V'\\\} rather than
'char', 'wchar_t', 'char8_t', 'char16_t' or 'char32_t'" }
+constexpr auto c = reflect_constant_string (std::vector <V> { V { 1, 2, 3 }
}); // { dg-error "'reflect_constant_string' called with
'std::ranges::range_value_t<std::vector<V> >' \\\{aka
'(V|std::iter_value_t<__gnu_cxx::__normal_iterator<V\\\*, std::vector<V> >
>)'\\\} rather than 'char', 'wchar_t', 'char8_t', 'char16_t' or 'char32_t'" }
Jakub