[Bug c++/86142] New: hard error for bad delete-expression in SFINAE context
ensadc at mailnesia dot com
gcc-bugzilla@gcc.gnu.org
Thu Jun 14 05:52:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86142
Bug ID: 86142
Summary: hard error for bad delete-expression in SFINAE context
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ensadc at mailnesia dot com
Target Milestone: ---
https://wandbox.org/permlink/9gfZwtKZC9Tu92fs
----
template<class T, class = decltype(delete T())>
void f();
template<class T>
int f(...);
int x = f<int>();
int y = f<int(*)()>();
int z = f<void*>();
----
prog.cc: In substitution of 'template<class T, class> void f() [with T = int;
<template-parameter-1-2> = <missing>]':
prog.cc:7:16: required from here
prog.cc:1:19: error: type 'int' argument given to 'delete', expected pointer
template<class T, class = decltype(delete T())>
^~~~~
prog.cc: In substitution of 'template<class T, class> void f() [with T = int
(*)(); <template-parameter-1-2> = <missing>]':
prog.cc:8:21: required from here
prog.cc:1:19: error: cannot delete a function. Only pointer-to-objects are
valid arguments to 'delete'
prog.cc: In substitution of 'template<class T, class> void f() [with T = void*;
<template-parameter-1-2> = <missing>]':
prog.cc:9:18: required from here
prog.cc:1:19: warning: deleting 'void*' is undefined [-Wdelete-incomplete]
prog.cc:9:18: error: call of overloaded 'f<void*>()' is ambiguous
int z = f<void*>();
^
prog.cc:2:6: note: candidate: 'void f() [with T = void*;
<template-parameter-1-2> = void]'
void f();
^
prog.cc:4:5: note: candidate: 'int f(...) [with T = void*]'
int f(...);
^
----
These variable definitions should call the second overload of `f`. No warning
or error should be triggered.
The code is accepted by clang.
More information about the Gcc-bugs
mailing list