File: trailing-return-short-circuit.cpp

package info (click to toggle)
llvm-toolchain-16 1%3A16.0.6-15~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,634,792 kB
  • sloc: cpp: 6,179,261; ansic: 1,216,205; asm: 741,319; python: 196,614; objc: 75,325; f90: 49,640; lisp: 32,396; pascal: 12,286; sh: 9,394; perl: 7,442; ml: 5,494; awk: 3,523; makefile: 2,723; javascript: 1,206; xml: 886; fortran: 581; cs: 573
file content (62 lines) | stat: -rw-r--r-- 2,772 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// RUN: %clang_cc1 -std=c++20 -verify %s

template <class T>
  requires(sizeof(T) > 2) || T::value // #FOO_REQ
void Foo(T){};                        // #FOO

template <class T>
void TrailingReturn(T)       // #TRAILING
  requires(sizeof(T) > 2) || // #TRAILING_REQ
          T::value           // #TRAILING_REQ_VAL
{};
template <bool B>
struct HasValue {
  static constexpr bool value = B;
};
static_assert(sizeof(HasValue<true>) <= 2);

template <bool B>
struct HasValueLarge {
  static constexpr bool value = B;
  int I;
};
static_assert(sizeof(HasValueLarge<true>) > 2);

void usage() {
  // Passes the 1st check, short-circuit so the 2nd ::value is not evaluated.
  Foo(1.0);
  TrailingReturn(1.0);

  // Fails the 1st check, but has a ::value, so the check happens correctly.
  Foo(HasValue<true>{});
  TrailingReturn(HasValue<true>{});

  // Passes the 1st check, but would have passed the 2nd one.
  Foo(HasValueLarge<true>{});
  TrailingReturn(HasValueLarge<true>{});

  // Fails the 1st check, fails 2nd because there is no ::value.
  Foo(true);
  // expected-error@-1{{no matching function for call to 'Foo'}}
  // expected-note@#FOO{{candidate template ignored: constraints not satisfied [with T = bool]}}
  // expected-note@#FOO_REQ{{because 'sizeof(_Bool) > 2' (1 > 2) evaluated to false}}
  // expected-note@#FOO_REQ{{because substituted constraint expression is ill-formed: type 'bool' cannot be used prior to '::' because it has no members}}

  TrailingReturn(true);
  // expected-error@-1{{no matching function for call to 'TrailingReturn'}}
  // expected-note@#TRAILING{{candidate template ignored: constraints not satisfied [with T = bool]}}
  // expected-note@#TRAILING_REQ{{because 'sizeof(_Bool) > 2' (1 > 2) evaluated to false}}
  // expected-note@#TRAILING_REQ_VAL{{because substituted constraint expression is ill-formed: type 'bool' cannot be used prior to '::' because it has no members}}

  // Fails the 1st check, fails 2nd because ::value is false.
  Foo(HasValue<false>{});
  // expected-error@-1 {{no matching function for call to 'Foo'}}
  // expected-note@#FOO{{candidate template ignored: constraints not satisfied [with T = HasValue<false>]}}
  // expected-note@#FOO_REQ{{because 'sizeof(HasValue<false>) > 2' (1 > 2) evaluated to false}}
  // expected-note@#FOO_REQ{{and 'HasValue<false>::value' evaluated to false}}
  TrailingReturn(HasValue<false>{});
  // expected-error@-1 {{no matching function for call to 'TrailingReturn'}}
  // expected-note@#TRAILING{{candidate template ignored: constraints not satisfied [with T = HasValue<false>]}}
  // expected-note@#TRAILING_REQ{{because 'sizeof(HasValue<false>) > 2' (1 > 2) evaluated to false}}
  // expected-note@#TRAILING_REQ_VAL{{and 'HasValue<false>::value' evaluated to false}}
}