From: jsm28 Date: Sun, 17 May 2009 16:09:02 +0000 (+0000) Subject: cp: X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=212f33bb6b2d864ac61fe0f022b005f32ae9cbc6 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147636 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7bd5f934812..bffec90178c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-05-17 Joseph Myers + + * 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 * cp-tree.h (enum cp_lvalue_kind_flags): Rename from diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 9cc767da07c..219cb399f9c 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 7007901e075..2f0e185267c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-05-17 Joseph Myers + + * g++.dg/warn/translate-ice-1.C: New test. + 2009-05-17 Francois-Xavier Coudert * 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 00000000000..22e103c2980 --- /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); +}