blob: 4e85b375829fe38de3d2db6faa0ba415c406bd7d [file] [log] [blame]
Eric Fiselier0683c0e2018-05-07 21:07:10 +00001// Test diagnostics for ill-formed STL <compare> headers.
2
3// RUN: %clang_cc1 -triple x86_64-apple-darwin -fcxx-exceptions -fsyntax-only -pedantic -verify -Wsign-compare -std=c++2a %s
Richard Smithf495de42019-12-16 17:40:03 -08004// RUN: %clang_cc1 -triple x86_64-apple-darwin -fcxx-exceptions -fsyntax-only -pedantic -verify -Wsign-compare -std=c++2a -DTEST_TRIVIAL=1 %s
Eric Fiselier0683c0e2018-05-07 21:07:10 +00005
Richard Smithf495de42019-12-16 17:40:03 -08006#ifndef TEST_TRIVIAL
Eric Fiselier0683c0e2018-05-07 21:07:10 +00007void compare_not_found_test() {
Richard Smith38c3b5d2019-12-11 17:28:46 -08008 // expected-error@+1 {{cannot use builtin operator '<=>' because type 'std::partial_ordering' was not found; include <compare>}}
Eric Fiselier0683c0e2018-05-07 21:07:10 +00009 (void)(0.0 <=> 42.123);
10}
11
Richard Smith38c3b5d2019-12-11 17:28:46 -080012struct deduction_compare_not_found {
13 // expected-error@+1 {{cannot default 'operator<=>' because type 'std::strong_ordering' was not found; include <compare>}}
14 friend auto operator<=>(const deduction_compare_not_found&, const deduction_compare_not_found&) = default;
15};
16
17struct comparable {
18 int operator<=>(comparable);
19};
20struct default_compare_not_found {
21 // expected-error@+1 {{cannot default 'operator<=>' because type 'std::strong_ordering' was not found; include <compare>}}
22 friend int operator<=>(const default_compare_not_found&, const default_compare_not_found&) = default;
23};
24bool b = default_compare_not_found() < default_compare_not_found(); // expected-note {{first required here}}
25
Eric Fiselier0683c0e2018-05-07 21:07:10 +000026namespace std {
27inline namespace __1 {
28struct partial_ordering; // expected-note {{forward declaration}}
29}
30} // namespace std
31
32auto compare_incomplete_test() {
33 // expected-error@+1 {{incomplete type 'std::partial_ordering' where a complete type is required}}
34 return (-1.2 <=> 123.0);
35}
36
37namespace std {
38inline namespace __1 {
39struct partial_ordering {
40 unsigned value;
41};
42} // namespace __1
43} // namespace std
44
45auto missing_member_test() {
Richard Smithf495de42019-12-16 17:40:03 -080046 // expected-error@+1 {{standard library implementation of 'std::partial_ordering' is not supported; member 'equivalent' is missing}}
Eric Fiselier0683c0e2018-05-07 21:07:10 +000047 return (1.0 <=> 1.0);
48}
49
50namespace std {
51inline namespace __1 {
52struct strong_ordering {
53 long long value;
Richard Smithdbd11292019-12-06 11:34:29 -080054 static const strong_ordering equal; // expected-note {{declared here}}
Eric Fiselier0683c0e2018-05-07 21:07:10 +000055};
56} // namespace __1
57} // namespace std
58
59auto test_non_constexpr_var() {
Richard Smithdbd11292019-12-06 11:34:29 -080060 // expected-error@+1 {{standard library implementation of 'std::strong_ordering' is not supported; member 'equal' does not have expected form}}
Eric Fiselier0683c0e2018-05-07 21:07:10 +000061 return (1 <=> 0);
62}
63
Richard Smithf495de42019-12-16 17:40:03 -080064#else
65
Eric Fiselier0683c0e2018-05-07 21:07:10 +000066namespace std {
67inline namespace __1 {
Richard Smithf495de42019-12-16 17:40:03 -080068struct strong_ordering {
Eric Fiselier0683c0e2018-05-07 21:07:10 +000069 char value = 0;
Richard Smithf495de42019-12-16 17:40:03 -080070 constexpr strong_ordering() = default;
Eric Fiselier0683c0e2018-05-07 21:07:10 +000071 // non-trivial
Richard Smithf495de42019-12-16 17:40:03 -080072 constexpr strong_ordering(strong_ordering const &other) : value(other.value) {}
Eric Fiselier0683c0e2018-05-07 21:07:10 +000073};
74} // namespace __1
75} // namespace std
76
Richard Smithf495de42019-12-16 17:40:03 -080077auto test_non_trivial(int LHS, int RHS) {
78 // expected-error@+1 {{standard library implementation of 'std::strong_ordering' is not supported; the type is not trivially copyable}}
Eric Fiselier0683c0e2018-05-07 21:07:10 +000079 return LHS <=> RHS;
80}
Richard Smithf495de42019-12-16 17:40:03 -080081
82#endif