blob: 767416677e00f4d5d4c2fd5315f569ddf361031e [file] [log] [blame]
Hans Wennborg9cfdae32011-06-03 18:00:36 +00001// RUN: %clang_cc1 -Wparentheses -fsyntax-only -verify %s
2// RUN: %clang_cc1 -Wparentheses -fixit %s -o - | %clang_cc1 -Wparentheses -Werror -
3
4bool someConditionFunc();
5
6void conditional_op(int x, int y, bool b) {
Chandler Carruth9d456242011-06-16 01:05:12 +00007 (void)(x + someConditionFunc() ? 1 : 2); // expected-warning {{operator '?:' has lower precedence than '+'}} \
8 // expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
9 // expected-note {{place parentheses around the '+' expression to silence this warning}}
Hans Wennborg9cfdae32011-06-03 18:00:36 +000010
Chandler Carruth9d456242011-06-16 01:05:12 +000011 (void)(x - b ? 1 : 2); // expected-warning {{operator '?:' has lower precedence than '-'}} \
12 // expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
13 // expected-note {{place parentheses around the '-' expression to silence this warning}}
Hans Wennborg9cfdae32011-06-03 18:00:36 +000014
Chandler Carruth9d456242011-06-16 01:05:12 +000015 (void)(x * (x == y) ? 1 : 2); // expected-warning {{operator '?:' has lower precedence than '*'}} \
16 // expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
17 // expected-note {{place parentheses around the '*' expression to silence this warning}}
Hans Wennborg9cfdae32011-06-03 18:00:36 +000018}
Hans Wennborg2f072b42011-06-09 17:06:51 +000019
20class Stream {
21public:
22 operator int();
23 Stream &operator<<(int);
24 Stream &operator<<(const char*);
25};
26
27void f(Stream& s, bool b) {
Chandler Carruth9d456242011-06-16 01:05:12 +000028 (void)(s << b ? "foo" : "bar"); // expected-warning {{operator '?:' has lower precedence than '<<'}} \
29 // expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
30 // expected-note {{place parentheses around the '<<' expression to silence this warning}}
Hans Wennborg2f072b42011-06-09 17:06:51 +000031}
Chandler Carruth14d251c2011-06-21 17:22:09 +000032
33struct S {
34 operator int() { return 42; }
35 friend S operator+(const S &lhs, bool) { return S(); }
36};
37
38void test(S *s, bool (S::*m_ptr)()) {
39 (void)(*s + true ? "foo" : "bar"); // expected-warning {{operator '?:' has lower precedence than '+'}} \
40 // expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
41 // expected-note {{place parentheses around the '+' expression to silence this warning}}
42
Hans Wennborgcb4d7c22011-09-12 12:07:30 +000043 (void)((*s + true) ? "foo" : "bar"); // No warning.
44
Chandler Carruth14d251c2011-06-21 17:22:09 +000045 // Don't crash on unusual member call expressions.
46 (void)((s->*m_ptr)() ? "foo" : "bar");
47}