Patchwork C++ PATCH for c++/45983 (-flto trying to emit template parm)

login
register
mail settings
Submitter Jason Merrill
Date Oct. 15, 2010, 9:43 p.m.
Message ID <4CB8CB10.2010505@redhat.com>
Download mbox | patch
Permalink /patch/68004/
State New
Headers show

Comments

Jason Merrill - Oct. 15, 2010, 9:43 p.m.
The bug in this testcase was that cp_build_qualified_type's array 
handling was treating an array of a typedef as identical to an array of 
a non-typedef, which allowed a typedef from a template to be reused outside.

Tested x86_64-pc-linux-gnu, applied to trunk.

Patch

commit 2a6ccacef80355a5b8867c85f409a9d02e065f9e
Author: Jason Merrill <jason@redhat.com>
Date:   Fri Oct 15 17:12:27 2010 -0400

    	PR c++/45983
    	* tree.c (cp_build_qualified_type_real): Don't reuse a variant
    	with a different typedef variant of the element type.

diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 93d13a1..b8f76b0 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -810,7 +810,7 @@  cp_build_qualified_type_real (tree type,
       /* See if we already have an identically qualified type.  Tests
 	 should be equivalent to those in check_qualified_type.  */
       for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
-	if (cp_type_quals (t) == type_quals
+	if (TREE_TYPE (t) == element_type
 	    && TYPE_NAME (t) == TYPE_NAME (type)
 	    && TYPE_CONTEXT (t) == TYPE_CONTEXT (type)
 	    && attribute_list_equal (TYPE_ATTRIBUTES (t),
diff --git a/gcc/testsuite/g++.dg/lto/pr45983_0.C b/gcc/testsuite/g++.dg/lto/pr45983_0.C
new file mode 100644
index 0000000..a2c9ba6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr45983_0.C
@@ -0,0 +1,20 @@ 
+// PR c++/45983
+
+template <int N>
+class T1 {
+    int m[N];
+    typedef float scalar_type_t;
+    typedef scalar_type_t scalar_array_t[1];
+    const scalar_array_t &decay(void) const;
+};
+class T2 {
+public:
+    float vals[1];
+    float get_value(void) const { return vals[0]; }
+};
+T2 channel_params;
+float output_audio(void) {
+    return channel_params.get_value();
+}
+
+int main(){}