From 9304142e10e1d694d07b6fde8118a69e06fa7e56 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 10 Jul 2009 13:56:55 +0200 Subject: [PATCH] re PR middle-end/40502 (crash in cp_diagnostic_starter) PR c++/40502 * error.c (cp_print_error_function): Check for NULL block. * g++.dg/ext/strncpy-chk1.C: New test. From-SVN: r149470 --- gcc/cp/ChangeLog | 7 +++++- gcc/cp/error.c | 2 +- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/ext/strncpy-chk1.C | 31 +++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/strncpy-chk1.C 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); +} -- 2.30.2