aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-10-03 19:28:15 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-10-03 19:28:15 -0400
commit79fe346e8aac0fecd659ba7433107ea3e86a4cd6 (patch)
tree591b863df38402e3a26c6e201f36025b6da5f227
parent82a1c2fe690f15bfa0b91b54a7f1746acad0a1ef (diff)
downloadgcc-79fe346e8aac0fecd659ba7433107ea3e86a4cd6.zip
gcc-79fe346e8aac0fecd659ba7433107ea3e86a4cd6.tar.gz
gcc-79fe346e8aac0fecd659ba7433107ea3e86a4cd6.tar.bz2
typeck.c (require_complete_type_sfinae): Add complain parm to...
* typeck.c (require_complete_type_sfinae): Add complain parm to... (require_complete_type): ...this function. (cp_build_array_ref, convert_arguments): Use it. (convert_for_initialization, cp_build_modify_expr): Likewise. * cp-tree.h: Declare it. * call.c (build_over_call): Use it. From-SVN: r164918
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/typeck.c21
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/sfinae5.C16
6 files changed, 45 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8c201d7..c5c40f8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2010-10-03 Jason Merrill <jason@redhat.com>
+
+ * typeck.c (require_complete_type_sfinae): Add complain parm to...
+ (require_complete_type): ...this function.
+ (cp_build_array_ref, convert_arguments): Use it.
+ (convert_for_initialization, cp_build_modify_expr): Likewise.
+ * cp-tree.h: Declare it.
+ * call.c (build_over_call): Use it.
+
2010-09-30 Iain Sandoe <iains@gcc.gnu.org>
merge from FSF 'apple/trunk' branch.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 2e7083d..e0911ac 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5655,7 +5655,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
if (TREE_THIS_VOLATILE (fn) && cfun)
current_function_returns_abnormally = 1;
if (!VOID_TYPE_P (return_type))
- require_complete_type (return_type);
+ require_complete_type_sfinae (return_type, complain);
return convert_from_reference (expr);
}
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index aa1fe4d..6ce10e6 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -5432,6 +5432,7 @@ extern int string_conv_p (const_tree, const_tree, int);
extern tree cp_truthvalue_conversion (tree);
extern tree condition_conversion (tree);
extern tree require_complete_type (tree);
+extern tree require_complete_type_sfinae (tree, tsubst_flags_t);
extern tree complete_type (tree);
extern tree complete_type_or_else (tree, tree);
extern tree complete_type_or_maybe_complain (tree, tree, tsubst_flags_t);
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index eff6704..b2b8e5f 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -64,11 +64,11 @@ static int convert_arguments (tree, VEC(tree,gc) **, tree, int,
/* Do `exp = require_complete_type (exp);' to make sure exp
does not have an incomplete type. (That includes void types.)
- Returns the error_mark_node if the VALUE does not have
+ Returns error_mark_node if the VALUE does not have
complete type when this function returns. */
tree
-require_complete_type (tree value)
+require_complete_type_sfinae (tree value, tsubst_flags_t complain)
{
tree type;
@@ -87,12 +87,18 @@ require_complete_type (tree value)
if (COMPLETE_TYPE_P (type))
return value;
- if (complete_type_or_else (type, value))
+ if (complete_type_or_maybe_complain (type, value, complain))
return value;
else
return error_mark_node;
}
+tree
+require_complete_type (tree value)
+{
+ return require_complete_type_sfinae (value, tf_warning_or_error);
+}
+
/* Try to complete TYPE, if it is incomplete. For example, if TYPE is
a template instantiation, do the instantiation. Returns TYPE,
whether or not it could be completed, unless something goes
@@ -3039,7 +3045,8 @@ cp_build_array_ref (location_t loc, tree array, tree idx,
|= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
TREE_THIS_VOLATILE (rval)
|= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
- ret = require_complete_type (fold_if_not_in_template (rval));
+ ret = require_complete_type_sfinae (fold_if_not_in_template (rval),
+ complain);
protected_set_expr_location (ret, loc);
return ret;
}
@@ -3542,7 +3549,7 @@ convert_arguments (tree typelist, VEC(tree,gc) **values, tree fndecl,
/* Don't do ellipsis conversion for __built_in_constant_p
as this will result in spurious errors for non-trivial
types. */
- val = require_complete_type (val);
+ val = require_complete_type_sfinae (val, complain);
else
val = convert_arg_to_ellipsis (val);
@@ -6744,7 +6751,7 @@ cp_build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
}
else
{
- lhs = require_complete_type (lhs);
+ lhs = require_complete_type_sfinae (lhs, complain);
if (lhs == error_mark_node)
return error_mark_node;
@@ -7592,7 +7599,7 @@ convert_for_initialization (tree exp, tree type, tree rhs, int flags,
}
if (exp != 0)
- exp = require_complete_type (exp);
+ exp = require_complete_type_sfinae (exp, complain);
if (exp == error_mark_node)
return error_mark_node;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3319f7a..269e4e0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-10-03 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/sfinae5.C: New.
+
2010-10-02 H.J. Lu <hongjiu.lu@intel.com>
PR tree-optimization/45720
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae5.C b/gcc/testsuite/g++.dg/cpp0x/sfinae5.C
new file mode 100644
index 0000000..8474fb3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/sfinae5.C
@@ -0,0 +1,16 @@
+// { dg-options -std=c++0x }
+
+template<class T>
+T&& create();
+
+template <class T, class U,
+ class = decltype(create<T>() = create<U>())
+ >
+char test(int);
+
+template <class, class>
+double test(...);
+
+int main() {
+ test<int[], int[]>(0); // #1
+}