> Your patch hides the caret but the location still points to the
> closing brace (so if you use an IDE like emacs this is where you will
> go).
>
> Is there a location for the definition? Could we store/pass one to this
> point?
>
> Otherwise, would it be appropriate to point to the declaration of the
> function? After all, this is what -fstack-usage seems to do.
Good idea, let's use a consistent location, revised patch attached, thanks.
2014-07-12 Eric Botcazou <ebotca...@adacore.com>
* toplev.c (output_stack_usage): Adjust the location and temporarily
hide the caret.
2014-07-12 Eric Botcazou <ebotca...@adacore.com>
* gcc.dg/stack-usage-2.c: Adjust.
--
Eric Botcazou
Index: toplev.c
===================================================================
--- toplev.c (revision 212477)
+++ toplev.c (working copy)
@@ -1052,17 +1052,24 @@ output_stack_usage (void)
if (warn_stack_usage >= 0)
{
+ const location_t loc = DECL_SOURCE_LOCATION (current_function_decl);
+ /* Avoid displaying the caret which is useless here. */
+ const bool saved_show_caret = global_dc->show_caret;
+ global_dc->show_caret = false;
+
if (stack_usage_kind == DYNAMIC)
- warning (OPT_Wstack_usage_, "stack usage might be unbounded");
+ warning_at (loc, OPT_Wstack_usage_, "stack usage might be unbounded");
else if (stack_usage > warn_stack_usage)
{
if (stack_usage_kind == DYNAMIC_BOUNDED)
- warning (OPT_Wstack_usage_, "stack usage might be %wd bytes",
- stack_usage);
+ warning_at (loc, OPT_Wstack_usage_, "stack usage might be %wd bytes",
+ stack_usage);
else
- warning (OPT_Wstack_usage_, "stack usage is %wd bytes",
- stack_usage);
+ warning_at (loc, OPT_Wstack_usage_, "stack usage is %wd bytes",
+ stack_usage);
}
+
+ global_dc->show_caret = saved_show_caret;
}
}
Index: testsuite/gcc.dg/stack-usage-2.c
===================================================================
--- testsuite/gcc.dg/stack-usage-2.c (revision 212477)
+++ testsuite/gcc.dg/stack-usage-2.c (working copy)
@@ -1,33 +1,32 @@
/* { dg-do compile } */
/* { dg-options "-Wstack-usage=512" } */
-int foo1 (void)
+int foo1 (void) /* { dg-bogus "stack usage" } */
{
char arr[16];
arr[0] = 1;
return 0;
-} /* { dg-bogus "stack usage" } */
+}
-int foo2 (void)
+int foo2 (void) /* { dg-warning "stack usage is \[0-9\]* bytes" } */
{
char arr[1024];
arr[0] = 1;
return 0;
-} /* { dg-warning "stack usage is \[0-9\]* bytes" } */
+}
-int foo3 (void)
+int foo3 (void) /* { dg-warning "stack usage might be \[0-9\]* bytes" } */
{
char arr[1024] __attribute__((aligned (512)));
arr[0] = 1;
/* Force dynamic realignment of argument pointer. */
__builtin_apply ((void (*)()) foo2, 0, 0);
return 0;
+}
-} /* { dg-warning "stack usage might be \[0-9\]* bytes" } */
-
-int foo4 (int n)
+int foo4 (int n) /* { dg-warning "stack usage might be unbounded" } */
{
char arr[n];
arr[0] = 1;
return 0;
-} /* { dg-warning "stack usage might be unbounded" } */
+}