* [C++ Patch] PR 82466 ("Missing warning for re-declaration of built-in function as variable")
@ 2017-10-09 10:56 Paolo Carlini
2017-10-24 15:37 ` Jason Merrill
0 siblings, 1 reply; 2+ messages in thread
From: Paolo Carlini @ 2017-10-09 10:56 UTC (permalink / raw)
To: gcc-patches; +Cc: Nathan Sidwell, Jason Merrill, Joseph S. Myers
[-- Attachment #1: Type: text/plain, Size: 1342 bytes --]
Hi,
this issue filed by Bernd is sort-of a small follow-up to his c++/71973:
the C front-end already warns for things like:
   int printf;
where we are declaring in the global namespace a built-in. Beyond
copying over to the C++ front-end the code already existing in the C
front-end, there are a couple of nits: 1- We probably want to enable
suppressing the warning, give it a name, for this I'm overloading the
name already added by Bernd for c++/71973 (using it in the C front-end
too, without changes to the default behavior, seems a very safe tweak to
me); 2- as a pure C++ nit, we probably want to take into account
namespaces, thus the additional check CP_DECL_CONTEXT (newdecl) ==
global_namespace and the new C++ test (for a couple of hours I had in
the tree CP_DECL_CONTEXT (newdecl) == CP_DECL_CONTEXT (olddecl),
probably unnecessarily more verbose!?). What else? A couple of existing
C++ testcases needed rather obvious adjusting, note in particular
g++.old-deja/g++.mike/p811.C, which has flattened in the global
namespace a declaration 'extern ostream clog;', which, were in namespace
std, as per the standard, would not trigger the new warning, even if
'clog' is also the name of a math builtin, thanks to the additional
check mentioned above. Tested x86_64.
Thanks, Paolo.
//////////////////
[-- Attachment #2: CL_82466 --]
[-- Type: text/plain, Size: 900 bytes --]
2017-10-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/82466
* doc/invoke.texi ([Wbuiltin-declaration-mismatch]): Extend
description.
/cp
2017-10-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/82466
* decl.c (duplicate_decls): Warn for built-in functions declared as
non-function, use OPT_Wbuiltin_declaration_mismatch.
* decl.c (duplicate_decls): Avoid redundant '+' in warning_at.
/c
2017-10-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/82466
* c-decl.c (diagnose_mismatched_decls): Use
OPT_Wbuiltin_declaration_mismatch.
/testsuite
2017-10-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/82466
* c-c++-common/Wbuiltin-declaration-mismatch-1.c: New.
* c-c++-common/Wno-builtin-declaration-mismatch-1.c: Likewise.
* g++.dg/warn/Wbuiltin_declaration_mismatch-1.C: Likewise.
* g++.dg/parse/builtin2.C: Adjust.
* g++.old-deja/g++.mike/p811.C: Likewise.
[-- Attachment #3: patch_82466 --]
[-- Type: text/plain, Size: 4273 bytes --]
Index: c/c-decl.c
===================================================================
--- c/c-decl.c (revision 253536)
+++ c/c-decl.c (working copy)
@@ -1837,7 +1837,8 @@ diagnose_mismatched_decls (tree newdecl, tree oldd
locate_old_decl (olddecl);
}
else if (TREE_PUBLIC (newdecl))
- warning (0, "built-in function %q+D declared as non-function",
+ warning (OPT_Wbuiltin_declaration_mismatch,
+ "built-in function %q+D declared as non-function",
newdecl);
else
warning (OPT_Wshadow, "declaration of %q+D shadows "
Index: cp/decl.c
===================================================================
--- cp/decl.c (revision 253536)
+++ cp/decl.c (working copy)
@@ -1431,7 +1431,15 @@ duplicate_decls (tree newdecl, tree olddecl, bool
/* Avoid warnings redeclaring built-ins which have not been
explicitly declared. */
if (DECL_ANTICIPATED (olddecl))
- return NULL_TREE;
+ {
+ if (TREE_PUBLIC (newdecl)
+ && CP_DECL_CONTEXT (newdecl) == global_namespace)
+ warning_at (DECL_SOURCE_LOCATION (newdecl),
+ OPT_Wbuiltin_declaration_mismatch,
+ "built-in function %qD declared as non-function",
+ newdecl);
+ return NULL_TREE;
+ }
/* If you declare a built-in or predefined function name as static,
the old definition is overridden, but optionally warn this was a
@@ -1522,7 +1530,7 @@ next_arg:;
warning_at (DECL_SOURCE_LOCATION (newdecl),
OPT_Wbuiltin_declaration_mismatch,
- "declaration of %q+#D conflicts with built-in "
+ "declaration of %q#D conflicts with built-in "
"declaration %q#D", newdecl, olddecl);
}
else if ((DECL_EXTERN_C_P (newdecl)
Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi (revision 253536)
+++ doc/invoke.texi (working copy)
@@ -6313,7 +6313,8 @@ attributes.
@item -Wno-builtin-declaration-mismatch
@opindex Wno-builtin-declaration-mismatch
@opindex Wbuiltin-declaration-mismatch
-Warn if a built-in function is declared with the wrong signature.
+Warn if a built-in function is declared with the wrong signature or
+as non-function.
This warning is enabled by default.
@item -Wno-builtin-macro-redefined
Index: testsuite/c-c++-common/Wbuiltin-declaration-mismatch-1.c
===================================================================
--- testsuite/c-c++-common/Wbuiltin-declaration-mismatch-1.c (nonexistent)
+++ testsuite/c-c++-common/Wbuiltin-declaration-mismatch-1.c (working copy)
@@ -0,0 +1,4 @@
+/* PR c++/82466 */
+/* { dg-options "-Wbuiltin-declaration-mismatch" } */
+
+int printf; /* { dg-warning "declared as non-function" } */
Index: testsuite/c-c++-common/Wno-builtin-declaration-mismatch-1.c
===================================================================
--- testsuite/c-c++-common/Wno-builtin-declaration-mismatch-1.c (nonexistent)
+++ testsuite/c-c++-common/Wno-builtin-declaration-mismatch-1.c (working copy)
@@ -0,0 +1,4 @@
+/* PR c++/82466 */
+/* { dg-options "-Wno-builtin-declaration-mismatch" } */
+
+int printf;
Index: testsuite/g++.dg/parse/builtin2.C
===================================================================
--- testsuite/g++.dg/parse/builtin2.C (revision 253536)
+++ testsuite/g++.dg/parse/builtin2.C (working copy)
@@ -1,5 +1,5 @@
// PR c++/14432
-// { dg-options "" }
+// { dg-options "-Wno-builtin-declaration-mismatch" }
struct Y {};
Y y1;
Index: testsuite/g++.dg/warn/Wbuiltin_declaration_mismatch-1.C
===================================================================
--- testsuite/g++.dg/warn/Wbuiltin_declaration_mismatch-1.C (nonexistent)
+++ testsuite/g++.dg/warn/Wbuiltin_declaration_mismatch-1.C (working copy)
@@ -0,0 +1,7 @@
+// PR c++/82466
+// { dg-options "-Wbuiltin-declaration-mismatch" }
+
+namespace N
+{
+ int printf;
+}
Index: testsuite/g++.old-deja/g++.mike/p811.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p811.C (revision 253536)
+++ testsuite/g++.old-deja/g++.mike/p811.C (working copy)
@@ -1,5 +1,5 @@
// { dg-do assemble }
-// { dg-options "" }
+// { dg-options "-Wno-builtin-declaration-mismatch" }
// This test case caused the compiler to abort at one point in time.
// prms-id: 811
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [C++ Patch] PR 82466 ("Missing warning for re-declaration of built-in function as variable")
2017-10-09 10:56 [C++ Patch] PR 82466 ("Missing warning for re-declaration of built-in function as variable") Paolo Carlini
@ 2017-10-24 15:37 ` Jason Merrill
0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2017-10-24 15:37 UTC (permalink / raw)
To: Paolo Carlini; +Cc: gcc-patches, Nathan Sidwell, Joseph S. Myers
OK.
On Mon, Oct 9, 2017 at 6:37 AM, Paolo Carlini <paolo.carlini@oracle.com> wrote:
> Hi,
>
> this issue filed by Bernd is sort-of a small follow-up to his c++/71973: the
> C front-end already warns for things like:
>
> int printf;
>
> where we are declaring in the global namespace a built-in. Beyond copying
> over to the C++ front-end the code already existing in the C front-end,
> there are a couple of nits: 1- We probably want to enable suppressing the
> warning, give it a name, for this I'm overloading the name already added by
> Bernd for c++/71973 (using it in the C front-end too, without changes to the
> default behavior, seems a very safe tweak to me); 2- as a pure C++ nit, we
> probably want to take into account namespaces, thus the additional check
> CP_DECL_CONTEXT (newdecl) == global_namespace and the new C++ test (for a
> couple of hours I had in the tree CP_DECL_CONTEXT (newdecl) ==
> CP_DECL_CONTEXT (olddecl), probably unnecessarily more verbose!?). What
> else? A couple of existing C++ testcases needed rather obvious adjusting,
> note in particular g++.old-deja/g++.mike/p811.C, which has flattened in the
> global namespace a declaration 'extern ostream clog;', which, were in
> namespace std, as per the standard, would not trigger the new warning, even
> if 'clog' is also the name of a math builtin, thanks to the additional check
> mentioned above. Tested x86_64.
>
> Thanks, Paolo.
>
> //////////////////
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-10-24 15:37 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-09 10:56 [C++ Patch] PR 82466 ("Missing warning for re-declaration of built-in function as variable") Paolo Carlini
2017-10-24 15:37 ` Jason Merrill
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).