re PR c++/57419 (Access control doesn't stop referring to a deleted function)
authorPaolo Carlini <paolo@gcc.gnu.org>
Mon, 3 Jun 2013 20:39:50 +0000 (20:39 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 3 Jun 2013 20:39:50 +0000 (20:39 +0000)
/gcc/cp
2013-06-03  Paolo Carlini  <paolo.carlini@oracle.com>

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  <paolo.carlini@oracle.com>

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  <paolo.carlini@oracle.com>

PR c++/57419
* testsuite/20_util/default_delete/48631_neg.cc: Adjust.

From-SVN: r199626

26 files changed:
gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/defaulted13.C
gcc/testsuite/g++.dg/cpp0x/defaulted2.C
gcc/testsuite/g++.dg/cpp0x/defaulted26.C
gcc/testsuite/g++.dg/cpp0x/defaulted3.C
gcc/testsuite/g++.dg/cpp0x/error1.C
gcc/testsuite/g++.dg/cpp0x/implicit1.C
gcc/testsuite/g++.dg/cpp0x/implicit11.C
gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C
gcc/testsuite/g++.dg/cpp0x/initlist47.C
gcc/testsuite/g++.dg/cpp0x/initlist9.C
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C
gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C
gcc/testsuite/g++.dg/cpp0x/sfinae46.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/union4.C
gcc/testsuite/g++.dg/template/crash108.C
gcc/testsuite/g++.dg/template/crash41.C
gcc/testsuite/g++.old-deja/g++.jason/local.C
gcc/testsuite/g++.old-deja/g++.law/visibility3.C
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc

index 8dc30f986c535b43347bbdd2fc42d2a40ad46d54..a30a7d634760f50d107c039a39cf33cac9141522 100644 (file)
@@ -1,3 +1,10 @@
+2013-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       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  <jh@suse.cz>
 
        * decl2.c (cp_write_global_declarations): Replace same_body_alias
index aebc440a4272f100b2d43d7f38b8d49fc20cae66..8be1077c99c18a727b17a2bad0cdae093f4e10e4 100644 (file)
@@ -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);
index 3fe234e6f09ef17c812b3935f151b09c04d220e7..5e7dbcdb3596ac5d7af452167c3cb0391b5b987b 100644 (file)
@@ -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 %<auto%>", decl);
+         if (complain & tf_error)
+           error ("use of %qD before deduction of %<auto%>", 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"
index c1385c10b602ef924dc9c62df262196b8329b676..048a7db5e1e52abf4c527bbdb1a1508fb825fe69 100644 (file)
@@ -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);
index 54f0fa2fbe214a15e3a0d0fb5f9cd5af3e85446f..a1f082790c97ba288091ab2fbe82b58894d1fb30 100644 (file)
@@ -1,3 +1,26 @@
+2013-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       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  <tejohnson@google.com>
 
        * gcc.dg/vect/bb-slp-31.c: Update vect dump message.
index 8b23579217ec0b4b3fa2834079cfddc441690877..5ddbcb38c1cca37bbe12f78a8240022caac2821f 100644 (file)
@@ -7,13 +7,13 @@ struct NonCopyable {
 };
 
 template<>
-NonCopyable<int>::NonCopyable(NonCopyable<int> const&) = delete; // { dg-error "declared" }
+NonCopyable<int>::NonCopyable(NonCopyable<int> const&) = delete; // { dg-message "declared" }
 
 template<typename T>
 NonCopyable<T>::NonCopyable(NonCopyable<T> const&) = default;
 
 template<>
-NonCopyable<double>::NonCopyable(NonCopyable<double> const&) = delete; // { dg-error "declared" }
+NonCopyable<double>::NonCopyable(NonCopyable<double> const&) = delete; // { dg-message "declared" }
 
 
 int main()
index e3aac8f1a9fdb69fffa6a298a7fdab36aa25d099..ce551a3fee2efe57354e957ae06e4d3b9918fe72 100644 (file)
@@ -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
index 69bd0accbd4bce8b729803c40f79adba4a86fb99..746fa9081802af263cba485887f60eaceaad2ced 100644 (file)
@@ -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" }
index 5e2116b53b31b196ad5ab47f877f3cfbfd9f4ee1..bc5b14d2d591effeeb0a508300a6ed7a8e830c55 100644 (file)
@@ -4,7 +4,7 @@
 template<class T>
 struct A {
   template<class U>
-  bool operator==(const A<U>&) = delete; // { dg-error "declared" }
+  bool operator==(const A<U>&) = delete; // { dg-message "declared" }
   operator bool () { return true; }
 };
 
index 751b3b75e0cb320123a15988bfc1438dbf9edca4..15cd38f8807d771d23ecf8a421860eaca77e90d7 100644 (file)
@@ -2,7 +2,7 @@
 // { dg-do compile }
 // { dg-options "-std=c++0x" }
 
-template<int... N> void foo (int... x[N])      // { dg-error "int \\\[N\\\]\\.\\.\\. x" }
+template<int... N> void foo (int... x[N])      // { dg-message "int \\\[N\\\]\\.\\.\\. x" }
 {
   struct A
   {
index 2efbde6a93a265ba43b328f526a7a2891ee2e641..e4e16e1ad351cdc530276291bee0e485e38e4978 100644 (file)
@@ -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
index 7ec8e95dcb636ae28d564b9bd324e0bcd4e8360b..c974e2b7761eacea10d68d5de566beff0a383c7d 100644 (file)
@@ -4,7 +4,7 @@
 
 struct A
 {
-  ~A() = delete;               // { dg-error "declared here" }
+  ~A() = delete;               // { dg-message "declared here" }
 };
 
 struct B: A { };               // { dg-error "deleted" }
index 2e18e5d62f370c0ced1f7ed62d580b3086e0da09..95cf932d0019d41eb9dca39f9b4003d8ee69dc0d 100644 (file)
@@ -8,7 +8,7 @@ struct A
 
 struct C
 {
-  C() = delete;                        // { dg-error "declared here" }
+  C() = delete;                        // { dg-message "declared here" }
 };
 
 struct B: A, C
index b76fb58361f9f4bb2ad301c41239310f7b241b6e..06d683e038a745e5fae1f134d05f9319a804e63d 100644 (file)
@@ -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()
 {
index d596b391508c653d7afe56e06ffc263720205be0..197fdd4ad04db9ff1640a94d234f6838f8b13387 100644 (file)
@@ -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) { }
 };
index f4766691eecfb2ee719e18f5360a55d97b94cf08..92c54313874fd4421bafe45ef51fbb141dbc5dd4 100644 (file)
@@ -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()
index f94d64ec0ea351aec3fbe7aaf477faa5371ca7b1..213f7c0babf93ccaa7cca9b70c6df8b52677de81 100644 (file)
@@ -3,7 +3,7 @@
 
 struct A {
   A();
-  A(const A&) = delete;                // { dg-error "declared" }
+  A(const A&) = delete;                // { dg-message "declared" }
 };
 
 template <class T>
index 9b84c8c3deda3f4ddf854804a2d36bf73ec458dc..2330365f7ce12a781ac860941c64af09d009c802 100644 (file)
@@ -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 (file)
index 0000000..20e859c
--- /dev/null
@@ -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" );
index 07050475d363b06294920e60f2d97e3350b0277a..c82a81cdba851211f39f16d0c52cd8fa14117944 100644 (file)
@@ -3,7 +3,7 @@
 
 struct SFoo
 {
-  SFoo() =delete;              // { dg-error "declared" }
+  SFoo() =delete;              // { dg-message "declared" }
 };
 
 union UFoo                     // { dg-error "deleted" }
index b6f49a19e5808e7ad878f3daea4012914bead69c..221d80ee5f11141024242138ec1aa90dc36163d1 100644 (file)
@@ -1,5 +1,5 @@
 // PR c++/50861
 
 template<class T> struct A {A(int b=k(0));}; // { dg-error "parameter|arguments" }
-void f(int k){A<int> a;} // // { dg-error "declared" }
+void f(int k){A<int> a;} // // { dg-message "declared" }
 // { dg-message "note" "note" { target *-*-* } 3 }
index 9a440b0761eb66a5e986a0a25d31bd1c19fbde08..16e7028a6688f48dd685e436c0b62d19a3f55336 100644 (file)
@@ -1,7 +1,7 @@
 // PR c++/22464
 
 template<typename T>
-void do_something(const T* A) // { dg-error "declared" }
+void do_something(const T* A) // { dg-message "declared" }
 { 
   struct helper_t{ 
     helper_t() {  
index 21fa9f5877117e4301babec75ef4cd40e727e5a6..18d810a33ba34b071403b2bc63f11ad57236789f 100644 (file)
@@ -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 {
index 64d64df647f159b14874cf510956330233fd007b..ddbbc84badcb73090cbe010edf52450a8265b7d7 100644 (file)
@@ -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 {
index 2350efe125734f69cc6d57b58cae9dd8354f203f..3952b0b913727d2ddb86b281a162a6f6e0234805 100644 (file)
@@ -1,8 +1,14 @@
+2013-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/57419
+       * testsuite/20_util/default_delete/48631_neg.cc: Adjust.
+
 2013-06-01  Ed Smith-Rowland  <3dw4rd@verizon.net>
 
-       include/std/chrono: Collapse redundant 'inline' from 'inline constexpr'.
-       include/std/tuple: Ditto.
-       include/bits/move.h: Ditto.
+       * include/std/chrono: Collapse redundant 'inline' from 'inline
+       constexpr'.
+       * include/std/tuple: Ditto.
+       * include/bits/move.h: Ditto.
 
 2013-05-30  Ed Smith-Rowland  <3dw4rd@verizon.net>
 
index d0619fd9ca0ce175431a4058aca0be323a9e8fe3..d4c17288a99fdc46d6cff452210db569c941d281 100644 (file)
@@ -27,4 +27,4 @@ struct D : B { };
 D d;
 std::default_delete<B[]> db;
 typedef decltype(db(&d)) type; // { dg-error "use of deleted function" }
-// { dg-error "declared here" "" { target *-*-* } 122 }
+// { dg-prune-output "declared" }