@@ -129,6 +129,7 @@ class TestCondition : public TestFixture {
129129 TEST_CASE (knownConditionAfterBailout); // #12526
130130 TEST_CASE (knownConditionIncDecOperator);
131131 TEST_CASE (knownConditionFloating);
132+ TEST_CASE (knownConditionShiftAssignment);
132133 }
133134
134135 struct CheckOptions
@@ -6687,6 +6688,40 @@ class TestCondition : public TestFixture {
66876688 ASSERT_EQUALS (" " , errout_str ());
66886689 }
66896690
6691+ void knownConditionShiftAssignment () { // #6552
6692+ check (" struct Value { void operator>>=(double&) const; };\n "
6693+ " bool f(const Value& value, bool extract) {\n "
6694+ " double x = 0.5;\n "
6695+ " if (extract) value >>= x;\n "
6696+ " return x < 0;\n "
6697+ " }\n " );
6698+ ASSERT_EQUALS (" " , errout_str ());
6699+
6700+ check (" struct Value { void operator>>=(double) const; };\n "
6701+ " bool f(const Value& value) {\n "
6702+ " double x = 0.5;\n "
6703+ " value >>= x;\n "
6704+ " return x < 0;\n "
6705+ " }\n " );
6706+ ASSERT_EQUALS (" [test.cpp:5:14]: (style) Return value 'x<0' is always false [knownConditionTrueFalse]\n " , errout_str ());
6707+
6708+ check (" struct Value { void operator>>=(const double&) const; };\n "
6709+ " bool f(const Value& value) {\n "
6710+ " double x = 0.5;\n "
6711+ " value >>= x;\n "
6712+ " return x < 0;\n "
6713+ " }\n " );
6714+ ASSERT_EQUALS (" [test.cpp:5:14]: (style) Return value 'x<0' is always false [knownConditionTrueFalse]\n " , errout_str ());
6715+
6716+ check (" struct Value { void operator>>=(const double&) const; };\n "
6717+ " bool f(const Value& value) {\n "
6718+ " const double x = 0.5;\n "
6719+ " value >>= x;\n "
6720+ " return x < 0;\n "
6721+ " }\n " );
6722+ ASSERT_EQUALS (" [test.cpp:5:14]: (style) Return value 'x<0' is always false [knownConditionTrueFalse]\n " , errout_str ());
6723+ }
6724+
66906725 void knownConditionFloating () {
66916726 check (" void foo() {\n " // #11199
66926727 " float f = 1.0;\n "
0 commit comments