Patchwork [pph] Fix template class tables streaming (issue5199041)

login
register
mail settings
Submitter Diego Novillo
Date Oct. 5, 2011, 8:02 p.m.
Message ID <20111005200210.2F5D91DA1A5@topo.tor.corp.google.com>
Download mbox | patch
Permalink /patch/117912/
State New
Headers show

Comments

Diego Novillo - Oct. 5, 2011, 8:02 p.m.
This fixes the problem I described in
http://gcc.gnu.org/ml/gcc-patches/2011-10/msg00376.html

The tests are now failing assembly comparisons because the elements in
these tables are emitted in different sequence in the pph and non-pph
case.  Other than that, the assembly produced is identical.

Tested on x86_64.  Committed to branch.


Diego.

cp/ChangeLog.pph

	* pt.c (reregister_specialization):  Call htab_find_slot with
	NO_INSERT.

testsuite/ChangeLog.pph

	* g++.dg/pph/x1tmplclass2.cc: Mark partially fixed.
	* g++.dg/pph/x4tmplclass2.cc: Likewise.
	* g++.dg/pph/z4tmplclass2.cc: Likewise.


--
This patch is available for review at http://codereview.appspot.com/5199041

Patch

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 04e7767..2366dc9 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1648,8 +1648,8 @@  reregister_specialization (tree spec, tree tinfo, tree new_spec)
   elt.args = TI_ARGS (tinfo);
   elt.spec = NULL_TREE;
 
-  slot = (spec_entry **) htab_find_slot (decl_specializations, &elt, INSERT);
-  if (*slot)
+  slot = (spec_entry **) htab_find_slot (decl_specializations, &elt, NO_INSERT);
+  if (slot && *slot)
     {
       gcc_assert ((*slot)->spec == spec || (*slot)->spec == new_spec);
       gcc_assert (new_spec != NULL_TREE);
diff --git a/gcc/testsuite/g++.dg/pph/x1tmplclass2.cc b/gcc/testsuite/g++.dg/pph/x1tmplclass2.cc
index f04335d..a254106 100644
--- a/gcc/testsuite/g++.dg/pph/x1tmplclass2.cc
+++ b/gcc/testsuite/g++.dg/pph/x1tmplclass2.cc
@@ -1,5 +1,3 @@ 
-// { dg-xfail-if "BOGUS" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "x1tmplclass2.cc:1:0: internal compiler error: in pph_in_record_marker, at cp/pph-streamer.h" "" { xfail *-*-* } 0 }
-
+// pph asm xdiff 37711
 #include "x0tmplclass23.h"
 #include "a0tmplclass2_u.h"
diff --git a/gcc/testsuite/g++.dg/pph/x4tmplclass2.cc b/gcc/testsuite/g++.dg/pph/x4tmplclass2.cc
index 585d4c0..e605e40 100644
--- a/gcc/testsuite/g++.dg/pph/x4tmplclass2.cc
+++ b/gcc/testsuite/g++.dg/pph/x4tmplclass2.cc
@@ -1,6 +1,4 @@ 
-// { dg-xfail-if "BOGUS" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "x4tmplclass2.cc:1:0: internal compiler error: in pph_in_record_marker, at cp/pph-streamer.h" "" { xfail *-*-* } 0 }
-
+// pph asm xdiff 49533
 #include "x0tmplclass21.h"
 #include "x0tmplclass22.h"
 #include "a0tmplclass2_u.h"
diff --git a/gcc/testsuite/g++.dg/pph/z4tmplclass2.cc b/gcc/testsuite/g++.dg/pph/z4tmplclass2.cc
index 0243829..d025942 100644
--- a/gcc/testsuite/g++.dg/pph/z4tmplclass2.cc
+++ b/gcc/testsuite/g++.dg/pph/z4tmplclass2.cc
@@ -1,6 +1,4 @@ 
-// { dg-xfail-if "BOGUS" { "*-*-*" } { "-fpph-map=pph.map" } }
-// { dg-bogus "z4tmplclass2.cc:1:0: internal compiler error: in pph_in_record_marker, at cp/pph-streamer.h" "" { xfail *-*-* } 0 }
-
+// pph asm xdiff 59292
 #include "x0tmplclass23.h"
 #include "x0tmplclass24.h"
 #include "a0tmplclass2_u.h"