From 5069aa33b9aab4919322d24ffd9fa24e3b5ccfb6 Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Fri, 3 Feb 2012 01:27:37 +0000 Subject: [PATCH] Do not show macro expansion in strncat warnings, which can be defined as a builtin. llvm-svn: 149657 --- clang/lib/Sema/SemaChecking.cpp | 23 ++++++++++++++++------- clang/test/Sema/warn-strncat-size.c | 13 ++++++++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 9dbee1b2b3c6..10cf17321658 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -2742,12 +2742,22 @@ void Sema::CheckStrncatArguments(const CallExpr *CE, if (PatternType == 0) return; + // Generate the diagnostic. + SourceLocation SL = LenArg->getLocStart(); + SourceRange SR = LenArg->getSourceRange(); + SourceManager &SM = PP.getSourceManager(); + + // If the function is defined as a builtin macro, do not show macro expansion. + if (SM.isMacroArgExpansion(SL)) { + SL = SM.getSpellingLoc(SL); + SR = SourceRange(SM.getSpellingLoc(SR.getBegin()), + SM.getSpellingLoc(SR.getEnd())); + } + if (PatternType == 1) - Diag(DstArg->getLocStart(), diag::warn_strncat_large_size) - << LenArg->getSourceRange(); + Diag(SL, diag::warn_strncat_large_size) << SR; else - Diag(DstArg->getLocStart(), diag::warn_strncat_src_size) - << LenArg->getSourceRange(); + Diag(SL, diag::warn_strncat_src_size) << SR; // Output a FIXIT hint if the destination is an array (rather than a // pointer to an array). This could be enhanced to handle some @@ -2773,9 +2783,8 @@ void Sema::CheckStrncatArguments(const CallExpr *CE, DstArg->printPretty(OS, Context, 0, getPrintingPolicy()); OS << ") - 1"; - Diag(LenArg->getLocStart(), diag::note_strncat_wrong_size) - << FixItHint::CreateReplacement(LenArg->getSourceRange(), - OS.str()); + Diag(SL, diag::note_strncat_wrong_size) + << FixItHint::CreateReplacement(SR, OS.str()); } //===--- CHECK: Return Address of Stack Variable --------------------------===// diff --git a/clang/test/Sema/warn-strncat-size.c b/clang/test/Sema/warn-strncat-size.c index 4233f25d5a45..7157edffea47 100644 --- a/clang/test/Sema/warn-strncat-size.c +++ b/clang/test/Sema/warn-strncat-size.c @@ -1,9 +1,20 @@ // RUN: %clang_cc1 -Wstrncat-size -verify -fsyntax-only %s +// RUN: %clang_cc1 -DUSE_BUILTINS -Wstrncat-size -verify -fsyntax-only %s +// RUN: %clang_cc1 -fsyntax-only -Wstrncat-size -fixit -x c %s +// RUN: %clang_cc1 -DUSE_BUILTINS -fsyntax-only -Wstrncat-size -fixit -x c %s typedef __SIZE_TYPE__ size_t; -char *strncat(char *, const char *, size_t); size_t strlen (const char *s); +#ifdef USE_BUILTINS +# define BUILTIN(f) __builtin_ ## f +#else +# define BUILTIN(f) f +#endif + +#define strncat BUILTIN(strncat) +char *strncat(char *restrict s1, const char *restrict s2, size_t n); + struct { char f1[100]; char f2[100][3];