aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-05-03 18:11:37 +0000
committerDouglas Gregor <dgregor@apple.com>2011-05-03 18:11:37 +0000
commit953beb47154829aa9ef9dfe3c66a5d0c4286e37f (patch)
treebdf396098609a9a2bbd3bb4071a7b6aab32b66dd
parentc5242b0e784ebe62799215ee2294aafe9863c3a2 (diff)
downloadllvm-953beb47154829aa9ef9dfe3c66a5d0c4286e37f.zip
llvm-953beb47154829aa9ef9dfe3c66a5d0c4286e37f.tar.gz
llvm-953beb47154829aa9ef9dfe3c66a5d0c4286e37f.tar.bz2
Only check the use of memset() if we're refering to a C function named
'memset' with external linkage. llvm-svn: 130770
-rw-r--r--clang/lib/Sema/SemaChecking.cpp4
-rw-r--r--clang/test/SemaCXX/warn-non-pod-memset.cpp9
2 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index dcfb7cc..ee1a924 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -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;
diff --git a/clang/test/SemaCXX/warn-non-pod-memset.cpp b/clang/test/SemaCXX/warn-non-pod-memset.cpp
index fbdcead..9023793 100644
--- a/clang/test/SemaCXX/warn-non-pod-memset.cpp
+++ b/clang/test/SemaCXX/warn-non-pod-memset.cpp
@@ -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);
+ }
+}