This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, C++] Warn on redefinition of builtin functions (PR c++/71973)


Hi!

Currently C++ does not warn at all when built-in functions are re-defined
with a different signature, while C does warn on that even without -Wall.

Thus I'd like to propose a -Wall enabled warning for that in C++.

Initially I tried to warn unconditionally but that made too  many tests
in the C++ testsuite emit that warning :-(

So making the warning dependent on Wall is a compromise due
to the very many compile only tests, that use this "feature".

There is also a wrong-code side on this redefinition, because
even if the new function has the nothrow attribute the code is
generated as if it could throw.  Fixed as well.


Boot-strap and reg-testing on x86_64-linux-gnu.
Is it OK for trunk?


Thanks
Bernd.

Attachment: changelog-pr71973.txt
Description: changelog-pr71973.txt

Index: gcc/c-family/c.opt
===================================================================
--- gcc/c-family/c.opt	(revision 239624)
+++ gcc/c-family/c.opt	(working copy)
@@ -299,6 +299,10 @@ Wframe-address
 C ObjC C++ ObjC++ Var(warn_frame_address) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
 Warn when __builtin_frame_address or __builtin_return_address is used unsafely.
 
+Wbuiltin-function-redefined
+C++ ObjC++ Var(warn_builtin_function_redefined) Warning LangEnabledBy(C++ ObjC++,Wall)
+Warn when a built-in function is redefined.
+
 Wbuiltin-macro-redefined
 C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) CppReason(CPP_W_BUILTIN_MACRO_REDEFINED) Var(cpp_warn_builtin_macro_redefined) Init(1) Warning
 Warn when a built-in preprocessor macro is undefined or redefined.
Index: gcc/cp/decl.c
===================================================================
--- gcc/cp/decl.c	(revision 239624)
+++ gcc/cp/decl.c	(working copy)
@@ -1502,6 +1502,14 @@ duplicate_decls (tree newdecl, tree olddecl, bool
 		  }
 		else if (! same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
 		  break;
+	      if (t1 || t2
+		  || DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl)
+		  || ! same_type_p (TREE_TYPE (TREE_TYPE (olddecl)),
+				    TREE_TYPE (TREE_TYPE (newdecl))))
+		warning_at (DECL_SOURCE_LOCATION (newdecl),
+			    OPT_Wbuiltin_function_redefined,
+			    "declaration of %q+#D conflicts with built-in "
+			    "declaration %q#D", newdecl, olddecl);
 	    }
 	  else if ((DECL_EXTERN_C_P (newdecl)
 		    && DECL_EXTERN_C_P (olddecl))
@@ -1555,7 +1563,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool
 
       /* Whether or not the builtin can throw exceptions has no
 	 bearing on this declarator.  */
-      TREE_NOTHROW (olddecl) = 0;
+      TREE_NOTHROW (olddecl) = TREE_NOTHROW (newdecl);
 
       if (DECL_THIS_STATIC (newdecl) && !DECL_THIS_STATIC (olddecl))
 	{
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 239624)
+++ gcc/doc/invoke.texi	(working copy)
@@ -256,8 +256,8 @@ Objective-C and Objective-C++ Dialects}.
 -pedantic-errors @gol
 -w  -Wextra  -Wall  -Waddress  -Waggregate-return  @gol
 -Wno-aggressive-loop-optimizations -Warray-bounds -Warray-bounds=@var{n} @gol
--Wno-attributes -Wbool-compare -Wno-builtin-macro-redefined @gol
--Wc90-c99-compat -Wc99-c11-compat @gol
+-Wno-attributes -Wbool-compare -Wbuiltin-function-redefined @gol
+-Wno-builtin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat @gol
 -Wc++-compat -Wc++11-compat -Wc++14-compat -Wcast-align  -Wcast-qual  @gol
 -Wchar-subscripts -Wclobbered  -Wcomment -Wconditionally-supported  @gol
 -Wconversion -Wcoverage-mismatch -Wno-cpp -Wdangling-else -Wdate-time @gol
@@ -5460,6 +5460,13 @@ unrecognized attributes, function attributes appli
 etc.  This does not stop errors for incorrect use of supported
 attributes.
 
+@item -Wbuiltin-function-redefined @r{(C++ and Objective-C++ only)}
+@opindex Wbuiltin-function-redefined
+@opindex Wno-builtin-function-redefined
+Do warn if built-in functions are redefined.  This option is only
+supported for C++ and Objective-C++.  It is implied by @option{-Wall},
+which can be disabled with @option{-Wno-builtin-function-redefined}.
+
 @item -Wno-builtin-macro-redefined
 @opindex Wno-builtin-macro-redefined
 @opindex Wbuiltin-macro-redefined
Index: gcc/testsuite/g++.dg/pr71973.C
===================================================================
--- gcc/testsuite/g++.dg/pr71973.C	(revision 0)
+++ gcc/testsuite/g++.dg/pr71973.C	(working copy)
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wbuiltin-function-redefined -fdump-tree-eh" }
+
+extern "C"
+void fork () // { dg-warning "conflicts with built-in declaration" }
+__attribute__ ((__nothrow__));
+
+void bar () throw ()
+{
+  fork ();
+}
+
+// { dg-final { scan-tree-dump-not "eh_dispatch" "eh" } }
+// { dg-final { scan-tree-dump-not "resx" "eh" } }
Index: gcc/testsuite/g++.dg/warn/noeffect5.C
===================================================================
--- gcc/testsuite/g++.dg/warn/noeffect5.C	(revision 239624)
+++ gcc/testsuite/g++.dg/warn/noeffect5.C	(working copy)
@@ -2,6 +2,7 @@
 /* { dg-do compile } */
 /* { dg-options "-Wall" } */
 
+extern "C"
 void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n);
 void f (void *dest, const void *src) {
     memcpy (dest, src, 0);
Index: gcc/testsuite/g++.old-deja/g++.other/warn01.C
===================================================================
--- gcc/testsuite/g++.old-deja/g++.other/warn01.C	(revision 239624)
+++ gcc/testsuite/g++.old-deja/g++.other/warn01.C	(working copy)
@@ -2,9 +2,11 @@
 // { dg-options "-W -Wall" }
 
 typedef unsigned long size_t;
+extern "C" {
 extern void* malloc (size_t);
 extern void free (void*);
 extern void* realloc (void*, size_t);
+}
 
 struct vtable {
   void* (* _malloc) (size_t);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]