diff options
author | Jason Merrill <jason@redhat.com> | 2012-07-02 23:30:09 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2012-07-02 23:30:09 -0400 |
commit | e961d86e328e92a0df37f374af176ce24cfbd2d4 (patch) | |
tree | 97abf62f4571e48455d2b7dc15434fc31b0980fb /gcc | |
parent | 65f0c5b308fc97731b8d34236c4852ac58db2d29 (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/decltype39.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/method1.C | 4 |
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" } |