diff options
author | Joseph Myers <joseph@codesourcery.com> | 2009-05-17 17:09:02 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2009-05-17 17:09:02 +0100 |
commit | 8fa6fa79177806a38422c7c13a29a8fc12e38bf3 (patch) | |
tree | da819afeb90729a922ba304170d19bdb52a8fc0e /gcc | |
parent | e0a6661b792947c0f09d6bdb3b9ee98723b2993f (diff) | |
download | gcc-8fa6fa79177806a38422c7c13a29a8fc12e38bf3.zip gcc-8fa6fa79177806a38422c7c13a29a8fc12e38bf3.tar.gz gcc-8fa6fa79177806a38422c7c13a29a8fc12e38bf3.tar.bz2 |
tree.c (cxx_printable_name_internal): Allow consecutive translated and untranslated cached copies of the name of the...
cp:
* tree.c (cxx_printable_name_internal): Allow consecutive
translated and untranslated cached copies of the name of the
current function.
testsuite:
* g++.dg/warn/translate-ice-1.C: New test.
From-SVN: r147636
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/tree.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/translate-ice-1.C | 45 |
4 files changed, 64 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7bd5f93..bffec90 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-05-17 Joseph Myers <joseph@codesourcery.com> + + * tree.c (cxx_printable_name_internal): Allow consecutive + translated and untranslated cached copies of the name of the + current function. + 2009-05-15 Ian Lance Taylor <iant@google.com> * cp-tree.h (enum cp_lvalue_kind_flags): Rename from diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 9cc767d..219cb39 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1264,10 +1264,15 @@ cxx_printable_name_internal (tree decl, int v, bool translate) if (current_function_decl != NULL_TREE) { - if (uid_ring[ring_counter] == DECL_UID (current_function_decl)) - ring_counter += 1; - if (ring_counter == PRINT_RING_SIZE) - ring_counter = 0; + /* There may be both translated and untranslated versions of the + name cached. */ + for (i = 0; i < 2; i++) + { + if (uid_ring[ring_counter] == DECL_UID (current_function_decl)) + ring_counter += 1; + if (ring_counter == PRINT_RING_SIZE) + ring_counter = 0; + } gcc_assert (uid_ring[ring_counter] != DECL_UID (current_function_decl)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7007901..2f0e185 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-05-17 Joseph Myers <joseph@codesourcery.com> + + * g++.dg/warn/translate-ice-1.C: New test. + 2009-05-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> * gfortran.dg/c_kind_int128_test1.f03: Also test C_INT_FAST128_T. diff --git a/gcc/testsuite/g++.dg/warn/translate-ice-1.C b/gcc/testsuite/g++.dg/warn/translate-ice-1.C new file mode 100644 index 0000000..22e103c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/translate-ice-1.C @@ -0,0 +1,45 @@ +// Test ICE in caching printable names for a function. +// { dg-options "-std=c++98 -pedantic -O2" } + +void g (int a) __attribute__((warning("g"))); +void g2 (int a, int *p); +static inline __attribute__((__always_inline__)) void +gg (int a) +{ + if (a == 0) + return g(a); // { dg-warning "attribute" } + __extension__ int v[a]; + return g2(a, v); +} + +void h (int a) __attribute__((warning("h"))); +void h2 (int a, int *p); +static inline __attribute__((__always_inline__)) void +hh (int a) +{ + if (a == 0) + return h(a); // { dg-warning "attribute" } + __extension__ int v[a]; + return h2(a, v); +} + +void i (int a) __attribute__((warning("i"))); +void i2 (int a, int *p); +static inline __attribute__((__always_inline__)) void +ii (int a) +{ + if (a == 0) + return i(a); // { dg-warning "attribute" } + __extension__ int v[a]; + return i2(a, v); +} + +void +f (void) +{ + long long l; // { dg-warning "long long" } + const char *p = __PRETTY_FUNCTION__; + gg(0); + hh(0); + ii(0); +} |