Commit 2d10ccaa by Paolo Carlini Committed by Paolo Carlini

decl2.c (coerce_new_type, [...]): Add location_t parameter and adjust error_at calls.

/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
parent 4db9ca86
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> 2018-06-12 Marek Polacek <polacek@redhat.com>
Core issue 1331 - const mismatch with defaulted copy constructor Core issue 1331 - const mismatch with defaulted copy constructor
......
...@@ -6346,8 +6346,8 @@ extern bool attributes_naming_typedef_ok (tree); ...@@ -6346,8 +6346,8 @@ extern bool attributes_naming_typedef_ok (tree);
extern void cplus_decl_attributes (tree *, tree, int); extern void cplus_decl_attributes (tree *, tree, int);
extern void finish_anon_union (tree); extern void finish_anon_union (tree);
extern void cxx_post_compilation_parsing_cleanups (void); extern void cxx_post_compilation_parsing_cleanups (void);
extern tree coerce_new_type (tree); extern tree coerce_new_type (tree, location_t);
extern tree coerce_delete_type (tree); extern tree coerce_delete_type (tree, location_t);
extern void comdat_linkage (tree); extern void comdat_linkage (tree);
extern void determine_visibility (tree); extern void determine_visibility (tree);
extern void constrain_class_visibility (tree); extern void constrain_class_visibility (tree);
......
...@@ -13153,11 +13153,11 @@ grok_op_properties (tree decl, bool complain) ...@@ -13153,11 +13153,11 @@ grok_op_properties (tree decl, bool complain)
} }
if (op_flags & OVL_OP_FLAG_DELETE) 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 else
{ {
DECL_IS_OPERATOR_NEW (decl) = 1; 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; return true;
......
...@@ -1676,7 +1676,7 @@ finish_anon_union (tree anon_union_decl) ...@@ -1676,7 +1676,7 @@ finish_anon_union (tree anon_union_decl)
what compiler will be expecting. */ what compiler will be expecting. */
tree tree
coerce_new_type (tree type) coerce_new_type (tree type, location_t loc)
{ {
int e = 0; int e = 0;
tree args = TYPE_ARG_TYPES (type); tree args = TYPE_ARG_TYPES (type);
...@@ -1686,7 +1686,8 @@ coerce_new_type (tree type) ...@@ -1686,7 +1686,8 @@ coerce_new_type (tree type)
if (!same_type_p (TREE_TYPE (type), ptr_type_node)) if (!same_type_p (TREE_TYPE (type), ptr_type_node))
{ {
e = 1; 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) if (args && args != void_list_node)
...@@ -1697,7 +1698,7 @@ coerce_new_type (tree type) ...@@ -1697,7 +1698,7 @@ coerce_new_type (tree type)
The first parameter shall not have an associated default The first parameter shall not have an associated default
argument. */ argument. */
error ("the first parameter of %<operator new%> cannot " error_at (loc, "the first parameter of %<operator new%> cannot "
"have a default argument"); "have a default argument");
/* Throw away the default argument. */ /* Throw away the default argument. */
TREE_PURPOSE (args) = NULL_TREE; TREE_PURPOSE (args) = NULL_TREE;
...@@ -1713,7 +1714,7 @@ coerce_new_type (tree type) ...@@ -1713,7 +1714,7 @@ coerce_new_type (tree type)
e = 2; e = 2;
if (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); "as first parameter", size_type_node);
switch (e) switch (e)
...@@ -1732,7 +1733,7 @@ coerce_new_type (tree type) ...@@ -1732,7 +1733,7 @@ coerce_new_type (tree type)
} }
tree tree
coerce_delete_type (tree type) coerce_delete_type (tree type, location_t loc)
{ {
int e = 0; int e = 0;
tree args = TYPE_ARG_TYPES (type); tree args = TYPE_ARG_TYPES (type);
...@@ -1742,7 +1743,8 @@ coerce_delete_type (tree type) ...@@ -1742,7 +1743,8 @@ coerce_delete_type (tree type)
if (!same_type_p (TREE_TYPE (type), void_type_node)) if (!same_type_p (TREE_TYPE (type), void_type_node))
{ {
e = 1; 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 if (!args || args == void_list_node
...@@ -1751,7 +1753,7 @@ coerce_delete_type (tree type) ...@@ -1751,7 +1753,7 @@ coerce_delete_type (tree type)
e = 2; e = 2;
if (args && args != void_list_node) if (args && args != void_list_node)
args = TREE_CHAIN (args); args = TREE_CHAIN (args);
error ("%<operator delete%> takes type %qT as first parameter", error_at (loc, "%<operator delete%> takes type %qT as first parameter",
ptr_type_node); ptr_type_node);
} }
switch (e) switch (e)
......
int operator delete (void*, int); // { dg-error "5:.operator delete. must return type .void." }
...@@ -4,14 +4,14 @@ ...@@ -4,14 +4,14 @@
class C class C
{ {
public: 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-error "dynamic exception specification" "" { target c++17 } .-1 }
// { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } .-2 } // { 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-error "dynamic exception specification" "" { target c++17 } .-1 }
// { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } .-2 } // { 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 "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 "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" }
}; };
class D class D
...@@ -26,8 +26,8 @@ public: ...@@ -26,8 +26,8 @@ public:
class E class E
{ {
public: public:
void* operator new(std::size_t = 0, 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(); // { dg-error "first parameter" } const std::nothrow_t& = std::nothrow_t()) throw();
void* operator new[](std::size_t = 0, 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(); // { dg-error "first parameter" } const std::nothrow_t& = std::nothrow_t()) throw();
}; };
int operator new (__SIZE_TYPE__, int); // { dg-error "5:.operator new. must return type .void*." }
...@@ -4,5 +4,6 @@ ...@@ -4,5 +4,6 @@
struct A struct A
{ {
template<typename T> 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 }
}; };
...@@ -25,8 +25,8 @@ struct B { ...@@ -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" } 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 new (A a); // { dg-error ".operator new. takes type .size_t." }
void operator delete (A a); // { dg-error "first parameter" } void operator delete (A a); // { dg-error ".operator delete. takes type .void\\*. as first parameter" }
char * operator char * (int); // { dg-error "return type" "ret" } char * operator char * (int); // { dg-error "return type" "ret" }
// { dg-error "8:.operator char\\*\\*\\(int\\). must be a nonstatic member function" "mem" { target *-*-* } .-1 } // { dg-error "8:.operator char\\*\\*\\(int\\). must be a nonstatic member function" "mem" { target *-*-* } .-1 }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment