From 2e6491515ec153d17427a635cdfbfbc5bda0a7f1 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 3 Jun 2013 20:39:50 +0000 Subject: re PR c++/57419 (Access control doesn't stop referring to a deleted function) /gcc/cp 2013-06-03 Paolo Carlini PR c++/57419 * decl2.c (mark_used): Add overload taking a tsubst_flags_t too. * semantics.c (finish_qualified_id_expr): Use it. * cp-tree.h: Update. /gcc/testsuite 2013-06-03 Paolo Carlini PR c++/57419 * g++.dg/cpp0x/sfinae46.C: New. * g++.dg/cpp0x/defaulted13.C: Adjust. * g++.dg/cpp0x/defaulted2.C: Likewise. * g++.dg/cpp0x/defaulted26.C: Likewise. * g++.dg/cpp0x/defaulted3.C: Likewise. * g++.dg/cpp0x/error1.C: Likewise. * g++.dg/cpp0x/implicit1.C: Likewise. * g++.dg/cpp0x/implicit11.C: Likewise. * g++.dg/cpp0x/inh-ctor13.C: Likewise. * g++.dg/cpp0x/initlist47.C: Likewise. * g++.dg/cpp0x/initlist9.C: Likewise. * g++.dg/cpp0x/lambda/lambda-errloc.C: Likewise. * g++.dg/cpp0x/lambda/lambda-errloc2.C: Likewise. * g++.dg/cpp0x/nsdmi-local.C: Likewise. * g++.dg/cpp0x/union4.C: Likewise. * g++.dg/template/crash108.C: Likewise. * g++.dg/template/crash41.C: Likewise. * g++.old-deja/g++.jason/local.C: Likewise. * g++.old-deja/g++.law/visibility3.C: Likewise. /libstdc++-v3 2013-06-03 Paolo Carlini PR c++/57419 * testsuite/20_util/default_delete/48631_neg.cc: Adjust. From-SVN: r199626 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/cp-tree.h | 1 + gcc/cp/decl2.c | 20 ++++++++++++++----- gcc/cp/semantics.c | 5 +++-- gcc/testsuite/ChangeLog | 23 ++++++++++++++++++++++ gcc/testsuite/g++.dg/cpp0x/defaulted13.C | 4 ++-- gcc/testsuite/g++.dg/cpp0x/defaulted2.C | 2 +- gcc/testsuite/g++.dg/cpp0x/defaulted26.C | 2 +- gcc/testsuite/g++.dg/cpp0x/defaulted3.C | 2 +- gcc/testsuite/g++.dg/cpp0x/error1.C | 2 +- gcc/testsuite/g++.dg/cpp0x/implicit1.C | 2 +- gcc/testsuite/g++.dg/cpp0x/implicit11.C | 2 +- gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C | 2 +- gcc/testsuite/g++.dg/cpp0x/initlist47.C | 2 +- gcc/testsuite/g++.dg/cpp0x/initlist9.C | 2 +- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C | 2 +- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C | 2 +- gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C | 2 +- gcc/testsuite/g++.dg/cpp0x/sfinae46.C | 13 ++++++++++++ gcc/testsuite/g++.dg/cpp0x/union4.C | 2 +- gcc/testsuite/g++.dg/template/crash108.C | 2 +- gcc/testsuite/g++.dg/template/crash41.C | 2 +- gcc/testsuite/g++.old-deja/g++.jason/local.C | 2 +- gcc/testsuite/g++.old-deja/g++.law/visibility3.C | 2 +- 24 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/sfinae46.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8dc30f9..a30a7d6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2013-06-03 Paolo Carlini + + PR c++/57419 + * decl2.c (mark_used): Add overload taking a tsubst_flags_t too. + * semantics.c (finish_qualified_id_expr): Use it. + * cp-tree.h: Update. + 2013-06-01 Jan Hubicka * decl2.c (cp_write_global_declarations): Replace same_body_alias diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index aebc440..8be1077 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5278,6 +5278,7 @@ extern bool decl_constant_var_p (tree); extern bool decl_maybe_constant_var_p (tree); extern void check_default_args (tree); extern bool mark_used (tree); +extern bool mark_used (tree, tsubst_flags_t); extern void finish_static_data_member_decl (tree, tree, bool, tree, int); extern tree cp_build_parm_decl (tree, tree); extern tree get_guard (tree); diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 3fe234e..5e7dbcd 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -4499,7 +4499,7 @@ possibly_inlined_p (tree decl) wrong, true otherwise. */ bool -mark_used (tree decl) +mark_used (tree decl, tsubst_flags_t complain) { /* If DECL is a BASELINK for a single function, then treat it just like the DECL for the function. Otherwise, if the BASELINK is @@ -4537,9 +4537,12 @@ mark_used (tree decl) return false; } } - error ("use of deleted function %qD", decl); - if (!maybe_explain_implicit_delete (decl)) - error_at (DECL_SOURCE_LOCATION (decl), "declared here"); + if (complain & tf_error) + { + error ("use of deleted function %qD", decl); + if (!maybe_explain_implicit_delete (decl)) + inform (DECL_SOURCE_LOCATION (decl), "declared here"); + } return false; } @@ -4552,7 +4555,8 @@ mark_used (tree decl) { if (!processing_template_decl && type_uses_auto (TREE_TYPE (decl))) { - error ("use of %qD before deduction of %", decl); + if (complain & tf_error) + error ("use of %qD before deduction of %", decl); return false; } return true; @@ -4701,4 +4705,10 @@ mark_used (tree decl) return true; } +bool +mark_used (tree decl) +{ + return mark_used (decl, tf_warning_or_error); +} + #include "gt-cp-decl2.h" diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c1385c1..048a7db 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1778,8 +1778,9 @@ finish_qualified_id_expr (tree qualifying_class, if (error_operand_p (expr)) return error_mark_node; - if (DECL_P (expr) || BASELINK_P (expr)) - mark_used (expr); + if ((DECL_P (expr) || BASELINK_P (expr)) + && !mark_used (expr, complain)) + return error_mark_node; if (template_p) check_template_keyword (expr); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 54f0fa2..a1f0827 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,26 @@ +2013-06-03 Paolo Carlini + + PR c++/57419 + * g++.dg/cpp0x/sfinae46.C: New. + * g++.dg/cpp0x/defaulted13.C: Adjust. + * g++.dg/cpp0x/defaulted2.C: Likewise. + * g++.dg/cpp0x/defaulted26.C: Likewise. + * g++.dg/cpp0x/defaulted3.C: Likewise. + * g++.dg/cpp0x/error1.C: Likewise. + * g++.dg/cpp0x/implicit1.C: Likewise. + * g++.dg/cpp0x/implicit11.C: Likewise. + * g++.dg/cpp0x/inh-ctor13.C: Likewise. + * g++.dg/cpp0x/initlist47.C: Likewise. + * g++.dg/cpp0x/initlist9.C: Likewise. + * g++.dg/cpp0x/lambda/lambda-errloc.C: Likewise. + * g++.dg/cpp0x/lambda/lambda-errloc2.C: Likewise. + * g++.dg/cpp0x/nsdmi-local.C: Likewise. + * g++.dg/cpp0x/union4.C: Likewise. + * g++.dg/template/crash108.C: Likewise. + * g++.dg/template/crash41.C: Likewise. + * g++.old-deja/g++.jason/local.C: Likewise. + * g++.old-deja/g++.law/visibility3.C: Likewise. + 2013-06-03 Teresa Johnson * gcc.dg/vect/bb-slp-31.c: Update vect dump message. diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted13.C b/gcc/testsuite/g++.dg/cpp0x/defaulted13.C index 8b23579..5ddbcb3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted13.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted13.C @@ -7,13 +7,13 @@ struct NonCopyable { }; template<> -NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-error "declared" } +NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-message "declared" } template NonCopyable::NonCopyable(NonCopyable const&) = default; template<> -NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-error "declared" } +NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-message "declared" } int main() diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted2.C b/gcc/testsuite/g++.dg/cpp0x/defaulted2.C index e3aac8f..ce551a3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted2.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted2.C @@ -42,7 +42,7 @@ struct E struct F { F() = default; - F(const F&) = delete; // { dg-error "declared" } + F(const F&) = delete; // { dg-message "declared" } }; struct G diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted26.C b/gcc/testsuite/g++.dg/cpp0x/defaulted26.C index 69bd0ac..746fa90 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted26.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted26.C @@ -1,7 +1,7 @@ // PR c++/49066 // { dg-options -std=c++0x } -void foo() = delete; // { dg-error "declared here" } +void foo() = delete; // { dg-message "declared here" } void foo(); int main() { foo(); } // { dg-error "deleted" } diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted3.C b/gcc/testsuite/g++.dg/cpp0x/defaulted3.C index 5e2116b..bc5b14d 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted3.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted3.C @@ -4,7 +4,7 @@ template struct A { template - bool operator==(const A&) = delete; // { dg-error "declared" } + bool operator==(const A&) = delete; // { dg-message "declared" } operator bool () { return true; } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/error1.C b/gcc/testsuite/g++.dg/cpp0x/error1.C index 751b3b7..15cd38f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/error1.C +++ b/gcc/testsuite/g++.dg/cpp0x/error1.C @@ -2,7 +2,7 @@ // { dg-do compile } // { dg-options "-std=c++0x" } -template void foo (int... x[N]) // { dg-error "int \\\[N\\\]\\.\\.\\. x" } +template void foo (int... x[N]) // { dg-message "int \\\[N\\\]\\.\\.\\. x" } { struct A { diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit1.C b/gcc/testsuite/g++.dg/cpp0x/implicit1.C index 2efbde6..e4e16e1 100644 --- a/gcc/testsuite/g++.dg/cpp0x/implicit1.C +++ b/gcc/testsuite/g++.dg/cpp0x/implicit1.C @@ -15,7 +15,7 @@ D d; // { dg-error "deleted" } struct E { - ~E() = delete; // { dg-error "declared here" } + ~E() = delete; // { dg-message "declared here" } }; struct F diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit11.C b/gcc/testsuite/g++.dg/cpp0x/implicit11.C index 7ec8e95..c974e2b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/implicit11.C +++ b/gcc/testsuite/g++.dg/cpp0x/implicit11.C @@ -4,7 +4,7 @@ struct A { - ~A() = delete; // { dg-error "declared here" } + ~A() = delete; // { dg-message "declared here" } }; struct B: A { }; // { dg-error "deleted" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C index 2e18e5d..95cf932 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C @@ -8,7 +8,7 @@ struct A struct C { - C() = delete; // { dg-error "declared here" } + C() = delete; // { dg-message "declared here" } }; struct B: A, C diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist47.C b/gcc/testsuite/g++.dg/cpp0x/initlist47.C index b76fb58..06d683e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist47.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist47.C @@ -1,6 +1,6 @@ // { dg-options -std=c++0x } -struct A { ~A() = delete; }; // { dg-error "declared" } +struct A { ~A() = delete; }; // { dg-message "declared" } int main() { diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist9.C b/gcc/testsuite/g++.dg/cpp0x/initlist9.C index d596b39..197fdd4 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist9.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist9.C @@ -8,7 +8,7 @@ struct b b() = default; ~b() = default; b& operator=(const b&) = delete; - b(const b&) = delete; // { dg-error "declared" } + b(const b&) = delete; // { dg-message "declared" } b(bool _t): t (_t) { } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C index f476669..92c5431 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C @@ -5,7 +5,7 @@ struct A { A(); - A(const A& a) = delete; // { dg-error "declared" } + A(const A& a) = delete; // { dg-message "declared" } }; int main() diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C index f94d64e..213f7c0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C @@ -3,7 +3,7 @@ struct A { A(); - A(const A&) = delete; // { dg-error "declared" } + A(const A&) = delete; // { dg-message "declared" } }; template diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C index 9b84c8c..2330365 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C @@ -3,6 +3,6 @@ int main() { - int q = 1; // { dg-error "declared here" } + int q = 1; // { dg-message "declared here" } struct test { int x = q; } instance; // { dg-error "local variable" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae46.C b/gcc/testsuite/g++.dg/cpp0x/sfinae46.C new file mode 100644 index 0000000..20e859c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae46.C @@ -0,0 +1,13 @@ +// PR c++/57419 +// { dg-do compile { target c++11 } } + +template< typename q > +decltype( &q::f ) t( q ) {} + +char t( ... ) { return {}; } + +class c { void f() = delete; }; +class d { static void f() = delete; }; + +static_assert( sizeof( t( c() ) ), "c" ); +static_assert( sizeof( t( d() ) ), "d" ); diff --git a/gcc/testsuite/g++.dg/cpp0x/union4.C b/gcc/testsuite/g++.dg/cpp0x/union4.C index 0705047..c82a81c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/union4.C +++ b/gcc/testsuite/g++.dg/cpp0x/union4.C @@ -3,7 +3,7 @@ struct SFoo { - SFoo() =delete; // { dg-error "declared" } + SFoo() =delete; // { dg-message "declared" } }; union UFoo // { dg-error "deleted" } diff --git a/gcc/testsuite/g++.dg/template/crash108.C b/gcc/testsuite/g++.dg/template/crash108.C index b6f49a1..221d80e 100644 --- a/gcc/testsuite/g++.dg/template/crash108.C +++ b/gcc/testsuite/g++.dg/template/crash108.C @@ -1,5 +1,5 @@ // PR c++/50861 template struct A {A(int b=k(0));}; // { dg-error "parameter|arguments" } -void f(int k){A a;} // // { dg-error "declared" } +void f(int k){A a;} // // { dg-message "declared" } // { dg-message "note" "note" { target *-*-* } 3 } diff --git a/gcc/testsuite/g++.dg/template/crash41.C b/gcc/testsuite/g++.dg/template/crash41.C index 9a440b0..16e7028 100644 --- a/gcc/testsuite/g++.dg/template/crash41.C +++ b/gcc/testsuite/g++.dg/template/crash41.C @@ -1,7 +1,7 @@ // PR c++/22464 template -void do_something(const T* A) // { dg-error "declared" } +void do_something(const T* A) // { dg-message "declared" } { struct helper_t{ helper_t() { diff --git a/gcc/testsuite/g++.old-deja/g++.jason/local.C b/gcc/testsuite/g++.old-deja/g++.jason/local.C index 21fa9f5..18d810a 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/local.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/local.C @@ -5,7 +5,7 @@ int x; void f () { static int s; - int x; // { dg-error "" } referenced below + int x; // { dg-message "" } referenced below extern int q(); struct local { diff --git a/gcc/testsuite/g++.old-deja/g++.law/visibility3.C b/gcc/testsuite/g++.old-deja/g++.law/visibility3.C index 64d64df..ddbbc84 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/visibility3.C +++ b/gcc/testsuite/g++.old-deja/g++.law/visibility3.C @@ -11,7 +11,7 @@ int x; int main(void) { static int s; - int x; // { dg-error "" } declared + int x; // { dg-message "" } declared extern int g(); struct local { -- cgit v1.1