summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2004-01-26 03:13:49 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2004-01-26 03:13:49 +0000
commitcdbcf94296dac1488e42fae9cdd193fb827ce4bf (patch)
tree0c78d892037be972339a54108a5239aaec45f49e
parent635a078f08c4a00f83976f47362b314fc0e2c305 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/call.c15
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/cond3.C15
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>();