aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-04-07 17:46:57 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-04-07 17:46:57 -0400
commit5b97c77f8caedb9434ef5feab416154403d24123 (patch)
treeb64c1b85c092e3d9f6bf16001c2ca4d87f53360a /gcc
parent1ee44b260d206b5ebc51466d672adffcdcebf4f2 (diff)
downloadgcc-5b97c77f8caedb9434ef5feab416154403d24123.zip
gcc-5b97c77f8caedb9434ef5feab416154403d24123.tar.gz
gcc-5b97c77f8caedb9434ef5feab416154403d24123.tar.bz2
semantics.c (finish_decltype_type): Add complain parm.
* semantics.c (finish_decltype_type): Add complain parm. * cp-tree.h: Adjust. * parser.c (cp_parser_decltype): Adjust. * pt.c (tsubst): Adjust. From-SVN: r172139
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/parser.c3
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/cp/semantics.c16
-rw-r--r--gcc/testsuite/ChangeLog2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/sfinae7.C20
7 files changed, 42 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5ffe1f5..b9c94ac 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2011-04-07 Jason Merrill <jason@redhat.com>
+ * semantics.c (finish_decltype_type): Add complain parm.
+ * cp-tree.h: Adjust.
+ * parser.c (cp_parser_decltype): Adjust.
+ * pt.c (tsubst): Adjust.
+
PR c++/48450
* cvt.c (ocp_convert): Handle converting scoped enum to bool.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 6ef6e6e..06b0b3e 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -5346,7 +5346,7 @@ extern tree baselink_for_fns (tree);
extern void finish_static_assert (tree, tree, location_t,
bool);
extern tree describable_type (tree);
-extern tree finish_decltype_type (tree, bool);
+extern tree finish_decltype_type (tree, bool, tsubst_flags_t);
extern tree finish_trait_expr (enum cp_trait_kind, tree, tree);
extern tree build_lambda_expr (void);
extern tree build_lambda_object (tree);
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 9ed3a1f..607e9b8 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -10197,7 +10197,8 @@ cp_parser_decltype (cp_parser *parser)
return error_mark_node;
}
- return finish_decltype_type (expr, id_expression_or_member_access_p);
+ return finish_decltype_type (expr, id_expression_or_member_access_p,
+ tf_warning_or_error);
}
/* Special member functions [gram.special] */
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5960e46..66db880 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -11025,7 +11025,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
type = lambda_return_type (type);
else
type = finish_decltype_type
- (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t));
+ (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t), complain);
return cp_build_qualified_type_real (type,
cp_type_quals (t)
| cp_type_quals (type),
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index a15740a..80ec028 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4785,7 +4785,8 @@ describable_type (tree expr)
a full expression. */
tree
-finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
+finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
+ tsubst_flags_t complain)
{
tree orig_expr = expr;
tree type = NULL_TREE;
@@ -4798,7 +4799,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
|| (TREE_CODE (expr) == BIT_NOT_EXPR
&& TYPE_P (TREE_OPERAND (expr, 0))))
{
- error ("argument to decltype must be an expression");
+ if (complain & tf_error)
+ error ("argument to decltype must be an expression");
return error_mark_node;
}
@@ -4864,7 +4866,9 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
if (OVL_CHAIN (expr)
|| TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL)
{
- error ("%qE refers to a set of overloaded functions", orig_expr);
+ if (complain & tf_error)
+ error ("%qE refers to a set of overloaded functions",
+ orig_expr);
return error_mark_node;
}
else
@@ -4916,7 +4920,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
default:
gcc_assert (TYPE_P (expr) || DECL_P (expr)
|| TREE_CODE (expr) == SCOPE_REF);
- error ("argument to decltype must be an expression");
+ if (complain & tf_error)
+ error ("argument to decltype must be an expression");
return error_mark_node;
}
}
@@ -4954,7 +4959,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
if (!type || type == unknown_type_node)
{
- error ("type of %qE is unknown", expr);
+ if (complain & tf_error)
+ error ("type of %qE is unknown", expr);
return error_mark_node;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dabb816..9d5f63d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,7 @@
2011-04-07 Jason Merrill <jason@redhat.com>
+ * g++.dg/cpp0x/sfinae7.C: New.
+
* g++.dg/cpp0x/enum9.C: New.
2011-04-07 Mike Stump <mikestump@comcast.net>
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae7.C b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C
new file mode 100644
index 0000000..0a95a96
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C
@@ -0,0 +1,20 @@
+// { dg-options -std=c++0x }
+
+struct A
+{
+ void f();
+ void f(int);
+ typedef int g;
+};
+
+template <class T> decltype (T::f) f();
+template <class T> void f();
+
+template <class T> decltype (T::g) g();
+template <class T> void g();
+
+int main()
+{
+ f<A>();
+ g<A>();
+}