aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-07-02 23:30:09 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-07-02 23:30:09 -0400
commite961d86e328e92a0df37f374af176ce24cfbd2d4 (patch)
tree97abf62f4571e48455d2b7dc15434fc31b0980fb /gcc
parent65f0c5b308fc97731b8d34236c4852ac58db2d29 (diff)
downloadgcc-e961d86e328e92a0df37f374af176ce24cfbd2d4.zip
gcc-e961d86e328e92a0df37f374af176ce24cfbd2d4.tar.gz
gcc-e961d86e328e92a0df37f374af176ce24cfbd2d4.tar.bz2
re PR c++/53788 (C++11 decltype sfinae static member function check (4.7.1))
PR c++/53788 * pt.c (build_non_dependent_expr): Don't wrap a dummy object. From-SVN: r189188
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype39.C19
-rw-r--r--gcc/testsuite/g++.dg/diagnostic/method1.C4
5 files changed, 31 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f00ff70..e09166b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2012-07-02 Jason Merrill <jason@redhat.com>
+ PR c++/53788
+ * pt.c (build_non_dependent_expr): Don't wrap a dummy object.
+
PR c++/53816
* class.c (resolves_to_fixed_type_p): Check uses_template_parms
(current_function_decl) instead of processing_template_decl.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f8f416a..563a1ad 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -20215,6 +20215,10 @@ build_non_dependent_expr (tree expr)
if (BRACE_ENCLOSED_INITIALIZER_P (expr))
return expr;
+ /* Don't wrap a dummy object, we need to be able to test for it. */
+ if (is_dummy_object (expr))
+ return expr;
+
if (TREE_CODE (expr) == COND_EXPR)
return build3 (COND_EXPR,
TREE_TYPE (expr),
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fc71284..56b83e4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2012-07-02 Jason Merrill <jason@redhat.com>
+ PR c++/53788
+ * g++.dg/cpp0x/decltype39.C: New.
+ * g++.dg/diagnostic/method1.C: Adjust.
+
PR c++/53816
* g++.dg/template/ref6.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype39.C b/gcc/testsuite/g++.dg/cpp0x/decltype39.C
new file mode 100644
index 0000000..4676d2d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype39.C
@@ -0,0 +1,19 @@
+// PR c++/53788
+// { dg-do compile { target c++11 } }
+
+struct t { static const bool value = true; };
+struct f { static const bool value = false; };
+
+template<typename T>
+struct has_static {
+ template<typename X>
+ static t check(X*, decltype(T::fun())* = 0); // { dg-error "without object" }
+ static f check(...);
+
+ typedef decltype(check((T*)(0))) ret;
+ static const bool value = ret::value;
+};
+
+struct test { int fun() { return 0; } };
+
+bool b = has_static<test>::value;
diff --git a/gcc/testsuite/g++.dg/diagnostic/method1.C b/gcc/testsuite/g++.dg/diagnostic/method1.C
index 4a78104..0e7c580 100644
--- a/gcc/testsuite/g++.dg/diagnostic/method1.C
+++ b/gcc/testsuite/g++.dg/diagnostic/method1.C
@@ -10,7 +10,7 @@ template <class T>
void
bar ()
{
- A::foo ().anything; // { dg-error "request for member" }
+ A::foo ().anything; // { dg-error "without object" }
}
void
@@ -18,5 +18,3 @@ baz ()
{
bar <int> ();
}
-
-// { dg-prune-output "without object" }