From 30099c0c3b0dd7c5395eb2946e75a16f900f297a Mon Sep 17 00:00:00 2001 From: aldyh Date: Tue, 9 Sep 2008 10:56:23 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140144 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++ gcc/c-parser.c | 4 +-- gcc/cfgexpand.c | 9 +++++- gcc/function.h | 3 ++ gcc/testsuite/ChangeLog | 17 ++++++++++ gcc/testsuite/gcc.dg/20041213-1.c | 38 +++++++++++----------- gcc/testsuite/gcc.dg/always_inline.c | 4 +-- gcc/testsuite/gcc.dg/always_inline3.c | 4 +-- gcc/testsuite/gcc.dg/inline-14.c | 8 ++--- gcc/testsuite/gcc.dg/noreturn-1.c | 4 +-- gcc/testsuite/gcc.dg/noreturn-4.c | 4 +-- gcc/testsuite/gcc.dg/noreturn-7.c | 12 +++---- gcc/testsuite/gcc.dg/winline-3.c | 4 +-- gcc/testsuite/gcc.dg/winline-5.c | 4 +-- gcc/testsuite/gcc.dg/winline-6.c | 4 +-- gcc/testsuite/gcc.dg/winline-7.c | 4 +-- gcc/testsuite/gcc.dg/winline-9.c | 4 +-- gcc/testsuite/gcc.dg/wtr-func-def-1.c | 60 +++++++++++++++++------------------ 18 files changed, 113 insertions(+), 80 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 970450b..d5d0719 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-09 Aldy Hernandez + + * 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 PR tree-optimization/37433 diff --git a/gcc/c-parser.c b/gcc/c-parser.c index b7f3a17..43ef655 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -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) { diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index ac228f9..d9e9835 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -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 (); diff --git a/gcc/function.h b/gcc/function.h index eb85e3c..e6214b3 100644 --- a/gcc/function.h +++ b/gcc/function.h @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1378257..2d18227 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,20 @@ +2008-09-09 Aldy Hernandez + + * 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 PR tree-optimization/37433 diff --git a/gcc/testsuite/gcc.dg/20041213-1.c b/gcc/testsuite/gcc.dg/20041213-1.c index be1ab00..aeff744 100644 --- a/gcc/testsuite/gcc.dg/20041213-1.c +++ b/gcc/testsuite/gcc.dg/20041213-1.c @@ -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" } */ diff --git a/gcc/testsuite/gcc.dg/always_inline.c b/gcc/testsuite/gcc.dg/always_inline.c index 3233741..08119f1 100644 --- a/gcc/testsuite/gcc.dg/always_inline.c +++ b/gcc/testsuite/gcc.dg/always_inline.c @@ -2,8 +2,8 @@ /* { dg-options "-Winline -O2" } */ #include 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); } diff --git a/gcc/testsuite/gcc.dg/always_inline3.c b/gcc/testsuite/gcc.dg/always_inline3.c index db06843..97c80aa 100644 --- a/gcc/testsuite/gcc.dg/always_inline3.c +++ b/gcc/testsuite/gcc.dg/always_inline3.c @@ -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" "" } */ diff --git a/gcc/testsuite/gcc.dg/inline-14.c b/gcc/testsuite/gcc.dg/inline-14.c index 15b2d40..b2bfb67 100644 --- a/gcc/testsuite/gcc.dg/inline-14.c +++ b/gcc/testsuite/gcc.dg/inline-14.c @@ -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; } diff --git a/gcc/testsuite/gcc.dg/noreturn-1.c b/gcc/testsuite/gcc.dg/noreturn-1.c index 3bd6a26..1e7a778 100644 --- a/gcc/testsuite/gcc.dg/noreturn-1.c +++ b/gcc/testsuite/gcc.dg/noreturn-1.c @@ -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); } diff --git a/gcc/testsuite/gcc.dg/noreturn-4.c b/gcc/testsuite/gcc.dg/noreturn-4.c index 5bc78ab..bcc29da 100644 --- a/gcc/testsuite/gcc.dg/noreturn-4.c +++ b/gcc/testsuite/gcc.dg/noreturn-4.c @@ -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); } diff --git a/gcc/testsuite/gcc.dg/noreturn-7.c b/gcc/testsuite/gcc.dg/noreturn-7.c index 8ae5e23..1913be1f 100644 --- a/gcc/testsuite/gcc.dg/noreturn-7.c +++ b/gcc/testsuite/gcc.dg/noreturn-7.c @@ -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(); diff --git a/gcc/testsuite/gcc.dg/winline-3.c b/gcc/testsuite/gcc.dg/winline-3.c index ce9e080..d586cba 100644 --- a/gcc/testsuite/gcc.dg/winline-3.c +++ b/gcc/testsuite/gcc.dg/winline-3.c @@ -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(); diff --git a/gcc/testsuite/gcc.dg/winline-5.c b/gcc/testsuite/gcc.dg/winline-5.c index 57fa393..ad1fc41 100644 --- a/gcc/testsuite/gcc.dg/winline-5.c +++ b/gcc/testsuite/gcc.dg/winline-5.c @@ -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(); diff --git a/gcc/testsuite/gcc.dg/winline-6.c b/gcc/testsuite/gcc.dg/winline-6.c index dd8d3a8..4e22ce1 100644 --- a/gcc/testsuite/gcc.dg/winline-6.c +++ b/gcc/testsuite/gcc.dg/winline-6.c @@ -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(); diff --git a/gcc/testsuite/gcc.dg/winline-7.c b/gcc/testsuite/gcc.dg/winline-7.c index bab82a2..19262da 100644 --- a/gcc/testsuite/gcc.dg/winline-7.c +++ b/gcc/testsuite/gcc.dg/winline-7.c @@ -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) diff --git a/gcc/testsuite/gcc.dg/winline-9.c b/gcc/testsuite/gcc.dg/winline-9.c index f6cd237..fddf5c6 100644 --- a/gcc/testsuite/gcc.dg/winline-9.c +++ b/gcc/testsuite/gcc.dg/winline-9.c @@ -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); } diff --git a/gcc/testsuite/gcc.dg/wtr-func-def-1.c b/gcc/testsuite/gcc.dg/wtr-func-def-1.c index 32d613e..049e05b 100644 --- a/gcc/testsuite/gcc.dg/wtr-func-def-1.c +++ b/gcc/testsuite/gcc.dg/wtr-func-def-1.c @@ -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; } -- 2.7.4