re PR c++/12774 (Type checking problems in templates)
cp: PR c++/12774 * typeck.c (comp_array_types): Fold non-dependent domains for ABI-1. testsuite: PR c++/12774 * g++.dg/template/array1-1.C: New test. * g++.dg/template/array1-2.C: New test. From-SVN: r75204
This commit is contained in:
parent
b66906a8ff
commit
30a035080e
@ -1,3 +1,9 @@
|
||||
2003-12-29 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/12774
|
||||
* typeck.c (comp_array_types): Fold non-dependent domains for
|
||||
ABI-1.
|
||||
|
||||
2003-12-29 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
PR c++/13289
|
||||
|
@ -857,6 +857,7 @@ comp_array_types (tree t1, tree t2, bool allow_redeclaration)
|
||||
{
|
||||
tree d1;
|
||||
tree d2;
|
||||
tree max1, max2;
|
||||
|
||||
if (t1 == t2)
|
||||
return true;
|
||||
@ -887,8 +888,27 @@ comp_array_types (tree t1, tree t2, bool allow_redeclaration)
|
||||
return allow_redeclaration;
|
||||
|
||||
/* Check that the dimensions are the same. */
|
||||
return (cp_tree_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2))
|
||||
&& cp_tree_equal (TYPE_MAX_VALUE (d1), TYPE_MAX_VALUE (d2)));
|
||||
|
||||
if (!cp_tree_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)))
|
||||
return false;
|
||||
max1 = TYPE_MAX_VALUE (d1);
|
||||
max2 = TYPE_MAX_VALUE (d2);
|
||||
if (processing_template_decl && !abi_version_at_least (2)
|
||||
&& !value_dependent_expression_p (max1)
|
||||
&& !value_dependent_expression_p (max2))
|
||||
{
|
||||
/* With abi-1 we do not fold non-dependent array bounds, (and
|
||||
consequently mangle them incorrectly). We must therefore
|
||||
fold them here, to verify the domains have the same
|
||||
value. */
|
||||
max1 = fold (max1);
|
||||
max2 = fold (max2);
|
||||
}
|
||||
|
||||
if (!cp_tree_equal (max1, max2))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Return true if T1 and T2 are related as allowed by STRICT. STRICT
|
||||
|
@ -1,3 +1,9 @@
|
||||
2003-12-29 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/12774
|
||||
* g++.dg/template/array1-1.C: New test.
|
||||
* g++.dg/template/array1-2.C: New test.
|
||||
|
||||
2003-12-29 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
PR fortran/12632
|
||||
|
32
gcc/testsuite/g++.dg/template/array1-1.C
Normal file
32
gcc/testsuite/g++.dg/template/array1-1.C
Normal file
@ -0,0 +1,32 @@
|
||||
// { dg-do compile }
|
||||
// { dg-options "-fabi-version=1" }
|
||||
|
||||
// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com>
|
||||
// Origin: Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
// PR c++/12774 Array domains compared unequal
|
||||
|
||||
void Foo(double r[3][3])
|
||||
{
|
||||
}
|
||||
|
||||
void Baz()
|
||||
{
|
||||
double m[3][3];
|
||||
Foo(m);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void Bar()
|
||||
{
|
||||
double m[3][3];
|
||||
Foo(m);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
Baz();
|
||||
Bar<int>();
|
||||
return 0;
|
||||
}
|
||||
|
32
gcc/testsuite/g++.dg/template/array1-2.C
Normal file
32
gcc/testsuite/g++.dg/template/array1-2.C
Normal file
@ -0,0 +1,32 @@
|
||||
// { dg-do compile }
|
||||
// { dg-options "-fabi-version=2" }
|
||||
|
||||
// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com>
|
||||
// Origin: Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
// PR c++/12774 Array domains compared unequal
|
||||
|
||||
void Foo(double r[3][3])
|
||||
{
|
||||
}
|
||||
|
||||
void Baz()
|
||||
{
|
||||
double m[3][3];
|
||||
Foo(m);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void Bar()
|
||||
{
|
||||
double m[3][3];
|
||||
Foo(m);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
Baz();
|
||||
Bar<int>();
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user