From: jakub Date: Fri, 10 Jul 2009 11:56:55 +0000 (+0000) Subject: PR c++/40502 X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=abc9203d05ba4144a884af0d6f786e21da7b9315;p=pf3gnuchains%2Fgcc-fork.git PR c++/40502 * error.c (cp_print_error_function): Check for NULL block. * g++.dg/ext/strncpy-chk1.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149470 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 604ba46ba33..c29e32da3ba 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ +2009-07-10 Jakub Jelinek + + PR c++/40502 + * error.c (cp_print_error_function): Check for NULL block. + 2008-07-09 Simon Martin - Jason Merrill + Jason Merrill * pt.c (perform_typedefs_access_check, get_types_needing_access_check, append_type_to_template_for_access_check_1): Use CLASS_TYPE_P. diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 850f4069a17..a0ba51a6ceb 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2603,7 +2603,7 @@ cp_print_error_function (diagnostic_context *context, while (block && TREE_CODE (block) == BLOCK) block = BLOCK_SUPERCONTEXT (block); - if (TREE_CODE (block) == FUNCTION_DECL) + if (block && TREE_CODE (block) == FUNCTION_DECL) fndecl = block; abstract_origin = NULL; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4cb33062864..7e7be1169e6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-07-10 Jakub Jelinek + + PR c++/40502 + * g++.dg/ext/strncpy-chk1.C: New test. + 2009-07-10 Richard Guenther PR tree-optimization/40496 diff --git a/gcc/testsuite/g++.dg/ext/strncpy-chk1.C b/gcc/testsuite/g++.dg/ext/strncpy-chk1.C new file mode 100644 index 00000000000..7770ba93127 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/strncpy-chk1.C @@ -0,0 +1,31 @@ +// PR c++/40502 +// { dg-do compile } +// { dg-options "-O2" } + +struct A { char x[12], y[35]; }; +struct B { char z[50]; }; + +inline void +foo (char *dest, const char *__restrict src, __SIZE_TYPE__ n) +{ + __builtin___strncpy_chk (dest, src, n, __builtin_object_size (dest, 0)); // { dg-warning "will always overflow" } +} + +void bar (const char *, int); + +inline void +baz (int i) +{ + char s[128], t[32]; + bar (s, 0); + bar (t, i); + A a; + B b; + foo (a.y, b.z, 36); +} + +void +test () +{ + baz (0); +}