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 }