On Wed, 7 Jan 2026 at 16:41, Tomasz Kamiński <[email protected]> wrote:
>
> Use of scan-assembler-dem for matching against debug symbols, turned out to
> not
> be portable, as they representation in assembly output differs between
> platforms:
> arm limits output rows to 60 columns, emitting multiple rows, and some
> platforms
> may encode them using base64.
>
> We use tree-dump-gimple output instead, that outputs a constructor name
> portably,
> allowing us to simply match for invocation of constructor for given type, as
> each
> variable has different type.
>
> To use scan-tree-dump(-not) we load scantree.exp file and it's dependency
> scandump.exp from gcc/testsuite/lib.
>
> libstdc++-v3/ChangeLog:
>
> * testsuite/20_util/variant/constinit.cc: Use scan-tree-dump
> for matching of constructor.
> * testsuite/20_util/variant/constinit_compat.cc: Likewise.
> * testsuite/lib/libstdc++.exp: Load scantree.exp and scandump.exp.
> ---
> Tested variant/constinit* locally in all standard modes, and x86_64 and
> -m 32 linux locally. OK for trunk?
OK, thanks.
>
> .../testsuite/20_util/variant/constinit.cc | 13 +++++++------
> .../20_util/variant/constinit_compat.cc | 19 +++++++++----------
> libstdc++-v3/testsuite/lib/libstdc++.exp | 2 ++
> 3 files changed, 18 insertions(+), 16 deletions(-)
>
> diff --git a/libstdc++-v3/testsuite/20_util/variant/constinit.cc
> b/libstdc++-v3/testsuite/20_util/variant/constinit.cc
> index 48d647b1006..821e2de9821 100644
> --- a/libstdc++-v3/testsuite/20_util/variant/constinit.cc
> +++ b/libstdc++-v3/testsuite/20_util/variant/constinit.cc
> @@ -1,3 +1,4 @@
> +// { dg-options "-fdump-tree-gimple" }
> // { dg-do compile { target c++17 } }
>
> #include <variant>
> @@ -21,20 +22,20 @@ struct NonTrivialEmpty
> };
>
> std::variant<NonEmpty> vNonEmpty(std::in_place_type<NonEmpty>);
> -// { dg-final { scan-assembler-dem-not "(std::in_place_type_t<NonEmpty>)" } }
> +// { dg-final { scan-tree-dump-not "std::variant<NonEmpty>::variant"
> "gimple" } }
>
> std::variant<NonTrivial> vNonTrivial(std::in_place_type<NonTrivial>);
> -// { dg-final { scan-assembler-dem-not "(std::in_place_type_t<NonTrivial>)"
> } }
> +// { dg-final { scan-tree-dump-not "std::variant<NonTrivial>::variant"
> "gimple" } }
>
> std::variant<int, NonTrivial>
> vNonTrivialNonConstexpr(std::in_place_index<1>, 2);
> -// { dg-final { scan-assembler-dem "(std::in_place_index_t<1ul?>, int&&)" } }
> +// { dg-final { scan-tree-dump "std::variant<int, NonTrivial>::variant"
> "gimple" } }
>
> std::variant<TrivialEmpty> vTrivialEmpty(std::in_place_type<TrivialEmpty>);
> -// { dg-final { scan-assembler-dem-not
> "(std::in_place_type_t<TrivialEmpty>)" } }
> +// { dg-final { scan-tree-dump-not "std::variant<TrivialEmpty>::variant"
> "gimple" } }
>
> std::variant<NonTrivialEmpty>
> vNonTrivialEmpty(std::in_place_type<NonTrivialEmpty>);
> -// { dg-final { scan-assembler-dem-not
> "(std::in_place_type_t<NonTrivialEmpty>)" } }
> +// { dg-final { scan-tree-dump-not "std::variant<NonTrivialEmpty>::variant"
> "gimple" } }
>
> std::variant<int, NonTrivialEmpty>
> vNonTrivialEmptyNonConstexpr(std::in_place_index<1>, 2.0);
> -// { dg-final { scan-assembler-dem "(std::in_place_index_t<1ul?>, double&&)"
> } }
> +// { dg-final { scan-tree-dump "std::variant<int, NonTrivialEmpty>::variant"
> "gimple" } }
>
> diff --git a/libstdc++-v3/testsuite/20_util/variant/constinit_compat.cc
> b/libstdc++-v3/testsuite/20_util/variant/constinit_compat.cc
> index 374861728ae..d930f7fad80 100644
> --- a/libstdc++-v3/testsuite/20_util/variant/constinit_compat.cc
> +++ b/libstdc++-v3/testsuite/20_util/variant/constinit_compat.cc
> @@ -1,4 +1,4 @@
> -// { dg-options "-D_GLIBCXX_USE_VARIANT_CXX17_OLD_ABI" }
> +// { dg-options "-fdump-tree-gimple -D_GLIBCXX_USE_VARIANT_CXX17_OLD_ABI" }
> // { dg-do compile { target c++17 } }
>
> #include <variant>
> @@ -22,22 +22,21 @@ struct NonTrivialEmpty
> };
>
> std::variant<NonEmpty> vNonEmpty(std::in_place_type<NonEmpty>);
> -// { dg-final { scan-assembler-dem-not "(std::in_place_type_t<NonEmpty>)" } }
> +// { dg-final { scan-tree-dump-not "std::variant<NonEmpty>::variant"
> "gimple" } }
>
> std::variant<NonTrivial> vNonTrivial(std::in_place_type<NonTrivial>);
> -// { dg-final { scan-assembler-dem "(std::in_place_type_t<NonTrivial>)" {
> target { ! c++20 } } } }
> -// { dg-final { scan-assembler-dem-not "(std::in_place_type_t<NonTrivial>)"
> { target c++20 } } }
> +// { dg-final { scan-tree-dump "std::variant<NonTrivial>::variant" "gimple"
> { target { ! c++20 } } } }
> +// { dg-final { scan-tree-dump-not "std::variant<NonTrivial>::variant"
> "gimple" { target c++20 } } }
>
> std::variant<int, NonTrivial>
> vNonTrivialNonConstexpr(std::in_place_index<1>, 2);
> -// { dg-final { scan-assembler-dem "(std::in_place_index_t<1ul?>, int&&)" } }
> +// { dg-final { scan-tree-dump "std::variant<int, NonTrivial>::variant"
> "gimple" } }
>
> std::variant<TrivialEmpty> vTrivialEmpty(std::in_place_type<TrivialEmpty>);
> -// { dg-final { scan-assembler-dem-not
> "(std::in_place_type_t<TrivialEmpty>)" } }
> +// { dg-final { scan-tree-dump-not "std::variant<TrivialEmpty>::variant"
> "gimple" } }
>
> std::variant<NonTrivialEmpty>
> vNonTrivialEmpty(std::in_place_type<NonTrivialEmpty>);
> -// { dg-final { scan-assembler-dem "(std::in_place_type_t<NonTrivialEmpty>)"
> { target { ! c++20 } } } }
> -// { dg-final { scan-assembler-dem-not
> "(std::in_place_type_t<NonTrivialEmpty>)" { target c++20 } } }
> +// { dg-final { scan-tree-dump "std::variant<NonTrivialEmpty>::variant"
> "gimple" { target { ! c++20 } } } }
> +// { dg-final { scan-tree-dump-not "std::variant<NonTrivialEmpty>::variant"
> "gimple" { target c++20 } } }
>
> std::variant<int, NonTrivialEmpty>
> vNonTrivialEmptyNonConstexpr(std::in_place_index<1>, 2.0);
> -// { dg-final { scan-assembler-dem "(std::in_place_index_t<1ul?>, double&&)"
> } }
> -
> +// { dg-final { scan-tree-dump "std::variant<int, NonTrivialEmpty>::variant"
> "gimple" } }
> diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp
> b/libstdc++-v3/testsuite/lib/libstdc++.exp
> index 87c4b0a5c94..67c47549963 100644
> --- a/libstdc++-v3/testsuite/lib/libstdc++.exp
> +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
> @@ -68,6 +68,8 @@ load_gcc_lib target-supports-dg.exp
> load_lib prune.exp
> load_lib dg-options.exp
> load_gcc_lib scanasm.exp
> +load_gcc_lib scandump.exp
> +load_gcc_lib scantree.exp
> load_gcc_lib target-libpath.exp
> load_gcc_lib timeout.exp
> load_gcc_lib timeout-dg.exp
> --
> 2.52.0
>