From a8c7afe2384ba31e893e67ad8bf05e733a6c4a56 Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Sat, 23 Aug 2014 00:30:57 +0000 Subject: [PATCH] Fix a bad location in -Wparentheses fix-it hint The code used getLocStart() instead of getLocEnd(). This works for single token expressions, but breaks if the expression is longer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216306 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 2 +- test/Sema/parentheses.cpp | 102 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index b74429ab55..5bb042ce3d 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -9515,7 +9515,7 @@ static void DiagnoseBitwisePrecedence(Sema &Self, BinaryOperatorKind Opc, StringRef OpStr = isLeftComp ? LHSBO->getOpcodeStr() : RHSBO->getOpcodeStr(); SourceRange ParensRange = isLeftComp ? SourceRange(LHSBO->getRHS()->getLocStart(), RHSExpr->getLocEnd()) - : SourceRange(LHSExpr->getLocStart(), RHSBO->getLHS()->getLocStart()); + : SourceRange(LHSExpr->getLocStart(), RHSBO->getLHS()->getLocEnd()); Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel) << DiagRange << BinaryOperator::getOpcodeStr(Opc) << OpStr; diff --git a/test/Sema/parentheses.cpp b/test/Sema/parentheses.cpp index ac2694f72e..d9fedb58c6 100644 --- a/test/Sema/parentheses.cpp +++ b/test/Sema/parentheses.cpp @@ -113,3 +113,105 @@ namespace PR15628 { (void)(i-- ? true : false); // no-warning } } + +namespace PR20735 { + struct X { + static int state; + static int get(); + int get_num(); + int num; + }; + namespace ns { + int num = 0; + int get(); + } + void test(X x) { + if (5 & x.get_num() != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:29-[[@LINE-6]]:29}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:24-[[@LINE-9]]:24}:")" + + if (5 & x.num != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:23-[[@LINE-6]]:23}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:18-[[@LINE-9]]:18}:")" + + if (5 & x.state != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:25-[[@LINE-6]]:25}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:20-[[@LINE-9]]:20}:")" + + if (5 & x.get() != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:25-[[@LINE-6]]:25}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:20-[[@LINE-9]]:20}:")" + + if (5 & X::state != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:26-[[@LINE-6]]:26}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:21-[[@LINE-9]]:21}:")" + + if (5 & X::get() != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:26-[[@LINE-6]]:26}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:21-[[@LINE-9]]:21}:")" + + if (5 & ns::get() != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:27-[[@LINE-6]]:27}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:22-[[@LINE-9]]:22}:")" + + if (5 & ns::num != 0) {} + // expected-warning@-1 {{& has lower precedence than !=; != will be evaluated first}} + // expected-note@-2 {{place parentheses around the '!=' expression to silence this warning}} + // expected-note@-3 {{place parentheses around the & expression to evaluate it first}} + // CHECK: place parentheses around the '!=' expression to silence this warning + // fix-it:"{{.*}}":{[[@LINE-5]]:13-[[@LINE-5]]:13}:"(" + // fix-it:"{{.*}}":{[[@LINE-6]]:25-[[@LINE-6]]:25}:")" + // CHECK: place parentheses around the & expression to evaluate it first + // fix-it:"{{.*}}":{[[@LINE-8]]:9-[[@LINE-8]]:9}:"(" + // fix-it:"{{.*}}":{[[@LINE-9]]:20-[[@LINE-9]]:20}:")" + } +} -- 2.40.0