]> granicus.if.org Git - clang/commitdiff
Only check the use of memset() if we're refering to a C function named
authorDouglas Gregor <dgregor@apple.com>
Tue, 3 May 2011 18:11:37 +0000 (18:11 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 3 May 2011 18:11:37 +0000 (18:11 +0000)
'memset' with external linkage.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130770 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/SemaCXX/warn-non-pod-memset.cpp

index dcfb7cc5214ab2015a992c34c2548f16b3cbdf79..ee1a924e5a1ee50fabad85310ab412298737c23c 100644 (file)
@@ -319,7 +319,9 @@ bool Sema::CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall) {
   }
 
   // Memset handling
-  if (FnInfo->isStr("memset"))
+  if (FnInfo->isStr("memset") && 
+      FDecl->getLinkage() == ExternalLinkage &&
+      (!getLangOptions().CPlusPlus || FDecl->isExternC()))
     CheckMemsetArguments(TheCall);
 
   return false;
index fbdceadae29bf919c2fd0d03b0342a98b8817de5..9023793bd52d19c9342ef793e3d9a95f2251a7d5 100644 (file)
@@ -1,6 +1,6 @@
 // RUN: %clang_cc1 -fsyntax-only -Wnon-pod-memset -verify %s
 
-extern void *memset(void *, int, unsigned);
+extern "C" void *memset(void *, int, unsigned);
 
 // Several POD types that should not warn.
 struct S1 {} s1;
@@ -61,3 +61,10 @@ void test_nowarn(void *void_ptr) {
   // Dead code shouldn't warn.
   if (false) memset(&x1, 0, sizeof x1);
 }
+
+namespace N {
+  void *memset(void *, int, unsigned);
+  void test_nowarn() {
+    N::memset(&x1, 0, sizeof x1);
+  }
+}