aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/SemaExpr.cpp14
-rw-r--r--test/FixIt/no-macro-fixit.c15
2 files changed, 23 insertions, 6 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 96b2e56b41..3d2b14933e 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -10070,9 +10070,6 @@ void Sema::DiagnoseAssignmentAsCondition(Expr *E) {
return;
}
- SourceLocation Open = E->getSourceRange().getBegin();
- SourceLocation Close = PP.getLocForEndOfToken(E->getSourceRange().getEnd());
-
Diag(Loc, diagnostic) << E->getSourceRange();
if (IsOrAssign)
@@ -10082,9 +10079,14 @@ void Sema::DiagnoseAssignmentAsCondition(Expr *E) {
Diag(Loc, diag::note_condition_assign_to_comparison)
<< FixItHint::CreateReplacement(Loc, "==");
- Diag(Loc, diag::note_condition_assign_silence)
- << FixItHint::CreateInsertion(Open, "(")
- << FixItHint::CreateInsertion(Close, ")");
+ SourceLocation Open = E->getSourceRange().getBegin();
+ SourceLocation Close = E->getSourceRange().getEnd();
+ if (!Open.isMacroID() && !Close.isMacroID()) {
+ SourceLocation LocForEndOfToken = PP.getLocForEndOfToken(Close);
+ Diag(Loc, diag::note_condition_assign_silence)
+ << FixItHint::CreateInsertion(Open, "(")
+ << FixItHint::CreateInsertion(LocForEndOfToken, ")");
+ }
}
/// \brief Redundant parentheses over an equality comparison can indicate
diff --git a/test/FixIt/no-macro-fixit.c b/test/FixIt/no-macro-fixit.c
new file mode 100644
index 0000000000..3685ab1087
--- /dev/null
+++ b/test/FixIt/no-macro-fixit.c
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -pedantic -fixit -x c %s
+// rdar://9091893
+
+#define va_arg(ap, type) __builtin_va_arg(ap, type)
+typedef __builtin_va_list va_list;
+
+void myFunc() {
+ va_list values;
+
+ int value;
+
+ while (value = va_arg(values, int)) { // expected-warning {{using the result of an assignment as a condition without parentheses}} \
+ // expected-note {{use '==' to turn this assignment into an equality comparison}}
+ }
+}