This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] use correct column info for function definitions


Hi folks.

[I need a GWP maintainer for this, btw].

In C, we are are using the opening brace of a function as the column
location for the function DECL.  This is confusing for error messages,
though rumor has it, for debugging, we need the prologue to point to the
instruction after the opening brace-- hence the current behavior.

With this patch we get both.  The function DECL gets the correct
location (the function name), and the prologue points to the correct
place (the opening brace).

I used a new field in cfun to record the prologue's location_t.
Everything else is obvious.

I will also fix the C++ (and OBJC/java if necessary), but wish to do so
in separate patches.

As an example, I have annotated gcc.dg/20041213-1.c with appropriate
column numbers.

This patch has been bootstrapped and regtested on x86_64 linux for both
the GCC and GDB testsuite.

OK for mainline?

	* function.h (struct function): Add function_start_locus.
	* cfgexpand.c (gimple_expand_cfg): Use it.
	* c-parser.c (c_parser_declaration_or_fndef): Set it.
testsuite/
	* gcc.dg/always_inline.c: Place error message on function
	name line.
	* gcc.dg/winline-6.c: Same.
	* gcc.dg/noreturn-1.c: Same.
	* gcc.dg/noreturn-7.c: Same.
	* gcc.dg/inline-14.c: Same.
	* gcc.dg/always_inline3.c: Same.
	* gcc.dg/winline-3.c: Same.
	* gcc.dg/wtr-func-def-1.c: Same.
	* gcc.dg/winline-5.c: Same.
	* gcc.dg/winline-7.c: Same.
	* gcc.dg/winline-9.c: Same.
	* gcc.dg/noreturn-4.c: Same.
	* gcc.dg/20041213-1.c: Use column numbers.

Index: testsuite/gcc.dg/always_inline.c
===================================================================
--- testsuite/gcc.dg/always_inline.c	(revision 140120)
+++ testsuite/gcc.dg/always_inline.c	(working copy)
@@ -2,8 +2,8 @@
 /* { dg-options "-Winline -O2" } */
 #include <stdarg.h>
 inline __attribute__ ((always_inline)) void
-e(int t, ...)
-{				/* { dg-message "sorry\[^\n\]*variable argument" "" } */
+e(int t, ...) /* { dg-message "sorry\[^\n\]*variable argument" "" } */
+{
   va_list q;
   va_start (q, t);
 }
Index: testsuite/gcc.dg/winline-6.c
===================================================================
--- testsuite/gcc.dg/winline-6.c	(revision 140120)
+++ testsuite/gcc.dg/winline-6.c	(working copy)
@@ -2,8 +2,8 @@
 /* { dg-options "-Winline -O2 --param large-function-growth=0 --param large-function-insns=1" } */
 
 void big (void);
-inline int q(void)
-{				/* { dg-warning "large-function-growth" } */
+inline int q(void) /* { dg-warning "large-function-growth" } */
+{
 	big();
 	big();
 	big();
Index: testsuite/gcc.dg/dg.exp
===================================================================
--- testsuite/gcc.dg/dg.exp	(revision 140120)
+++ testsuite/gcc.dg/dg.exp	(working copy)
@@ -30,7 +30,7 @@ dg-init
 
 # Main loop.
 dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cSi\]]] \
-	"" $DEFAULT_CFLAGS
+	"-fshow-column" $DEFAULT_CFLAGS
 
 # All done.
 dg-finish
Index: testsuite/gcc.dg/noreturn-1.c
===================================================================
--- testsuite/gcc.dg/noreturn-1.c	(revision 140120)
+++ testsuite/gcc.dg/noreturn-1.c	(working copy)
@@ -25,8 +25,8 @@ foo3(void)
 
 extern void foo4(void);
 void
-foo4(void)
-{ /* { dg-warning "candidate for attribute 'noreturn'" "detect noreturn candidate" } */
+foo4(void) /* { dg-warning "candidate for attribute 'noreturn'" "detect noreturn candidate" } */
+{
   exit(0);
 }
 
Index: testsuite/gcc.dg/noreturn-7.c
===================================================================
--- testsuite/gcc.dg/noreturn-7.c	(revision 140120)
+++ testsuite/gcc.dg/noreturn-7.c	(working copy)
@@ -13,8 +13,8 @@ void _exit(int status) __attribute__ ((_
 
 int z = 0;
 
-void g()
-{             /* { dg-warning "possible candidate" } */
+void g() /* { dg-warning "possible candidate" } */
+{
   if (++z > 10)
     _exit(0);
   g();
@@ -27,15 +27,15 @@ void f()
   f();
 }             /* { dg-bogus "does return" } */
 
-int h()
-{             /* { dg-warning "possible candidate" } */
+int h() /* { dg-warning "possible candidate" } */
+{
   if (++z > 10)
     _exit(0);
   return h();
 }             /* { dg-bogus "end of non-void function" } */
 
-int k()
-{             /* { dg-warning "possible candidate" } */
+int k() /* { dg-warning "possible candidate" } */
+{
   if (++z > 10)
     _exit(0);
   k();
Index: testsuite/gcc.dg/inline-14.c
===================================================================
--- testsuite/gcc.dg/inline-14.c	(revision 140120)
+++ testsuite/gcc.dg/inline-14.c	(working copy)
@@ -2,8 +2,8 @@
 /* { dg-do compile } */
 /* { dg-options "-std=c99" } */
 
-extern inline int func1 (void)
-{ /* { dg-message "note: previous definition" } */
+extern inline int func1 (void) /* { dg-message "note: previous definition" } */
+{
   return 1;
 }
 
@@ -12,8 +12,8 @@ inline int func1 (void) /* { dg-error "r
   return 1;
 }
 
-inline int func2 (void)
-{ /* { dg-message "note: previous definition" } */
+inline int func2 (void) /* { dg-message "note: previous definition" } */
+{
   return 2;
 }
 
Index: testsuite/gcc.dg/always_inline3.c
===================================================================
--- testsuite/gcc.dg/always_inline3.c	(revision 140120)
+++ testsuite/gcc.dg/always_inline3.c	(working copy)
@@ -2,8 +2,8 @@
 /* { dg-options "-Winline -O2" } */
 int do_something_evil (void);
 inline __attribute__ ((always_inline)) void
-q2(void)
-{ 				/* { dg-message "sorry\[^\n\]*recursive" "" } */
+q2(void) /* { dg-message "sorry\[^\n\]*recursive" "" } */
+{
   if (do_something_evil ())
     return;
   q2(); 			/* { dg-message "sorry\[^\n\]*called from here" "" } */
Index: testsuite/gcc.dg/20041213-1.c
===================================================================
--- testsuite/gcc.dg/20041213-1.c	(revision 140120)
+++ testsuite/gcc.dg/20041213-1.c	(working copy)
@@ -1,33 +1,33 @@
 /* { dg-do compile } */
-/* { dg-options "" } */
+/* { dg-options "-fshow-column" } */
 /* test redeclarations with void and implicit int */
-extern foo1(); /* { dg-message "note: previous declaration" } */
-extern void foo1(); /* { dg-error "conflicting types" } */
+extern foo1(); /* { dg-message "8:note: previous declaration" } */
+extern void foo1(); /* { dg-error "13:conflicting types" } */
 
-extern void foo2(); /* { dg-message "note: previous declaration" } */
-extern foo2(); /* { dg-error "conflicting types" } */
+extern void foo2(); /* { dg-message "13:note: previous declaration" } */
+extern foo2(); /* { dg-error "8:conflicting types" } */
 
-void foo3() {} /* { dg-message "note: previous definition" } */
-extern foo3(); /* { dg-error "conflicting types" } */
+void foo3() {} /* { dg-message "6:note: previous definition" } */
+extern foo3(); /* { dg-error "8:conflicting types" } */
 
-extern foo4(); /* { dg-message "note: previous declaration" } */
-void foo4() {} /* { dg-error "conflicting types" } */
+extern foo4(); /* { dg-message "8:note: previous declaration" } */
+void foo4() {} /* { dg-error "6:conflicting types" } */
 
-extern void foo5(); /* { dg-message "note: previous declaration" } */
-foo5() {} /* { dg-warning "conflicting types" } */
+extern void foo5(); /* { dg-message "13:note: previous declaration" } */
+foo5() {} /* { dg-warning "1:conflicting types" } */
 
-foo6() {} /* { dg-message "note: previous definition" } */
-extern void foo6(); /* { dg-error "conflicting types" } */
+foo6() {} /* { dg-message "1:note: previous definition" } */
+extern void foo6(); /* { dg-error "13:conflicting types" } */
 
-foo7() {} /* { dg-message "note: previous definition" } */
-void foo7() {} /* { dg-error "conflicting types" } */
+foo7() {} /* { dg-message "1:note: previous definition" } */
+void foo7() {} /* { dg-error "6:conflicting types" } */
 
-void foo8() {} /* { dg-message "note: previous definition" } */
-foo8() {} /* { dg-error "conflicting types" } */
+void foo8() {} /* { dg-message "6:note: previous definition" } */
+foo8() {} /* { dg-error "1:conflicting types" } */
 
 int use9() { foo9(); } /* { dg-message "note: previous implicit declaration" } */
-extern void foo9(); /* { dg-warning "conflicting types" } */
+extern void foo9(); /* { dg-warning "13:conflicting types" } */
 
 int use10() { foo10(); } /* { dg-message "note: previous implicit declaration" } */
-void foo10() {} /* { dg-warning "conflicting types" } */
+void foo10() {} /* { dg-warning "6:conflicting types" } */
 
Index: testsuite/gcc.dg/winline-3.c
===================================================================
--- testsuite/gcc.dg/winline-3.c	(revision 140120)
+++ testsuite/gcc.dg/winline-3.c	(working copy)
@@ -2,8 +2,8 @@
 /* { dg-options "-Winline -O2 --param max-inline-insns-single=1" } */
 
 void big (void);
-inline int q(void)		
-{				/* { dg-warning "max-inline-insns-single" "" } */
+inline int q(void) /* { dg-warning "max-inline-insns-single" "" } */
+{
 	big();
 	big();
 	big();
Index: testsuite/gcc.dg/wtr-func-def-1.c
===================================================================
--- testsuite/gcc.dg/wtr-func-def-1.c	(revision 140120)
+++ testsuite/gcc.dg/wtr-func-def-1.c	(working copy)
@@ -6,8 +6,8 @@
 
 /* Test some simple cases.  */
 
-void f_void1 (void)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_void1 (void) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
@@ -16,8 +16,8 @@ void f_void2 ()
   return;
 }
 
-void f_int1 (int f)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_int1 (int f) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
@@ -29,8 +29,8 @@ void f_int2 (f)
 
 /* Test that we don't ever warn about nested functions.  */
 
-void f_int3 (int f)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_int3 (int f) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   void f3a (void) { return; }
   void f3b () { return; }
   void f3c (int f) { return; }
@@ -39,8 +39,8 @@ void f_int3 (int f)
   return;
 }
 
-void f_int4 (int f)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_int4 (int f) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   void f4a (void) { return; }
   void f4b () { return; }
   void f4c (int f) { return; }
@@ -77,14 +77,14 @@ void f_int6 (f)
    are still warned about.  */
 
 extern void f_int_p1 (int);
-void f_int_p1 (int f)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_int_p1 (int f) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
 extern void f_int_p2 (int f);
-void f_int_p2 (int f)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_int_p2 (int f) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
@@ -103,14 +103,14 @@ void f_int_p4 (f)
 }
 
 extern void f_void_p1 ();
-void f_void_p1 (void)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_void_p1 (void) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
 extern void f_void_p2 (void);
-void f_void_p2 (void)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_void_p2 (void) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
@@ -133,39 +133,39 @@ f_impl1()
   return 0;
 }
 
-f_impl2(void)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+f_impl2(void) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return 0;
 }
 
-f_impl3(int f)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+f_impl3(int f) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return 0;
 }
 
 /* Test stdarg functions.  */
 
-f_stdarg1(const char *s, ...)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+f_stdarg1(const char *s, ...) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return 0;
 }
 
-void f_stdarg2(const char *s, ...)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_stdarg2(const char *s, ...) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
 extern void f_stdarg3(const char *, ...);
-void f_stdarg3(const char *s, ...)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_stdarg3(const char *s, ...) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
 /* Test handling function pointer parameters.  */
 
 void f_fnptr1 (int f, int (*fp)(int));
-void f_fnptr1 (int f, int (*fp)(int))
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+void f_fnptr1 (int f, int (*fp)(int)) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return;
 }
 
@@ -180,8 +180,8 @@ void f_fnptr2 (f, fp)
 /* Test for main.  */
 
 int
-main (int argc, char **argv)
-{ /* { dg-warning "traditional C rejects ISO C style" } */
+main (int argc, char **argv) /* { dg-warning "traditional C rejects ISO C style" } */
+{
   return 0;
 }
 
Index: testsuite/gcc.dg/winline-5.c
===================================================================
--- testsuite/gcc.dg/winline-5.c	(revision 140120)
+++ testsuite/gcc.dg/winline-5.c	(working copy)
@@ -2,8 +2,8 @@
 /* { dg-options "-Winline -O2 --param inline-unit-growth=0 --param large-unit-insns=0" } */
 
 void big (void);
-inline int q(void)		 
-{				/* { dg-warning "inline-unit-growth" } */
+inline int q(void) /* { dg-warning "inline-unit-growth" } */
+{
 	big();
 	big();
 	big();
Index: testsuite/gcc.dg/winline-7.c
===================================================================
--- testsuite/gcc.dg/winline-7.c	(revision 140120)
+++ testsuite/gcc.dg/winline-7.c	(working copy)
@@ -4,8 +4,8 @@
 extern void *alloca (__SIZE_TYPE__);
 
 void big (void);
-inline void *q (void)
-{				/* { dg-warning "(function not inlinable|alloca)" } */
+inline void *q (void) /* { dg-warning "(function not inlinable|alloca)" } */
+{
 	return alloca (10);
 }
 inline void *t (void)
Index: testsuite/gcc.dg/winline-9.c
===================================================================
--- testsuite/gcc.dg/winline-9.c	(revision 140120)
+++ testsuite/gcc.dg/winline-9.c	(working copy)
@@ -10,8 +10,8 @@ int aa (void)
   test(t);
 }
 static inline
-int bb (void)
-{ 				/* { dg-warning "large-stack-frame" "" } */
+int bb (void) /* { dg-warning "large-stack-frame" "" } */
+{
   char t[100];
   test(t);
 }
Index: testsuite/gcc.dg/noreturn-4.c
===================================================================
--- testsuite/gcc.dg/noreturn-4.c	(revision 140120)
+++ testsuite/gcc.dg/noreturn-4.c	(working copy)
@@ -4,7 +4,7 @@
 extern void exit (int) __attribute__ ((__noreturn__));
 
 int
-main (void)
-{ /* { dg-warning "function might be possible candidate for attribute 'noreturn'" "warn for main" } */
+main (void) /* { dg-warning "function might be possible candidate for attribute 'noreturn'" "warn for main" } */
+{
   exit (0);
 }
Index: function.h
===================================================================
--- function.h	(revision 140120)
+++ function.h	(working copy)
@@ -527,6 +527,9 @@ struct function GTY(())
   /* Last statement uid.  */
   int last_stmt_uid;
 
+  /* Line number of the start of the function for debugging purposes.  */
+  location_t function_start_locus;
+
   /* Line number of the end of the function.  */
   location_t function_end_locus;
 
Index: cfgexpand.c
===================================================================
--- cfgexpand.c	(revision 140120)
+++ cfgexpand.c	(working copy)
@@ -2261,7 +2261,14 @@ gimple_expand_cfg (void)
 
   insn_locators_alloc ();
   if (!DECL_BUILT_IN (current_function_decl))
-    set_curr_insn_source_location (DECL_SOURCE_LOCATION (current_function_decl));
+    {
+      /* Eventually, all FEs should explicitly set function_start_locus.  */
+      if (cfun->function_start_locus == UNKNOWN_LOCATION)
+       set_curr_insn_source_location
+         (DECL_SOURCE_LOCATION (current_function_decl));
+      else
+       set_curr_insn_source_location (cfun->function_start_locus);
+    }
   set_curr_insn_block (DECL_INITIAL (current_function_decl));
   prologue_locator = curr_insn_locator ();
 
Index: c-parser.c
===================================================================
--- c-parser.c	(revision 140120)
+++ c-parser.c	(working copy)
@@ -1301,9 +1301,9 @@ c_parser_declaration_or_fndef (c_parser 
       while (c_parser_next_token_is_not (parser, CPP_EOF)
 	     && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
 	c_parser_declaration_or_fndef (parser, false, false, true, false);
-      DECL_SOURCE_LOCATION (current_function_decl)
-	= c_parser_peek_token (parser)->location;
       store_parm_decls ();
+      DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus
+	= c_parser_peek_token (parser)->location;
       fnbody = c_parser_compound_statement (parser);
       if (nested)
 	{


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]