From 4d5f3fbd61ad7e6a13424fa720bda3888d6ef429 Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Sat, 11 Aug 2001 12:21:17 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 23 +++++++++++++---------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/template/unify1.C | 26 ++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/unify1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f62396a07c..29894a3a3fc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2001-08-11 Kriang Lerdsuwanakij + + * 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 Support named return value optimization for inlines, too. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1f40089a4b5..853fd817643 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c5058bd70d5..c360084b36b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-08-11 Kriang Lerdsuwanakij + + * g++.dg/template/unify1.C: New test. + 2001-08-07 Nathan Sidwell * g++.dg/abi/empty4.C: New test. diff --git a/gcc/testsuite/g++.dg/template/unify1.C b/gcc/testsuite/g++.dg/template/unify1.C new file mode 100644 index 00000000000..2f0a18cf457 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify1.C @@ -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& ) {} + + 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 ); +} -- 2.30.2