I think r263584 does what you suggest. Let me know if not.

> On Mar 11, 2016, at 4:53 PM, Bob Wilson via cfe-commits 
> <cfe-commits@lists.llvm.org> wrote:
> 
> OK. I will do that.
> 
>> On Mar 11, 2016, at 4:15 PM, David Blaikie <dblai...@gmail.com 
>> <mailto:dblai...@gmail.com>> wrote:
>> 
>> 
>> 
>> On Fri, Mar 11, 2016 at 4:14 PM, Bob Wilson via cfe-commits 
>> <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:
>> I’m not sure how to interpret that. It says: "Clang must recover from errors 
>> as if the fix-it had been applied.” I suppose that format-security could be 
>> an error if you’re building with -Werror, but I had been interpreting that 
>> to mean an error that would block further compilation. Can someone clarify 
>> this expectation?
>> 
>> I don’t think we can change -Wformat-security to be a note.
>> 
>> The suggestion isn't to change it to be a note, but to keep the warning but 
>> move the fixit to a note associated with the warning.
>> 
>> That way -fix-it doesn't automatically apply the fix-it, which avoids the 
>> issue of recovery as-if the fixit was applied.
>>  
>> It is an existing warning, and people expect us to match GCC on it as well.
>> 
>> 
>>> On Mar 11, 2016, at 4:03 PM, Nico Weber <tha...@chromium.org 
>>> <mailto:tha...@chromium.org>> wrote:
>>> 
>>> I think http://clang.llvm.org/docs/InternalsManual.html#fix-it-hints 
>>> <http://clang.llvm.org/docs/InternalsManual.html#fix-it-hints> says that if 
>>> a fixit is on a warning, then clang should process the code as if the fixit 
>>> had been applied. That's not the case here, so I think the fixit should be 
>>> on a note instead.
>>> 
>>> On Fri, Mar 11, 2016 at 4:55 PM, Bob Wilson via cfe-commits 
>>> <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:
>>> Author: bwilson
>>> Date: Fri Mar 11 15:55:37 2016
>>> New Revision: 263299
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=263299&view=rev 
>>> <http://llvm.org/viewvc/llvm-project?rev=263299&view=rev>
>>> Log:
>>> Add fix-it for format-security warnings.
>>> 
>>> Added:
>>>     cfe/trunk/test/SemaObjC/format-strings-objc-fixit.m
>>> Modified:
>>>     cfe/trunk/lib/Sema/SemaChecking.cpp
>>>     cfe/trunk/test/Sema/format-strings-fixit.c
>>> 
>>> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=263299&r1=263298&r2=263299&view=diff
>>>  
>>> <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=263299&r1=263298&r2=263299&view=diff>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Fri Mar 11 15:55:37 2016
>>> @@ -3621,20 +3621,32 @@ bool Sema::CheckFormatArguments(ArrayRef
>>>    // format is either NSString or CFString. This is a hack to prevent
>>>    // diag when using the NSLocalizedString and CFCopyLocalizedString macros
>>>    // which are usually used in place of NS and CF string literals.
>>> -  if (Type == FST_NSString &&
>>> -      SourceMgr.isInSystemMacro(Args[format_idx]->getLocStart()))
>>> +  SourceLocation FormatLoc = Args[format_idx]->getLocStart();
>>> +  if (Type == FST_NSString && SourceMgr.isInSystemMacro(FormatLoc))
>>>      return false;
>>> 
>>>    // If there are no arguments specified, warn with -Wformat-security, 
>>> otherwise
>>>    // warn only with -Wformat-nonliteral.
>>> -  if (Args.size() == firstDataArg)
>>> -    Diag(Args[format_idx]->getLocStart(),
>>> -         diag::warn_format_nonliteral_noargs)
>>> +  if (Args.size() == firstDataArg) {
>>> +    const SemaDiagnosticBuilder &D =
>>> +      Diag(FormatLoc, diag::warn_format_nonliteral_noargs);
>>> +    switch (Type) {
>>> +    default:
>>> +      D << OrigFormatExpr->getSourceRange();
>>> +      break;
>>> +    case FST_Kprintf:
>>> +    case FST_FreeBSDKPrintf:
>>> +    case FST_Printf:
>>> +      D << FixItHint::CreateInsertion(FormatLoc, "\"%s\", ");
>>> +      break;
>>> +    case FST_NSString:
>>> +      D << FixItHint::CreateInsertion(FormatLoc, "@\"%@\", ");
>>> +      break;
>>> +    }
>>> +  } else {
>>> +    Diag(FormatLoc, diag::warn_format_nonliteral)
>>>        << OrigFormatExpr->getSourceRange();
>>> -  else
>>> -    Diag(Args[format_idx]->getLocStart(),
>>> -         diag::warn_format_nonliteral)
>>> -           << OrigFormatExpr->getSourceRange();
>>> +  }
>>>    return false;
>>>  }
>>> 
>>> 
>>> Modified: cfe/trunk/test/Sema/format-strings-fixit.c
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-fixit.c?rev=263299&r1=263298&r2=263299&view=diff
>>>  
>>> <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-fixit.c?rev=263299&r1=263298&r2=263299&view=diff>
>>> ==============================================================================
>>> --- cfe/trunk/test/Sema/format-strings-fixit.c (original)
>>> +++ cfe/trunk/test/Sema/format-strings-fixit.c Fri Mar 11 15:55:37 2016
>>> @@ -16,6 +16,8 @@ typedef __UINTMAX_TYPE__ uintmax_t;
>>>  typedef __PTRDIFF_TYPE__ ptrdiff_t;
>>>  typedef __WCHAR_TYPE__ wchar_t;
>>> 
>>> +extern const char *NonliteralString;
>>> +
>>>  void test() {
>>>    // Basic types
>>>    printf("%s", (int) 123);
>>> @@ -94,6 +96,9 @@ void test() {
>>>    printf("%G", (long double) 42);
>>>    printf("%a", (long double) 42);
>>>    printf("%A", (long double) 42);
>>> +
>>> +  // nonliteral format
>>> +  printf(NonliteralString);
>>>  }
>>> 
>>>  int scanf(char const *, ...);
>>> @@ -218,6 +223,7 @@ void test2(int intSAParm[static 2]) {
>>>  // CHECK: printf("%LG", (long double) 42);
>>>  // CHECK: printf("%La", (long double) 42);
>>>  // CHECK: printf("%LA", (long double) 42);
>>> +// CHECK: printf("%s", NonliteralString);
>>> 
>>>  // CHECK: scanf("%99s", str);
>>>  // CHECK: scanf("%s", vstr);
>>> 
>>> Added: cfe/trunk/test/SemaObjC/format-strings-objc-fixit.m
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/format-strings-objc-fixit.m?rev=263299&view=auto
>>>  
>>> <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/format-strings-objc-fixit.m?rev=263299&view=auto>
>>> ==============================================================================
>>> --- cfe/trunk/test/SemaObjC/format-strings-objc-fixit.m (added)
>>> +++ cfe/trunk/test/SemaObjC/format-strings-objc-fixit.m Fri Mar 11 15:55:37 
>>> 2016
>>> @@ -0,0 +1,31 @@
>>> +// RUN: cp %s %t
>>> +// RUN: %clang_cc1 -x objective-c -triple x86_64-apple-darwin 
>>> -Wno-objc-root-class -pedantic -Wall -fixit %t
>>> +// RUN: %clang_cc1 -x objective-c -triple x86_64-apple-darwin 
>>> -Wno-objc-root-class -fsyntax-only -pedantic -Wall -Werror %t
>>> +// RUN: %clang_cc1 -x objective-c -triple x86_64-apple-darwin 
>>> -Wno-objc-root-class -E -o - %t | FileCheck %s
>>> +
>>> +typedef signed char BOOL;
>>> +typedef unsigned int NSUInteger;
>>> +typedef struct _NSZone NSZone;
>>> +@class NSCoder, NSString, NSEnumerator;
>>> +@protocol NSObject  - (BOOL)isEqual:(id)object; @end
>>> +@protocol NSCopying  - (id)copyWithZone:(NSZone *)zone; @end
>>> +@protocol NSMutableCopying  - (id)mutableCopyWithZone:(NSZone *)zone; @end
>>> +@protocol NSCoding  - (void)encodeWithCoder:(NSCoder *)aCoder; @end
>>> +@interface NSObject <NSObject> {} @end
>>> +@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>  - 
>>> (NSUInteger)length; @end
>>> +extern void NSLog(NSString *format, ...);
>>> +
>>> +/* This is a test of the various code modification hints that are
>>> +   provided as part of warning or extension diagnostics. All of the
>>> +   warnings will be fixed by -fixit, and the resulting file should
>>> +   compile cleanly with -Werror -pedantic. */
>>> +
>>> +extern NSString *NonliteralString;
>>> +
>>> +void test() {
>>> +  // nonliteral format
>>> +  NSLog(NonliteralString);
>>> +}
>>> +
>>> +// Validate the fixes.
>>> +// CHECK: NSLog(@"%@", NonliteralString);
>>> 
>>> 
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits 
>>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
>>> 
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits 
>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
>> 
>> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to