diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-01-26 03:13:49 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-01-26 03:13:49 +0000 |
commit | cdbcf94296dac1488e42fae9cdd193fb827ce4bf (patch) | |
tree | 0c78d892037be972339a54108a5239aaec45f49e | |
parent | 635a078f08c4a00f83976f47362b314fc0e2c305 (diff) | |
download | gcc-cdbcf94296dac1488e42fae9cdd193fb827ce4bf.tar.gz |
PR c++/13833
* call.c (build_over_call): Do not convert arguments when
processing a template.
* pt.c (build_non_dependent_expr): Do not build a
NON_DEPENDENT_EXPR for arithmetic constants.
PR c++/13833
* g++.dg/template/cond3.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@76616 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/call.c | 15 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/cond3.C | 15 |
5 files changed, 47 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5171c70f963..a463df6d813 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2004-01-25 Mark Mitchell <mark@codesourcery.com> + + PR c++/13833 + * call.c (build_over_call): Do not convert arguments when + processing a template. + * pt.c (build_non_dependent_expr): Do not build a + NON_DEPENDENT_EXPR for arithmetic constants. + 2004-01-25 Giovanni Bajo <giovannibajo@gcc.gnu.org> PR c++/13810 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5fefefe6a9e..ea494c7b8c5 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4306,6 +4306,21 @@ build_over_call (struct z_candidate *cand, int flags) int i = 0; int is_method = 0; + /* In a template, there is no need to perform all of the work that + is normally done. We are only interested in the type of the call + expression, i.e., the return type of the function. Any semantic + errors will be deferred until the template is instantiated. */ + if (processing_template_decl) + { + tree expr; + tree return_type; + return_type = TREE_TYPE (TREE_TYPE (fn)); + expr = build (CALL_EXPR, return_type, fn, args); + if (!VOID_TYPE_P (return_type)) + require_complete_type (return_type); + return convert_from_reference (expr); + } + /* Give any warnings we noticed during overload resolution. */ if (cand->warnings) for (val = cand->warnings; val; val = TREE_CHAIN (val)) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2178e90e924..a9ab858ff96 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11993,6 +11993,10 @@ build_non_dependent_expr (tree expr) cannot be used to initialize a "char *". */ if (TREE_CODE (expr) == STRING_CST) return expr; + /* Preserve arithmetic constants, as an optimization -- there is no + reason to create a new node. */ + if (TREE_CODE (expr) == INTEGER_CST || TREE_CODE (expr) == REAL_CST) + return expr; if (TREE_CODE (expr) == COND_EXPR) return build (COND_EXPR, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8a7b5d0d16..b1920033286 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-01-25 Mark Mitchell <mark@codesourcery.com> + + PR c++/13833 + * g++.dg/template/cond3.C: New test. + 2004-01-25 Giovanni Bajo <giovannibajo@gcc.gnu.org> PR c++/13810 diff --git a/gcc/testsuite/g++.dg/template/cond3.C b/gcc/testsuite/g++.dg/template/cond3.C new file mode 100644 index 00000000000..788b3754a61 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond3.C @@ -0,0 +1,15 @@ +// PR c++/13833 + +struct X { + template <typename T> + X & operator << (const T &t); + X & operator<< (int& (*p) (int&)); +}; + +X x; + +template <int> void foo () { + x << (1 ? "ok" : "failed"); +} + +template void foo<1>(); |