<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, Dec 5, 2018 at 5:21 PM Richard Smith <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Tue, 4 Dec 2018 at 19:34, Marshall Clow via libcxx-dev <<a href="mailto:libcxx-dev@lists.llvm.org" target="_blank">libcxx-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">In the tests, we have the following usage:<div><br></div><div><div>#if TEST_STD_VER > 14</div><div># if !defined(__cpp_lib_filesystem)</div><div>#  error "__cpp_lib_filesystem is not defined"</div><div># elif __cpp_lib_filesystem < 201703L</div><div>#  error "__cpp_lib_filesystem has an invalid value"</div><div># endif</div><div>#endif</div></div><div><br></div><div>I submit that that's non-portable, because some standard libraries may not implement all the features (that's the point of the feature-test macro), and this test should not fail.</div></div></div></div></div></blockquote><div><br></div><div>Maybe this is lack of imagination on my part, but isn't a test failure for an unimplemented standard library feature exactly the desired behavior?</div></div></div></blockquote><div><br></div><div>No. The test here is for the correct definition of the macro in question.</div><div>With the adoption of feature test macros, the committee has explicitly sanctioned the idea of incomplete implementations.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>In D55308, I am using the following form:</div><div><br></div><div><div>#if TEST_STD_VER > 17</div><div>  LIBCPP_ASSERT(IS_DEFINED(__cpp_lib_char8_t)); // libc++ implements this</div><div># if defined(__cpp_lib_char8_t)</div><div>#  if __cpp_lib_char8_t < 201811L</div><div>#   error "__cpp_lib_char8_t has an invalid value"</div><div>#  endif</div><div># endif</div><div>#endif</div></div><div><br></div><div>Basically it (unconditionally) checks that if the macro is defined, then it has a sane value.</div><div>Additionally, since we know that libc++ defines this, we check that.</div><div><br></div><div>An alternate formulation - w/o the `IS_DEFINED` trickery.</div><div><br></div><div><div><div>#if TEST_STD_VER > 17</div><div># if !defined(__cpp_lib_char8_t)  </div><div>  LIBCPP_STATIC_ASSERT(false, "__cpp_lib_char8_t is not defined");</div><div># else</div><div>#  if __cpp_lib_char8_t < 201811L</div><div>#   error "__cpp_lib_char8_t has an invalid value"</div><div>#  endif</div><div># endif</div><div>#endif</div></div><div><br></div><div>Comments welcome.</div></div></div></div></div></div></blockquote><div><br></div><div>A standard library implementation that partially supports a feature may define the feature test macro to a value lower than the standard one. Your revised approach would reject that. </div></div></div></blockquote><div><br></div><div>It would; I haven't considered that.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div>There are two things that I think are reasonable:</div><div><br></div><div>1) Condition all your tests on the relevant feature test macros, and add</div><div><br></div><div>LIBCPP_STATIC_ASSERT(__cpp_lib_char8_t >= 201811L, "libc++ should implement this");</div><div><br></div><div>to make sure that libc++ in particular behaves as expected, or</div><div><br></div><div>2) Write tests that test for conformance: the feature test macros should be correct and the functionality should be available. That way a standard library implementation that fails to implement a feature (and doesn't advertise the feature via feature test macros) doesn't get an "all tests pass" despite not implementing all of the standard library.</div><div><br></div><div>I'd lean towards option 2 myself, but maybe vendors of other stdlibs using the libc++ testsuite might have a different opinion.<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev" rel="noreferrer" target="_blank"></a><br>
</div></div></div></blockquote><div><br></div><div>I'd rather avoid that; long-term test failures are not in anyones best-interest.</div><div>It leads to people ignoring the test results "oh, yeah we always have test failures"</div><div><br></div><div>-- Marshall</div><div><br></div><div> </div></div></div>