+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
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)
{
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 ();
/* 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;
+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
/* { 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" } */
/* { 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);
}
/* { 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" "" } */
/* { 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;
}
return 1;
}
-inline int func2 (void)
-{ /* { dg-message "note: previous definition" } */
+inline int func2 (void) /* { dg-message "note: previous definition" } */
+{
return 2;
}
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);
}
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);
}
int z = 0;
-void g()
-{ /* { dg-warning "possible candidate" } */
+void g() /* { dg-warning "possible candidate" } */
+{
if (++z > 10)
_exit(0);
g();
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();
/* { 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();
/* { 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();
/* { 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();
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)
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);
}
/* 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;
}
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;
}
/* 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; }
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; }
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;
}
}
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;
}
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;
}
/* 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;
}