Message ID | 20240323001908.384974-1-jwakely@redhat.com |
---|---|
State | New |
Headers | show |
Series | [1/2] libstdc++: Add dg-require-cpp-feature-test to test feature test macros | expand |
Pushed to trunk. On Sat, 23 Mar 2024 at 00:22, Jonathan Wakely <jwakely@redhat.com> wrote: > > Thoughts? There are only a few uses for this presently, but I can see it > being useful often in future. The library exposes which features it > supports in a standardized way, so we can use those in tests to skip > tests for features that aren't available on all targets. > > The obvious downside is that it becomes harder to notice if a particular > feature is missing on all targets, because we don't get FAILs we just > skip all tests as UNSUPPORTED. And the checks for whether <version> > correctly defines the macro become redundant, because the test won't > even get run if it doesn't. But we won't use this dg-require for many > tests, only the ones where support is target-dependent because it relies > on something non-standard or not available on all targets (like > nl_langinfo_l or libbacktrace). > > -- >8 - > > This adds a new dejagnu directive which can be used to make a test > depend on a feature test macro such as __cpp_lib_text_encoding. This is > mroe flexible than writing a new dg-require-xxx for each feature. > > libstdc++-v3/ChangeLog: > > * testsuite/lib/dg-options.exp (dg-require-cpp-feature-test): > New proc. > * testsuite/lib/libstdc++.exp (check_v3_target_cpp_feature_test): > New proc. > * testsuite/std/text_encoding/cons.cc: Use new directive to skip > the test if the __cpp_lib_text_encoding feature test macro is > not defined. > * testsuite/std/text_encoding/requirements.cc: Likewise. > --- > libstdc++-v3/testsuite/lib/dg-options.exp | 9 +++++++++ > libstdc++-v3/testsuite/lib/libstdc++.exp | 15 +++++++++++++++ > libstdc++-v3/testsuite/std/text_encoding/cons.cc | 1 + > .../testsuite/std/text_encoding/requirements.cc | 3 ++- > 4 files changed, 27 insertions(+), 1 deletion(-) > > diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp > index 00ca678a53a..802bfc0b492 100644 > --- a/libstdc++-v3/testsuite/lib/dg-options.exp > +++ b/libstdc++-v3/testsuite/lib/dg-options.exp > @@ -277,6 +277,15 @@ proc dg-require-target-fs-lwt { args } { > return > } > > +proc dg-require-cpp-feature-test { n args } { > + if { ![ check_v3_target_cpp_feature_test $args ] } { > + upvar dg-do-what dg-do-what > + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] > + return > + } > + return > +} > + > proc add_options_for_no_pch { flags } { > # Remove any inclusion of bits/stdc++.h from the options. > regsub -all -- "-include bits/stdc...h" $flags "" flags > diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp > index 7466fb51c58..2b31c950826 100644 > --- a/libstdc++-v3/testsuite/lib/libstdc++.exp > +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp > @@ -1134,6 +1134,21 @@ proc v3_check_preprocessor_condition { name cond { inc "" } } { > return [v3_try_preprocess name $code $flags] > } > > +# Return 1 if libstdc++ defines macro for the current target, 0 otherwise. > +proc check_v3_target_cpp_feature_test { cond } { > + global cxxflags > + set cxxflags_saved $cxxflags > + # Use the latest standard, so that all feature test macros are defined. > + # We need to do it here, because this check happens before v3-dg-runtest > + # runs its loop to test multiple times with different -std options. > + # This should be updated when a new -std is added. > + set cxxflags "$cxxflags -std=gnu++26" > + set inc "#include <version>" > + set result [v3_check_preprocessor_condition cpp_feature_test "$cond" $inc] > + set cxxflags $cxxflags_saved > + return $result > +} > + > # Return 1 if Debug Mode is active, 0 otherwise. > proc check_v3_target_debug_mode { } { > global cxxflags > diff --git a/libstdc++-v3/testsuite/std/text_encoding/cons.cc b/libstdc++-v3/testsuite/std/text_encoding/cons.cc > index 8fcc2ec8c3b..4196e32ea8b 100644 > --- a/libstdc++-v3/testsuite/std/text_encoding/cons.cc > +++ b/libstdc++-v3/testsuite/std/text_encoding/cons.cc > @@ -1,4 +1,5 @@ > // { dg-do run { target c++26 } } > +// { dg-require-cpp-feature-test "__cpp_lib_text_encoding" } > > #include <text_encoding> > #include <string_view> > diff --git a/libstdc++-v3/testsuite/std/text_encoding/requirements.cc b/libstdc++-v3/testsuite/std/text_encoding/requirements.cc > index a1d5d6baee1..3889b250688 100644 > --- a/libstdc++-v3/testsuite/std/text_encoding/requirements.cc > +++ b/libstdc++-v3/testsuite/std/text_encoding/requirements.cc > @@ -1,4 +1,5 @@ > // { dg-do compile { target c++26 } } > +// { dg-require-cpp-feature-test __cpp_lib_text_encoding } > // { dg-add-options no_pch } > > #include <text_encoding> >
diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp index 00ca678a53a..802bfc0b492 100644 --- a/libstdc++-v3/testsuite/lib/dg-options.exp +++ b/libstdc++-v3/testsuite/lib/dg-options.exp @@ -277,6 +277,15 @@ proc dg-require-target-fs-lwt { args } { return } +proc dg-require-cpp-feature-test { n args } { + if { ![ check_v3_target_cpp_feature_test $args ] } { + upvar dg-do-what dg-do-what + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] + return + } + return +} + proc add_options_for_no_pch { flags } { # Remove any inclusion of bits/stdc++.h from the options. regsub -all -- "-include bits/stdc...h" $flags "" flags diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index 7466fb51c58..2b31c950826 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -1134,6 +1134,21 @@ proc v3_check_preprocessor_condition { name cond { inc "" } } { return [v3_try_preprocess name $code $flags] } +# Return 1 if libstdc++ defines macro for the current target, 0 otherwise. +proc check_v3_target_cpp_feature_test { cond } { + global cxxflags + set cxxflags_saved $cxxflags + # Use the latest standard, so that all feature test macros are defined. + # We need to do it here, because this check happens before v3-dg-runtest + # runs its loop to test multiple times with different -std options. + # This should be updated when a new -std is added. + set cxxflags "$cxxflags -std=gnu++26" + set inc "#include <version>" + set result [v3_check_preprocessor_condition cpp_feature_test "$cond" $inc] + set cxxflags $cxxflags_saved + return $result +} + # Return 1 if Debug Mode is active, 0 otherwise. proc check_v3_target_debug_mode { } { global cxxflags diff --git a/libstdc++-v3/testsuite/std/text_encoding/cons.cc b/libstdc++-v3/testsuite/std/text_encoding/cons.cc index 8fcc2ec8c3b..4196e32ea8b 100644 --- a/libstdc++-v3/testsuite/std/text_encoding/cons.cc +++ b/libstdc++-v3/testsuite/std/text_encoding/cons.cc @@ -1,4 +1,5 @@ // { dg-do run { target c++26 } } +// { dg-require-cpp-feature-test "__cpp_lib_text_encoding" } #include <text_encoding> #include <string_view> diff --git a/libstdc++-v3/testsuite/std/text_encoding/requirements.cc b/libstdc++-v3/testsuite/std/text_encoding/requirements.cc index a1d5d6baee1..3889b250688 100644 --- a/libstdc++-v3/testsuite/std/text_encoding/requirements.cc +++ b/libstdc++-v3/testsuite/std/text_encoding/requirements.cc @@ -1,4 +1,5 @@ // { dg-do compile { target c++26 } } +// { dg-require-cpp-feature-test __cpp_lib_text_encoding } // { dg-add-options no_pch } #include <text_encoding>