decl2.c (coerce_new_type, [...]): Add location_t parameter and adjust error_at calls.
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 12 Jun 2018 21:22:10 +0000 (21:22 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 12 Jun 2018 21:22:10 +0000 (21:22 +0000)
/cp
2018-06-12  Paolo Carlini  <paolo.carlini@oracle.com>

* decl2.c (coerce_new_type, coerce_delete_type): Add location_t
parameter and adjust error_at calls.
* decl.c (grok_op_properties): Adjust calls.
* cp-tree.h (oerce_new_type, coerce_delete_type): Adjust decls.

/testsuite
2018-06-12  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/init/delete3.C: New.
* g++.dg/init/new49.C: Likewise.
* g++.dg/init/new25.C: Test locations too.
* g++.dg/template/new4.C: Likewise.
* g++.old-deja/g++.jason/operator.C: Likewise.

From-SVN: r261527

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/testsuite/g++.dg/init/delete3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/init/new25.C
gcc/testsuite/g++.dg/init/new49.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/new4.C
gcc/testsuite/g++.old-deja/g++.jason/operator.C

index 726fd7f6c437730d2bc4fd1a1607b6887261d80c..05105ae7cfe789038cb740f182c2f55129e3b2b0 100644 (file)
@@ -1,3 +1,10 @@
+2018-06-12  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl2.c (coerce_new_type, coerce_delete_type): Add location_t
+       parameter and adjust error_at calls.
+       * decl.c (grok_op_properties): Adjust calls.
+       * cp-tree.h (oerce_new_type, coerce_delete_type): Adjust decls.
+
 2018-06-12  Marek Polacek  <polacek@redhat.com>
 
        Core issue 1331 - const mismatch with defaulted copy constructor
index a6d0b431a9dd192f3a24a597bd7f19e2c21fdee9..59ad38107a8643a1d640829d399b7950de5d0a6b 100644 (file)
@@ -6346,8 +6346,8 @@ extern bool attributes_naming_typedef_ok  (tree);
 extern void cplus_decl_attributes              (tree *, tree, int);
 extern void finish_anon_union                  (tree);
 extern void cxx_post_compilation_parsing_cleanups (void);
-extern tree coerce_new_type                    (tree);
-extern tree coerce_delete_type                 (tree);
+extern tree coerce_new_type                    (tree, location_t);
+extern tree coerce_delete_type                 (tree, location_t);
 extern void comdat_linkage                     (tree);
 extern void determine_visibility               (tree);
 extern void constrain_class_visibility         (tree);
index c8353405a1a6675a5ff77f8f3b4b7a910f50a5b6..de1b3415afb980236db2ef10895de698a7baa126 100644 (file)
@@ -13153,11 +13153,11 @@ grok_op_properties (tree decl, bool complain)
        }
 
       if (op_flags & OVL_OP_FLAG_DELETE)
-       TREE_TYPE (decl) = coerce_delete_type (TREE_TYPE (decl));
+       TREE_TYPE (decl) = coerce_delete_type (TREE_TYPE (decl), loc);
       else
        {
          DECL_IS_OPERATOR_NEW (decl) = 1;
-         TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl));
+         TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl), loc);
        }
 
       return true;
index 2cef9c750edc72ce657497dc8dcf2e2a8925b5a6..cbe2f2250f257c92eeae67713c96f7279089ff4c 100644 (file)
@@ -1676,7 +1676,7 @@ finish_anon_union (tree anon_union_decl)
    what compiler will be expecting.  */
 
 tree
-coerce_new_type (tree type)
+coerce_new_type (tree type, location_t loc)
 {
   int e = 0;
   tree args = TYPE_ARG_TYPES (type);
@@ -1686,7 +1686,8 @@ coerce_new_type (tree type)
   if (!same_type_p (TREE_TYPE (type), ptr_type_node))
     {
       e = 1;
-      error ("%<operator new%> must return type %qT", ptr_type_node);
+      error_at (loc, "%<operator new%> must return type %qT",
+               ptr_type_node);
     }
 
   if (args && args != void_list_node)
@@ -1697,8 +1698,8 @@ coerce_new_type (tree type)
             
             The first parameter shall not have an associated default
             argument.  */
-         error ("the first parameter of %<operator new%> cannot "
-                "have a default argument");
+         error_at (loc, "the first parameter of %<operator new%> cannot "
+                   "have a default argument");
          /* Throw away the default argument.  */
          TREE_PURPOSE (args) = NULL_TREE;
        }
@@ -1713,7 +1714,7 @@ coerce_new_type (tree type)
     e = 2;
 
   if (e == 2)
-    permerror (input_location, "%<operator new%> takes type %<size_t%> (%qT) "
+    permerror (loc, "%<operator new%> takes type %<size_t%> (%qT) "
               "as first parameter", size_type_node);
 
   switch (e)
@@ -1732,7 +1733,7 @@ coerce_new_type (tree type)
 }
 
 tree
-coerce_delete_type (tree type)
+coerce_delete_type (tree type, location_t loc)
 {
   int e = 0;
   tree args = TYPE_ARG_TYPES (type);
@@ -1742,7 +1743,8 @@ coerce_delete_type (tree type)
   if (!same_type_p (TREE_TYPE (type), void_type_node))
     {
       e = 1;
-      error ("%<operator delete%> must return type %qT", void_type_node);
+      error_at (loc, "%<operator delete%> must return type %qT",
+               void_type_node);
     }
 
   if (!args || args == void_list_node
@@ -1751,8 +1753,8 @@ coerce_delete_type (tree type)
       e = 2;
       if (args && args != void_list_node)
        args = TREE_CHAIN (args);
-      error ("%<operator delete%> takes type %qT as first parameter",
-            ptr_type_node);
+      error_at (loc, "%<operator delete%> takes type %qT as first parameter",
+               ptr_type_node);
     }
   switch (e)
   {
diff --git a/gcc/testsuite/g++.dg/init/delete3.C b/gcc/testsuite/g++.dg/init/delete3.C
new file mode 100644 (file)
index 0000000..d109440
--- /dev/null
@@ -0,0 +1 @@
+int operator delete (void*, int);  // { dg-error "5:.operator delete. must return type .void." }
index 3abd2f7aba01e8ed0048673ff6b18f86023fb6e3..7ca57acd8c247683be4552a5a43e20093f7a23ad 100644 (file)
@@ -4,14 +4,14 @@
 class C
 {
 public:
-  void* operator new(std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" }
+  void* operator new(std::size_t = 32) throw (std::bad_alloc); // { dg-error "9:the first parameter of .operator new. cannot have a default argument" }
                                                               // { dg-error "dynamic exception specification" "" { target c++17 } .-1 }
                                                               // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } .-2 }
-  void* operator new[](std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" }
+  void* operator new[](std::size_t = 32) throw (std::bad_alloc); // { dg-error "9:the first parameter of .operator new. cannot have a default argument" }
                                                                 // { dg-error "dynamic exception specification" "" { target c++17 } .-1 }
                                                                 // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } .-2 }
-  void* operator new(std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" }
-  void* operator new[](std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" }
+  void* operator new(std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "9:the first parameter of .operator new. cannot have a default argument" }
+  void* operator new[](std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "9:the first parameter of .operator new. cannot have a default argument" }
 };
 
 class D
@@ -26,8 +26,8 @@ public:
 class E
 {
 public:
-  void* operator new(std::size_t = 0,
-                    const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" }
-  void* operator new[](std::size_t = 0,
-                      const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" }
+  void* operator new(std::size_t = 0,  // { dg-error "9:the first parameter of .operator new. cannot have a default argument" }
+                    const std::nothrow_t& = std::nothrow_t()) throw();
+  void* operator new[](std::size_t = 0,  // { dg-error "9:the first parameter of .operator new. cannot have a default argument" }
+                      const std::nothrow_t& = std::nothrow_t()) throw();
 };
diff --git a/gcc/testsuite/g++.dg/init/new49.C b/gcc/testsuite/g++.dg/init/new49.C
new file mode 100644 (file)
index 0000000..23259bd
--- /dev/null
@@ -0,0 +1 @@
+int operator new (__SIZE_TYPE__, int);  // { dg-error "5:.operator new. must return type .void*." }
index bf6f06100c700d84715fb6fd3caa54ecb0544baa..914c3c64819312bcd37013676f5337319db3d03f 100644 (file)
@@ -4,5 +4,6 @@
 struct A
 {
     template<typename T>
-    static void* operator new(T) {} // { dg-error "first parameter|invalid template" }
+    static void* operator new(T) {}  // { dg-error "invalid template" }
+// { dg-error "18:.operator new. takes type .size_t." "first" { target *-*-* } .-1 }
 };
index ba6d407d1b9031048c89747d0ab585c6b0291ecd..c2fc212cef08f8cc1a1b6aeca3fdaaa2a1bb0826 100644 (file)
@@ -25,8 +25,8 @@ struct B {
 
 int operator-(int a, int b);   // { dg-error "5:.int operator-\\(int, int\\). must have an argument of class or enumerated type" }
 
-void * operator new (A a);     // { dg-error "first parameter" }
-void operator delete (A a);    // { dg-error "first parameter" }
+void * operator new (A a);     // { dg-error ".operator new. takes type .size_t." }
+void operator delete (A a);    // { dg-error ".operator delete. takes type .void\\*. as first parameter" }
 
 char * operator char * (int);  // { dg-error "return type" "ret" }
 // { dg-error "8:.operator char\\*\\*\\(int\\). must be a nonstatic member function" "mem" { target *-*-* } .-1 }