1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wunused-value %s |
2 | |
3 | void f() __attribute__((const)); |
4 | |
5 | namespace PR18571 { |
6 | // Unevaluated contexts should not trigger unused result warnings. |
7 | template <typename T> |
8 | auto foo(T) -> decltype(f(), bool()) { // Should not warn. |
9 | return true; |
10 | } |
11 | |
12 | void g() { |
13 | foo(1); |
14 | } |
15 | |
16 | void h() { |
17 | int i = 0; |
18 | (void)noexcept(++i); // expected-warning {{expression with side effects has no effect in an unevaluated context}} |
19 | decltype(i++) j = 0; // expected-warning {{expression with side effects has no effect in an unevaluated context}} |
20 | } |
21 | |
22 | struct S { |
23 | S operator++(int); |
24 | S(int i); |
25 | S(); |
26 | |
27 | int& f(); |
28 | S g(); |
29 | }; |
30 | |
31 | void j() { |
32 | S s; |
33 | int i = 0; |
34 | (void)noexcept(s++); // Ok |
35 | (void)noexcept(i++); // expected-warning {{expression with side effects has no effect in an unevaluated context}} |
36 | (void)noexcept(i = 5); // expected-warning {{expression with side effects has no effect in an unevaluated context}} |
37 | (void)noexcept(s = 5); // Ok |
38 | |
39 | (void)sizeof(s.f()); // Ok |
40 | (void)sizeof(s.f() = 5); // expected-warning {{expression with side effects has no effect in an unevaluated context}} |
41 | (void)noexcept(s.g() = 5); // Ok |
42 | } |
43 | |
44 | } |