This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR c/69993: improvements to wording of -Wmisleading-indentation
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: David Malcolm <dmalcolm at redhat dot com>,gcc-patches at gcc dot gnu dot org
- Date: Tue, 01 Mar 2016 20:18:22 +0100
- Subject: Re: [PATCH] PR c/69993: improvements to wording of -Wmisleading-indentation
- Authentication-results: sourceware.org; auth=none
- References: <1456858261-61438-1-git-send-email-dmalcolm at redhat dot com>
On March 1, 2016 7:51:01 PM GMT+01:00, David Malcolm <dmalcolm@redhat.com> wrote:
>The wording of our output from -Wmisleading-indentation is rather
>confusing, as noted by Reddit user "sysop073" here:
>https://www.reddit.com/r/programming/comments/47pejg/gcc_6_wmisleadingindentation_vs_goto_fail/d0eonwd
>
>> The way they split up the warning looks designed to trick you.
>> sslKeyExchange.c:631:8: warning: statement is indented as if it were
>guarded by... [-Wmisleading-indentation]
>> goto fail;
>> ^~~~
>> sslKeyExchange.c:629:4: note: ...this 'if' clause, but it is not
>> if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
>> ^~
>> You read the first half and it sounds like goto fail; is guarding
>something. Why would it not be:
>> sslKeyExchange.c:631:8: warning: statement is wrongly indented...
>[-Wmisleading-indentation]
>> goto fail;
>> ^~~~
>> sslKeyExchange.c:629:4: note: ...as if it were guarded by this 'if'
>clause
>> if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
>> ^~
>
>I agree that the current wording is suboptimal; certainly the wording
>would be much clearer if the wording of the "warning" only spoke about
>the
>statement in question, and the "note"/inform should then talk about the
>not-really-guarding guard.
>
>One rewording could be:
>
>sslKeyExchange.c:631:8: warning: statement is misleadingly indented...
>[-Wmisleading-indentation]
> goto fail;
> ^~~~
>sslKeyExchange.c:629:4: note: ...as if it were guarded by this 'if'
>clause, but it is not
> if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
> ^~
>
>However another Reddit user ("ksion") noted here:
>https://www.reddit.com/r/programming/comments/47pejg/gcc_6_wmisleadingindentation_vs_goto_fail/d0eqyih
>that:
>> This is just passive voice, there is nothing tricky about it.
>> What I find more confusing -- and what your fix preserves -- is the
>> reversed order of offending lines of code in the source file and the
>message.
>>
>> I'd rather go with something like this:
>> sslKeyExchange.c:629:4: warning: indentation of a statement below
>this 'if' clause... [-Wmisleading-indentation]
>> if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
>> ^~
>> sslKeyExchange.c:631:8: note: ...suggests it is guarded by the 'if'
>clause, but it's not
>> goto fail;
>> ^~~~
>> You can even see how the indentation is wrong in the very error
>message.
>
>which suggests reversing the order of the messages, so that they appear
>in "source" order.
>
>I think this is a big improvement in the readability of the warning.
>
>The attached patch implements such a change, so that the warning is
>issued on the supposed guard clause, followed by the note on the
>statement that isn't really guarded.
>
>Some examples:
>
>Wmisleading-indentation-3.c:18:3: warning: this 'for' clause does not
>guard... [-Wmisleading-indentation]
> for (i = 0; i < 10; i++)
> ^~~
>Wmisleading-indentation-3.c:20:5: note: ...this statement, but the
>latter is indented as if it does
> prod[i] = a[i] * b[i];
> ^~~~
>Wmisleading-indentation-3.c: In function 'fn_6':
>Wmisleading-indentation-3.c:39:2: warning: this 'if' clause does not
>guard... [-Wmisleading-indentation]
> if ((err = foo (b)) != 0)
> ^~
>Wmisleading-indentation-3.c:41:3: note: ...this statement, but the
>latter is indented as if it does
> goto fail;
> ^~~~
>
>I'm not totally convinced by my new wording; maybe the note could
>also mention the kind of clause ('if'/'while'/'else'/'for') for
>clarity, maybe something like:
>
>Wmisleading-indentation-3.c: In function 'fn_6':
>Wmisleading-indentation-3.c:39:2: warning: this 'if' clause does not
>guard... [-Wmisleading-indentation]
> if ((err = foo (b)) != 0)
> ^~
>Wmisleading-indentation-3.c:41:3: note: ...this statement, but the
>latter is misleadingly indented
>as if it is guarded by the 'if'
> goto fail;
> ^~~~
>
>Also, it's slightly clunkier when it comes to macros, e.g.:
>
>Wmisleading-indentation-3.c: In function 'fn_14':
>Wmisleading-indentation-3.c:60:3: warning: this 'for' clause does not
>guard... [-Wmisleading-indentation]
> for ((VAR) = (START); (VAR) < (STOP); (VAR++))
> ^
>Wmisleading-indentation-3.c:65:3: note: in expansion of macro
>'FOR_EACH'
> FOR_EACH (i, 0, 10)
> ^~~~~~~~
>Wmisleading-indentation-3.c:67:5: note: ...this statement, but the
>latter is indented as if it does
> bar (i, i);
> ^~~
>
>That said, the reordering idea is something I'd like to do for GCC 6.
>Failing that, there's the tweak to the wording suggested at the top.
>
>OK for trunk? (assuming we can agree on the wording, and that the
>latest
>version passes testing)
OK if others don't disagree.
Richard.
>gcc/c-family/ChangeLog:
> PR c/69993
> * c-indentation.c (warn_for_misleading_indentation): Rewrite the
> diagnostic text, reversing the order of the warning and note so
> that they appear in source order.
>
>gcc/testsuite/ChangeLog:
> PR c/69993
> * c-c++-common/Wmisleading-indentation-3.c: New test, based on
> Wmisleading-indentation.c.
> * c-c++-common/Wmisleading-indentation.c: Update thoughout to
> reflect change to diagnostic text and order of messages.
> * gcc.dg/plugin/location-overflow-test-2.c: Likewise.
>---
> gcc/c-family/c-indentation.c | 10 +-
> .../c-c++-common/Wmisleading-indentation-3.c | 82 ++++++++++
>.../c-c++-common/Wmisleading-indentation.c | 166
>++++++++++-----------
> .../gcc.dg/plugin/location-overflow-test-2.c | 2 +-
> 4 files changed, 171 insertions(+), 89 deletions(-)
>create mode 100644
>gcc/testsuite/c-c++-common/Wmisleading-indentation-3.c
>
>diff --git a/gcc/c-family/c-indentation.c
>b/gcc/c-family/c-indentation.c
>index 521f992..1325567 100644
>--- a/gcc/c-family/c-indentation.c
>+++ b/gcc/c-family/c-indentation.c
>@@ -579,10 +579,10 @@ warn_for_misleading_indentation (const
>token_indent_info &guard_tinfo,
> body_tinfo,
> next_tinfo))
> {
>- if (warning_at (next_tinfo.location,
>OPT_Wmisleading_indentation,
>- "statement is indented as if it were guarded by..."))
>- inform (guard_tinfo.location,
>- "...this %qs clause, but it is not",
>- guard_tinfo_to_string (guard_tinfo));
>+ if (warning_at (guard_tinfo.location,
>OPT_Wmisleading_indentation,
>+ "this %qs clause does not guard...",
>+ guard_tinfo_to_string (guard_tinfo)))
>+ inform (next_tinfo.location,
>+ "...this statement, but the latter is indented as if it does");
> }
> }
>diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation-3.c
>b/gcc/testsuite/c-c++-common/Wmisleading-indentation-3.c
>new file mode 100644
>index 0000000..7c14658
>--- /dev/null
>+++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation-3.c
>@@ -0,0 +1,82 @@
>+/* Verify -Wmisleading-indentation with source-printing.
>+ This is a subset of Wmisleading-indentation.c. */
>+
>+/* { dg-options "-Wmisleading-indentation -fdiagnostics-show-caret" }
>*/
>+/* { dg-do compile } */
>+
>+extern int foo (int);
>+extern int bar (int, int);
>+extern int flagA;
>+extern int flagB;
>+extern int flagC;
>+extern int flagD;
>+
>+void
>+fn_5 (double *a, double *b, double *sum, double *prod)
>+{
>+ int i = 0;
>+ for (i = 0; i < 10; i++) /* { dg-warning "3: this 'for' clause does
>not guard..." } */
>+ sum[i] = a[i] * b[i];
>+ prod[i] = a[i] * b[i]; /* { dg-message "5: ...this statement, but
>the latter is indented as if it does" } */
>+/* { dg-begin-multiline-output "" }
>+ for (i = 0; i < 10; i++)
>+ ^~~
>+ { dg-end-multiline-output "" } */
>+/* { dg-begin-multiline-output "" }
>+ prod[i] = a[i] * b[i];
>+ ^~~~
>+ { dg-end-multiline-output "" } */
>+}
>+
>+/* Based on CVE-2014-1266 aka "goto fail" */
>+int fn_6 (int a, int b, int c)
>+{
>+ int err;
>+
>+ /* ... */
>+ if ((err = foo (a)) != 0)
>+ goto fail;
>+ if ((err = foo (b)) != 0) /* { dg-message "2: this 'if' clause does
>not guard..." } */
>+ goto fail;
>+ goto fail; /* { dg-message "3: ...this statement, but the latter is
>indented as if it does" } */
>+ if ((err = foo (c)) != 0)
>+ goto fail;
>+ /* ... */
>+
>+/* { dg-begin-multiline-output "" }
>+ if ((err = foo (b)) != 0)
>+ ^~
>+ { dg-end-multiline-output "" } */
>+/* { dg-begin-multiline-output "" }
>+ goto fail;
>+ ^~~~
>+ { dg-end-multiline-output "" } */
>+
>+fail:
>+ return err;
>+}
>+
>+#define FOR_EACH(VAR, START, STOP) \
>+ for ((VAR) = (START); (VAR) < (STOP); (VAR++)) /* { dg-warning "3:
>this 'for' clause does not guard..." } */
>+
>+void fn_14 (void)
>+{
>+ int i;
>+ FOR_EACH (i, 0, 10) /* { dg-message "in expansion of macro
>.FOR_EACH." } */
>+ foo (i);
>+ bar (i, i); /* { dg-message "5: ...this statement, but the latter
>is indented as if it does" } */
>+
>+/* { dg-begin-multiline-output "" }
>+ for ((VAR) = (START); (VAR) < (STOP); (VAR++))
>+ ^
>+ { dg-end-multiline-output "" } */
>+/* { dg-begin-multiline-output "" }
>+ FOR_EACH (i, 0, 10)
>+ ^~~~~~~~
>+ { dg-end-multiline-output "" } */
>+/* { dg-begin-multiline-output "" }
>+ bar (i, i);
>+ ^~~
>+ { dg-end-multiline-output "" } */
>+}
>+#undef FOR_EACH
>diff --git a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
>b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
>index 25db8fe..70e60b9 100644
>--- a/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
>+++ b/gcc/testsuite/c-c++-common/Wmisleading-indentation.c
>@@ -12,17 +12,17 @@ int
> fn_1 (int flag)
> {
> int x = 4, y = 5;
>- if (flag) /* { dg-message "3: ...this 'if' clause, but it is not" }
>*/
>+ if (flag) /* { dg-warning "3: this 'if' clause does not guard..." }
>*/
> x = 3;
>- y = 2; /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ y = 2; /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> return x * y;
> }
>
> int
> fn_2 (int flag, int x, int y)
> {
>- if (flag) /* { dg-message "3: ...this 'if' clause, but it is not" }
>*/
>- x++; y++; /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ if (flag) /* { dg-warning "3: this 'if' clause does not guard..." }
>*/
>+ x++; y++; /* { dg-message "10: ...this statement, but the latter
>is indented as if it does" } */
>
> return x * y;
> }
>@@ -33,9 +33,9 @@ fn_3 (int flag)
> int x = 4, y = 5;
> if (flag)
> x = 3;
>- else /* { dg-message "3: ...this 'else' clause, but it is not" } */
>+ else /* { dg-warning "3: this 'else' clause does not guard..." } */
> x = 2;
>- y = 2; /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ y = 2; /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> return x * y;
> }
>
>@@ -43,18 +43,18 @@ void
> fn_4 (double *a, double *b, double *c)
> {
> int i = 0;
>- while (i < 10) /* { dg-message "3: ...this 'while' clause, but it is
>not" } */
>+ while (i < 10) /* { dg-warning "3: this 'while' clause does not
>guard..." } */
> a[i] = b[i] * c[i];
>- i++; /* { dg-warning "statement is indented as if it were guarded
>by..." } */
>+ i++; /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> }
>
> void
> fn_5 (double *a, double *b, double *sum, double *prod)
> {
> int i = 0;
>- for (i = 0; i < 10; i++) /* { dg-output "3: ...this 'for' clause,
>but it is not" } */
>+ for (i = 0; i < 10; i++) /* { dg-warning "3: this 'for' clause does
>not guard..." } */
> sum[i] = a[i] * b[i];
>- prod[i] = a[i] * b[i]; /* { dg-warning "statement is indented as
>if it were guarded by..." } */
>+ prod[i] = a[i] * b[i]; /* { dg-message "5: ...this statement, but
>the latter is indented as if it does" } */
> }
>
> /* Based on CVE-2014-1266 aka "goto fail" */
>@@ -65,9 +65,9 @@ int fn_6 (int a, int b, int c)
> /* ... */
> if ((err = foo (a)) != 0)
> goto fail;
>- if ((err = foo (b)) != 0) /* { dg-message "2: ...this 'if' clause,
>but it is not" } */
>+ if ((err = foo (b)) != 0) /* { dg-message "2: this 'if' clause does
>not guard..." } */
> goto fail;
>- goto fail; /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ goto fail; /* { dg-message "3: ...this statement, but the latter is
>indented as if it does" } */
> if ((err = foo (c)) != 0)
> goto fail;
> /* ... */
>@@ -80,8 +80,8 @@ int fn_7 (int p, int q, int r, int s, int t)
> {
> if (bar (p, q))
> {
>- if (p) /* { dg-message "7: ...this 'if' clause, but it is not" }
>*/
>- q++; r++; /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ if (p) /* { dg-message "7: this 'if' clause does not guard..." }
>*/
>+ q++; r++; /* { dg-message "14: ...this statement, but the
>latter is indented as if it does" } */
> t++;
> }
> return p + q + r + s + t;
>@@ -95,20 +95,20 @@ int fn_8 (int a, int b, int c)
>
> void fn_9 (int flag)
> {
>- if (flag) /* { dg-message "3: ...this 'if' clause, but it is not" }
>*/
>+ if (flag) /* { dg-warning "3: this 'if' clause does not guard..." }
>*/
> foo (0);
>- foo (1); /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ foo (1); /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> }
>
> void fn_10 (int flag)
> {
>- if (flag) /* { dg-message "3: ...this 'if' clause, but it is not" }
>*/
>+ if (flag) /* { dg-warning "3: this 'if' clause does not guard..." }
>*/
> if (flag / 2)
> {
> foo (0);
> foo (1);
> }
>- foo (2); /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ foo (2); /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> foo (3);
> }
>
>@@ -116,48 +116,48 @@ void fn_11 (void)
> {
> if (flagA)
> if (flagB)
>- if (flagC) /* { dg-message "7: ...this 'if' clause, but it is
>not" } */
>+ if (flagC) /* { dg-message "7: this 'if' clause does not
>guard..." } */
> foo (0);
>- bar (1, 2); /* { dg-warning "statement is indented as if it
>were guarded by..." } */
>+ bar (1, 2); /* { dg-message "9: ...this statement, but the
>latter is indented as if it does" } */
> }
>
> void fn_12 (void)
> {
> if (flagA)
>- if (flagB) /* { dg-message "5: ...this 'if' clause, but it is not"
>} */
>+ if (flagB) /* { dg-message "5: this 'if' clause does not guard..."
>} */
> if (flagC)
> foo (0);
>- bar (1, 2); /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ bar (1, 2); /* { dg-message "7: ...this statement, but the
>latter is indented as if it does" } */
> }
>
> void fn_13 (void)
> {
>- if (flagA) /* { dg-message "3: ...this 'if' clause, but it is not" }
>*/
>+ if (flagA) /* { dg-warning "3: this 'if' clause does not guard..." }
>*/
> if (flagB)
> if (flagC)
> foo (0);
>- bar (1, 2); /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ bar (1, 2); /* { dg-message "5: ...this statement, but the latter
>is indented as if it does" } */
> }
>
> #define FOR_EACH(VAR, START, STOP) \
>- for ((VAR) = (START); (VAR) < (STOP); (VAR++)) /* { dg-message "3:
>...this 'for' clause, but it is not" } */
>+ for ((VAR) = (START); (VAR) < (STOP); (VAR++)) /* { dg-warning "3:
>this 'for' clause does not guard..." } */
>
> void fn_14 (void)
> {
> int i;
>- FOR_EACH (i, 0, 10) /* { dg-message "3: in expansion of macro" } */
>+ FOR_EACH (i, 0, 10) /* { dg-message "in expansion of macro
>.FOR_EACH." } */
> foo (i);
>- bar (i, i); /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ bar (i, i); /* { dg-message "5: ...this statement, but the latter
>is indented as if it does" } */
> }
> #undef FOR_EACH
>
>-#define FOR_EACH(VAR, START, STOP) for ((VAR) = (START); (VAR) <
>(STOP); (VAR++)) /* { dg-message "36: ...this 'for' clause, but it is
>not" } */
>+#define FOR_EACH(VAR, START, STOP) for ((VAR) = (START); (VAR) <
>(STOP); (VAR++)) /* { dg-message "36: this 'for' clause does not
>guard..." } */
> void fn_15 (void)
> {
> int i;
>- FOR_EACH (i, 0, 10) /* { dg-message "3: in expansion of macro" } */
>+ FOR_EACH (i, 0, 10) /* { dg-message "in expansion of macro
>.FOR_EACH." } */
> foo (i);
>- bar (i, i); /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ bar (i, i); /* { dg-message "5: ...this statement, but the latter
>is indented as if it does" } */
> }
> #undef FOR_EACH
>
>@@ -166,9 +166,9 @@ void fn_16_spaces (void)
> int i;
> for (i = 0; i < 10; i++)
> while (flagA)
>- if (flagB) /* { dg-message "7: ...this 'if' clause, but it is
>not" } */
>+ if (flagB) /* { dg-message "7: this 'if' clause does not
>guard..." } */
> foo (0);
>- foo (1); /* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ foo (1); /* { dg-message "9: ...this statement, but the latter
>is indented as if it does" } */
> }
>
> void fn_16_tabs (void)
>@@ -176,49 +176,49 @@ void fn_16_tabs (void)
> int i;
> for (i = 0; i < 10; i++)
> while (flagA)
>- if (flagB) /* { dg-message "7: ...this 'if' clause, but it is
>not" } */
>+ if (flagB) /* { dg-message "7: this 'if' clause does not
>guard..." } */
> foo (0);
>- foo (1);/* { dg-warning "statement is indented as if it were guarded
>by..." } */
>+ foo (1);/* { dg-message "2: ...this statement, but the latter is
>indented as if it does" } */
> }
>
> void fn_17_spaces (void)
> {
> int i;
>- for (i = 0; i < 10; i++) /* { dg-message "3: ...this 'for' clause,
>but it is not" } */
>+ for (i = 0; i < 10; i++) /* { dg-warning "3: this 'for' clause does
>not guard..." } */
> while (flagA)
> if (flagB)
> foo (0);
>- foo (1);/* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ foo (1);/* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> }
>
> void fn_17_tabs (void)
> {
> int i;
>- for (i = 0; i < 10; i++) /* { dg-message "3: ...this 'for' clause,
>but it is not" } */
>+ for (i = 0; i < 10; i++) /* { dg-warning "3: this 'for' clause does
>not guard..." } */
> while (flagA)
> if (flagB)
> foo (0);
>- foo (1);/* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ foo (1);/* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> }
>
> void fn_18_spaces (void)
> {
> int i;
> for (i = 0; i < 10; i++)
>- while (flagA) /* { dg-message "5: ...this 'while' clause, but it
>is not" } */
>+ while (flagA) /* { dg-message "5: this 'while' clause does not
>guard..." } */
> if (flagB)
> foo (0);
>- foo (1);/* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ foo (1);/* { dg-message "7: ...this statement, but the latter is
>indented as if it does" } */
> }
>
> void fn_18_tabs (void)
> {
> int i;
> for (i = 0; i < 10; i++)
>- while (flagA) /* { dg-message "5: ...this 'while' clause, but it
>is not" } */
>+ while (flagA) /* { dg-message "5: this 'while' clause does not
>guard..." } */
> if (flagB)
> foo (0);
>- foo (1);/* { dg-warning "statement is indented as if it were
>guarded by..." } */
>+ foo (1);/* { dg-message "7: ...this statement, but the latter is
>indented as if it does" } */
> }
>
> /* This shouldn't lead to a warning. */
>@@ -701,108 +701,108 @@ fn_37 (void)
> int i;
>
> #define EMPTY
>-#define FOR_EACH(VAR, START, STOP) for (VAR = START; VAR < STOP;
>VAR++)
>+#define FOR_EACH(VAR, START, STOP) for (VAR = START; VAR < STOP;
>VAR++) /* { dg-warning "this 'for' clause" } */
>
>- while (flagA); /* { dg-message "3: ...this 'while' clause" } */
>- foo (0); /* { dg-warning "statement is indented as if" } */
>+ while (flagA); /* { dg-warning "3: this 'while' clause" } */
>+ foo (0); /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
>
> if (flagA)
> ;
>- else if (flagB); /* { dg-message "8: ...this 'if' clause" } */
>- foo (0); /* { dg-warning "statement is indented as if" } */
>- while (flagA) /* { dg-message "3: ...this 'while' clause" } */
>+ else if (flagB); /* { dg-warning "8: this 'if' clause" } */
>+ foo (0); /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
>+ while (flagA) /* { dg-warning "3: this 'while' clause" } */
> /* blah */;
>- foo (0); /* { dg-warning "statement is indented as if" } */
>+ foo (0); /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
>
> if (flagA)
> ;
>- else if (flagB) /* { dg-message "8: ...this 'if' clause" } */
>+ else if (flagB) /* { dg-warning "8: this 'if' clause" } */
> foo (1);
>- foo (2); /* { dg-warning "statement is indented as if" } */
>+ foo (2); /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
>
> if (flagA)
> foo (1);
>- else if (flagB) /* { dg-message "8: ...this 'if' clause" } */
>+ else if (flagB) /* { dg-warning "8: this 'if' clause" } */
> foo (2);
>- foo (3); /* { dg-warning "statement is indented as if" } */
>+ foo (3); /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
>
>- if (flagB) /* { dg-message "3: ...this 'if' clause" } */
>+ if (flagB) /* { dg-warning "3: this 'if' clause" } */
> /* blah */;
>- { /* { dg-warning "statement is indented as if" } */
>+ { /* { dg-message "5: ...this statement, but the latter is
>indented as if it does" } */
> foo (0);
> }
>
>- if (flagB) /* { dg-message "3: ...this 'if' clause" } */
>+ if (flagB) /* { dg-warning "3: this 'if' clause" } */
> /* blah */;
>- { /* { dg-warning "statement is indented as if" } */
>+ { /* { dg-message "4: ...this statement, but the latter is indented
>as if it does" } */
> foo (0);
> }
>
>
> if (flagB)
> ;
>- else; foo (0); /* { dg-warning "statement is indented as if" } */
>+ else; foo (0); /* { dg-warning "3: this 'else' clause" } */
>
>- if (flagC); foo (2); /* { dg-warning "statement is indented as if" }
>*/
>+ if (flagC); foo (2); /* { dg-warning "3: this 'if' clause" } */
>
>- if (flagA)
>- ; /* blah */ { /* { dg-warning "statement is indented as if" } */
>+ if (flagA) /* { dg-warning "3: this 'if' clause" } */
>+ ; /* blah */ { /* { dg-message "18: ...this statement" } */
> foo (1);
> }
>
>- if (flagB) ; /* { dg-message "3: ...this 'if' clause" } */
>- return; /* { dg-warning "statement is indented as if" } */
>+ if (flagB) ; /* { dg-warning "3: this 'if' clause" } */
>+ return; /* { dg-message "5: ...this statement" } */
>
>- if (flagB) EMPTY; /* { dg-message "3: ...this 'if' clause" } */
>- foo (1); /* { dg-warning "statement is indented as if" } */
>+ if (flagB) EMPTY; /* { dg-warning "3: this 'if' clause" } */
>+ foo (1); /* { dg-message "5: ...this statement" } */
>
>- for (i = 0; i < 10; i++); /* { dg-message "3: ...this 'for' clause"
>} */
>- foo (2); /* { dg-warning "statement is indented as if" } */
>+ for (i = 0; i < 10; i++); /* { dg-warning "3: this 'for' clause" }
>*/
>+ foo (2); /* { dg-message "5: ...this statement" } */
>
>- FOR_EACH (i, 0, 10);
>- foo (2); /* { dg-warning "statement is indented as if" } */
>+ FOR_EACH (i, 0, 10); /* { dg-message "3: in expansion of macro
>.FOR_EACH." } */
>+ foo (2); /* { dg-message "5: ...this statement" } */
>
>- FOR_EACH (i, 0, 10);
>- { /* { dg-warning "statement is indented as if" } */
>+ FOR_EACH (i, 0, 10); /* { dg-message "3: in expansion of macro
>.FOR_EACH." } */
>+ { /* { dg-message "5: ...this statement" } */
> foo (3);
> }
>
>- FOR_EACH (i, 0, 10);
>- { /* { dg-warning "statement is indented as if" } */
>+ FOR_EACH (i, 0, 10); /* { dg-message "3: in expansion of macro
>.FOR_EACH." } */
>+ { /* { dg-message "3: ...this statement" } */
> foo (3);
> }
>
>- while (i++); { /* { dg-warning "statement is indented as if" } */
>+ while (i++); { /* { dg-warning "3: this 'while' clause" } */
> foo (3);
> }
>
>- if (i++); { /* { dg-warning "statement is indented as if" } */
>+ if (i++); { /* { dg-warning "3: this 'if' clause" } */
> foo (3);
> }
>
> if (flagA) {
> foo (1);
>- } else /* { dg-message "5: ...this 'else' clause" } */
>+ } else /* { dg-warning "5: this 'else' clause" } */
> if (flagB)
> foo (2);
>- foo (3); /* { dg-warning "statement is indented as if" } */
>+ foo (3); /* { dg-message "5: ...this statement" } */
>
> if (flagA)
> foo (1);
>- else if (flagB); /* { dg-message "8: ...this 'if' clause" } */
>- foo (2); /* { dg-warning "statement is indented as if" } */
>+ else if (flagB); /* { dg-warning "8: this 'if' clause" } */
>+ foo (2); /* { dg-message "5: ...this statement" } */
>
>- for (i = 0; /* { dg-message "3: ...this 'for' clause" } */
>+ for (i = 0; /* { dg-warning "3: this 'for' clause" } */
> i < 10;
> i++);
>- foo (i); /* { dg-warning "statement is indented as if" } */
>+ foo (i); /* { dg-message "5: ...this statement" } */
>
> if (flagA)
> {
> foo (1);
> }
>- else if (flagB); /* { dg-message "8: ...this 'if' clause" } */
>- { /* { dg-warning "statement is indented as if" } */
>+ else if (flagB); /* { dg-warning "8: this 'if' clause" } */
>+ { /* { dg-message "3: ...this statement" } */
> foo (2);
> }
>
>diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-2.c
>b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-2.c
>index c8b45b6..eb37519 100644
>--- a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-2.c
>+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-2.c
>@@ -20,7 +20,7 @@ int
> fn_1 (int flag)
> {
> int foo = 4, bar = 5;
>- if (flag) foo = 3; bar = 2; /* { dg-warning "indented" } */
>+ if (flag) foo = 3; bar = 2; /* { dg-warning "this .if." } */
> return foo * bar;
> }
>