* function.h (struct function): Add function_start_locus.
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Sep 2008 10:56:23 +0000 (10:56 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Sep 2008 10:56:23 +0000 (10:56 +0000)
        * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140144 138bc75d-0d04-0410-961f-82ee72b054a4

18 files changed:
gcc/ChangeLog
gcc/c-parser.c
gcc/cfgexpand.c
gcc/function.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20041213-1.c
gcc/testsuite/gcc.dg/always_inline.c
gcc/testsuite/gcc.dg/always_inline3.c
gcc/testsuite/gcc.dg/inline-14.c
gcc/testsuite/gcc.dg/noreturn-1.c
gcc/testsuite/gcc.dg/noreturn-4.c
gcc/testsuite/gcc.dg/noreturn-7.c
gcc/testsuite/gcc.dg/winline-3.c
gcc/testsuite/gcc.dg/winline-5.c
gcc/testsuite/gcc.dg/winline-6.c
gcc/testsuite/gcc.dg/winline-7.c
gcc/testsuite/gcc.dg/winline-9.c
gcc/testsuite/gcc.dg/wtr-func-def-1.c

index 970450b..d5d0719 100644 (file)
@@ -1,3 +1,9 @@
+2008-09-09  Aldy Hernandez  <aldyh@redhat.com>
+
+       * 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.
+
 2008-09-09  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/37433
index b7f3a17..43ef655 100644 (file)
@@ -1301,9 +1301,9 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
       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 ac228f9..d9e9835 100644 (file)
@@ -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 eb85e3c..e6214b3 100644 (file)
@@ -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 1378257..2d18227 100644 (file)
@@ -1,3 +1,20 @@
+2008-09-09  Aldy Hernandez  <aldyh@redhat.com>
+
+       * 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.
+
 2008-09-09  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/37433
index be1ab00..aeff744 100644 (file)
@@ -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 3233741..08119f1 100644 (file)
@@ -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 db06843..97c80aa 100644 (file)
@@ -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 15b2d40..b2bfb67 100644 (file)
@@ -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 "redefinition" } */
   return 1;
 }
 
-inline int func2 (void)
-{ /* { dg-message "note: previous definition" } */
+inline int func2 (void) /* { dg-message "note: previous definition" } */
+{
   return 2;
 }
 
index 3bd6a26..1e7a778 100644 (file)
@@ -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 5bc78ab..bcc29da 100644 (file)
@@ -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 8ae5e23..1913be1 100644 (file)
@@ -13,8 +13,8 @@ void _exit(int status) __attribute__ ((__noreturn__));
 
 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 ce9e080..d586cba 100644 (file)
@@ -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 57fa393..ad1fc41 100644 (file)
@@ -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 dd8d3a8..4e22ce1 100644 (file)
@@ -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 bab82a2..19262da 100644 (file)
@@ -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 f6cd237..fddf5c6 100644 (file)
@@ -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 32d613e..049e05b 100644 (file)
@@ -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;
 }