public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/108231] New: g++ mistakenly reports ambiguity between equivalent function declarations @ 2022-12-27 7:30 bruno at clisp dot org 2022-12-27 7:45 ` [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one pinskia at gcc dot gnu.org ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: bruno at clisp dot org @ 2022-12-27 7:30 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231 Bug ID: 108231 Summary: g++ mistakenly reports ambiguity between equivalent function declarations Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: bruno at clisp dot org Target Milestone: --- Created attachment 54156 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54156&action=edit test case The attached code, i1.cc, contains two equivalent function declarations for the function 'free'. They are equivalent because they have the same signature and both have "C" linkage. In lines 9, 10, 12, 13, referencing the function 'free' works fine. However, referencing it in line 17, as part of a __attribute__ ((__malloc__ (free, 1))) attribute, leads to an error "‘malloc’ attribute argument 1 is ambiguous". I would expect no error, no warning. How to reproduce: $ g++ -S i1.cc i1.cc:17:67: error: ‘malloc’ attribute argument 1 is ambiguous 17 | __attribute__ ((__malloc__)) __attribute__ ((__malloc__ (free, 1))); | ^ i1.cc:17:67: note: use a cast to the expected type to disambiguate ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one 2022-12-27 7:30 [Bug c++/108231] New: g++ mistakenly reports ambiguity between equivalent function declarations bruno at clisp dot org @ 2022-12-27 7:45 ` pinskia at gcc dot gnu.org 2022-12-27 8:04 ` [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one and the builtin free pinskia at gcc dot gnu.org 2022-12-27 8:11 ` [Bug c++/108231] malloc and cleanup attributes " pinskia at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: pinskia at gcc dot gnu.org @ 2022-12-27 7:45 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- A little more reduced: ``` namespace g { extern "C" void free(void *); } using g::free; extern "C" void free (void *); void foo1 (void *p) { free (p); } void (*foo2) (void *) = free; extern "C" { void foo3 (void *p) { free (p); } void (*foo4) (void *) = free; } extern "C" wchar_t * wcsdup (const wchar_t *s) __attribute__ ((__malloc__)) __attribute__ ((__malloc__ (free, 1))); ``` ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one and the builtin free 2022-12-27 7:30 [Bug c++/108231] New: g++ mistakenly reports ambiguity between equivalent function declarations bruno at clisp dot org 2022-12-27 7:45 ` [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one pinskia at gcc dot gnu.org @ 2022-12-27 8:04 ` pinskia at gcc dot gnu.org 2022-12-27 8:11 ` [Bug c++/108231] malloc and cleanup attributes " pinskia at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: pinskia at gcc dot gnu.org @ 2022-12-27 8:04 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Summary|malloc attribute vs extern |malloc attribute vs extern |"C" in a namespace and |"C" in a namespace and |global and using of one in |global and using of one in |the namespace in the global |the namespace in the global |one |one and the builtin free Last reconfirmed| |2022-12-27 --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The problem is related to that free is a builtin rather than the extern "C" really. -fno-builtin fixes the error too. ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/108231] malloc and cleanup attributes vs extern "C" in a namespace and global and using of one in the namespace in the global one and the builtin free 2022-12-27 7:30 [Bug c++/108231] New: g++ mistakenly reports ambiguity between equivalent function declarations bruno at clisp dot org 2022-12-27 7:45 ` [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one pinskia at gcc dot gnu.org 2022-12-27 8:04 ` [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one and the builtin free pinskia at gcc dot gnu.org @ 2022-12-27 8:11 ` pinskia at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: pinskia at gcc dot gnu.org @ 2022-12-27 8:11 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|malloc attribute vs extern |malloc and cleanup |"C" in a namespace and |attributes vs extern "C" in |global and using of one in |a namespace and global and |the namespace in the global |using of one in the |one and the builtin free |namespace in the global one | |and the builtin free --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Here is another example of the same issue but with cleanup attribute instead: ``` namespace std { extern "C" int printf (const char*, ...); } using std::printf; extern "C" int printf (const char*, ...); void foo (const char *) { printf ("%s\n", __PRETTY_FUNCTION__); } void bar () { const char a __attribute__ ((cleanup (printf))) = 0; printf ("%s calling ", __PRETTY_FUNCTION__); foo (&a); printf ("cleanup calling "); } int main () { bar (); } ``` Note if you order swap the order of declarations of printf it works. Same with free in the original testcase for malloc. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-12-27 8:11 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-12-27 7:30 [Bug c++/108231] New: g++ mistakenly reports ambiguity between equivalent function declarations bruno at clisp dot org 2022-12-27 7:45 ` [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one pinskia at gcc dot gnu.org 2022-12-27 8:04 ` [Bug c++/108231] malloc attribute vs extern "C" in a namespace and global and using of one in the namespace in the global one and the builtin free pinskia at gcc dot gnu.org 2022-12-27 8:11 ` [Bug c++/108231] malloc and cleanup attributes " pinskia at gcc dot gnu.org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).