aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp23/attr-assume4.C
blob: 059d47bbd92cfe237e46f74b7375c8e79714df34 (plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// P1774R8 - Portable assumptions
// { dg-do compile { target c++11 } }

[[__assume__ (true)]] void f1 ();		// { dg-error "'assume' attribute ignored" }
typedef int intx [[__assume__ (true)]];		// { dg-error "'assume' attribute ignored" }
[[__assume__ (true)]];				// { dg-warning "attribute ignored" }
[[gnu::assume (true)]] void f1a ();		// { dg-error "'assume' attribute ignored" }
typedef int inty [[gnu::__assume__ (true)]];	// { dg-error "'assume' attribute ignored" }
[[__gnu__::assume (true)]];			// { dg-warning "attribute ignored" }
__attribute__((assume (true))) void f1b ();	// { dg-error "'assume' attribute ignored" }
typedef int intz __attribute__((assume (true)));// { dg-error "'assume' attribute ignored" }

void
foo ()
{
  int i;
  [[__assume__]];			// { dg-error "wrong number of arguments specified for 'assume' attribute" }
					// { dg-message "expected 1, found 0" "" { target *-*-* } .-1 }
  [[__assume__ ()]];			// { dg-error "parentheses must be omitted if 'assume' attribute argument list is empty" }
					// { dg-error "wrong number of arguments specified for 'assume' attribute" "" { target *-*-* } .-1 }
					// { dg-message "expected 1, found 0" "" { target *-*-* } .-2 }
  [[__assume__ (true, true)]];		// { dg-error "wrong number of arguments specified for 'assume' attribute" }
					// { dg-message "expected 1, found 2" "" { target *-*-* } .-1 }
  [[__assume__ (true)]] i = 1;		// { dg-warning "'assume' attribute not followed by ';'" }
  [[__assume__ (throw 1)]];		// { dg-error "expected primary-expression before 'throw'" }
  [[__assume__ (i = 1)]];		// { dg-error "expected '\\\)' before '=' token" }
  [[gnu::assume]];			// { dg-error "wrong number of arguments specified for 'assume' attribute" }
					// { dg-message "expected 1, found 0" "" { target *-*-* } .-1 }
  [[gnu::assume ()]];			// { dg-error "parentheses must be omitted if 'assume' attribute argument list is empty" }
					// { dg-error "wrong number of arguments specified for 'assume' attribute" "" { target *-*-* } .-1 }
					// { dg-message "expected 1, found 0" "" { target *-*-* } .-2 }
  [[gnu::assume (true, true)]];		// { dg-error "wrong number of arguments specified for 'assume' attribute" }
					// { dg-message "expected 1, found 2" "" { target *-*-* } .-1 }
  [[gnu::assume (true)]] i = 1;		// { dg-warning "'assume' attribute not followed by ';'" }
  [[gnu::assume (throw 1)]];		// { dg-error "expected primary-expression before 'throw'" }
  [[gnu::assume (i = 1)]];		// { dg-error "expected '\\\)' before '=' token" }
  __attribute__((assume));		// { dg-error "wrong number of arguments specified for 'assume' attribute" }
					// { dg-message "expected 1, found 0" "" { target *-*-* } .-1 }
  __attribute__((assume ()));		// { dg-error "wrong number of arguments specified for 'assume' attribute" }
					// { dg-message "expected 1, found 0" "" { target *-*-* } .-1 }
  __attribute__((assume (true, true)));	// { dg-error "wrong number of arguments specified for 'assume' attribute" }
					// { dg-message "expected 1, found 2" "" { target *-*-* } .-1 }
  __attribute__((assume (true))) i = 1;	// { dg-warning "'assume' attribute not followed by ';'" }
  __attribute__((assume (throw 1)));	// { dg-error "expected primary-expression before 'throw'" }
  __attribute__((assume (i = 1)));	// { dg-error "expected '\\\)' before '=' token" }
}

constexpr int
f2 (int x)
{
#if __cpp_constexpr >= 201304L
  [[__assume__ (x == 42)]];		// { dg-error "failed 'assume' attribute assumption" "" { target c++14 } }
#endif
  return x;
}

constexpr int
f2a (int x)
{
#if __cpp_constexpr >= 201304L
  [[gnu::__assume__ (x == 42)]];	// { dg-error "failed 'assume' attribute assumption" "" { target c++14 } }
#endif
  return x;
}

constexpr int
f2b (int x)
{
#if __cpp_constexpr >= 201304L
  __attribute__((__assume__ (x == 42)));// { dg-error "failed 'assume' attribute assumption" "" { target c++14 } }
#endif
  return x;
}

constexpr int a = f2 (44);
constexpr int aa = f2a (44);
constexpr int ab = f2b (44);

int
f3 (int x)
{
  __asm ("" : "+r" (x));
  return x;
}

constexpr int
f4 (int x)
{
#if __cpp_constexpr >= 201304L
  [[__assume__ (f3 (42) == 42)]];
#endif
  return x;
}

constexpr int
f4a (int x)
{
#if __cpp_constexpr >= 201304L
  [[gnu::assume (f3 (42) == 42)]];
#endif
  return x;
}

constexpr int
f4b (int x)
{
#if __cpp_constexpr >= 201304L
  __attribute__((assume (f3 (42) == 42)));
#endif
  return x;
}

static_assert (f4 (42) == 42, "");
static_assert (f4a (42) == 42, "");
static_assert (f4b (42) == 42, "");

struct S {};

int
f5 ()
{
  S s;
  [[gnu::assume (s)]];			// { dg-error "could not convert 's' from 'S' to 'bool'" }
  return 0;
}

template <typename T>
int
f6 ()
{
  T t;
  __attribute__((assume (t)));		// { dg-error "could not convert 't' from 'S' to 'bool'" }
  return 0;
}

int z = f6 <S> ();