pt.c (maybe_fold_nontype_arg): Use TREE_TYPE of ARG as the criterion to avoid rebuilding expression tree...

* pt.c (maybe_fold_nontype_arg): Use TREE_TYPE of ARG as the
	criterion to avoid rebuilding expression tree instead of
	processing_template_decl.

	* g++.dg/template/unify1.C: New test.

From-SVN: r44793
This commit is contained in:
Kriang Lerdsuwanakij 2001-08-11 12:21:17 +00:00 committed by Kriang Lerdsuwanakij
parent 91b54f7f3f
commit 4d5f3fbd61
4 changed files with 49 additions and 10 deletions

View File

@ -1,3 +1,9 @@
2001-08-11 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
* pt.c (maybe_fold_nontype_arg): Use TREE_TYPE of ARG as the
criterion to avoid rebuilding expression tree instead of
processing_template_decl.
2001-08-07 Jason Merrill <jason_merrill@redhat.com>
Support named return value optimization for inlines, too.

View File

@ -5280,12 +5280,7 @@ static tree
maybe_fold_nontype_arg (arg)
tree arg;
{
/* If we're not in a template, ARG is already as simple as it's going to
get, and trying to reprocess the trees will break. */
if (! processing_template_decl)
return arg;
if (!TYPE_P (arg) && !uses_template_parms (arg))
if (arg && !TYPE_P (arg) && !uses_template_parms (arg))
{
/* Sometimes, one of the args was an expression involving a
template constant parameter, like N - 1. Now that we've
@ -5295,10 +5290,18 @@ maybe_fold_nontype_arg (arg)
fool build_expr_from_tree() into building an actual
tree. */
int saved_processing_template_decl = processing_template_decl;
processing_template_decl = 0;
arg = fold (build_expr_from_tree (arg));
processing_template_decl = saved_processing_template_decl;
/* If the TREE_TYPE of ARG is not NULL_TREE, ARG is already
as simple as it's going to get, and trying to reprocess
the trees will break. */
if (!TREE_TYPE (arg))
{
int saved_processing_template_decl = processing_template_decl;
processing_template_decl = 0;
arg = build_expr_from_tree (arg);
processing_template_decl = saved_processing_template_decl;
}
arg = fold (arg);
}
return arg;
}

View File

@ -1,3 +1,7 @@
2001-08-11 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
* g++.dg/template/unify1.C: New test.
2001-08-07 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/abi/empty4.C: New test.

View File

@ -0,0 +1,26 @@
// Test non-type template argument folding.
// Origin: smacdonald@seimac.com
// { dg-do compile }
template < int I1, int I2 >
class unit
{
public:
unit() {}
unit( const unit<I1,I2>& ) {}
template< int Q1, int Q2 >
unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const {
return unit< I1 - Q1, I2 - Q2 >();
}
};
int main()
{
const unit<1,0> u1;
const unit<2,0> u2;
unit<-1,0> u3( u1 / u2 );
}