Index: test/clang-tidy/check_clang_tidy.py =================================================================== --- test/clang-tidy/check_clang_tidy.py +++ test/clang-tidy/check_clang_tidy.py @@ -26,6 +26,7 @@ """ import argparse +import os import re import subprocess import sys @@ -53,18 +54,19 @@ temp_file_name = args.temp_file_name file_name_with_extension = assume_file_name or input_file_name - - extension = '.cpp' - if (file_name_with_extension.endswith('.c')): - extension = '.c' - if (file_name_with_extension.endswith('.hpp')): - extension = '.hpp' + _, extension = os.path.splitext(file_name_with_extension) + if extension not in ['.c', '.hpp', '.m', '.mm']: + extension = '.cpp' temp_file_name = temp_file_name + extension clang_tidy_extra_args = extra_args if len(clang_tidy_extra_args) == 0: - clang_tidy_extra_args = ['--', '--std=c++11'] \ - if extension == '.cpp' or extension == '.hpp' else ['--'] + clang_tidy_extra_args = ['--'] + if extension in ['.cpp', '.hpp', '.mm']: + clang_tidy_extra_args.append('--std=c++11') + if extension in ['.m', '.mm']: + clang_tidy_extra_args.extend( + ['-fobjc-abi-version=2', '-fobjc-arc']) # Tests should not rely on STL being available, and instead provide mock # implementations of relevant APIs. Index: test/clang-tidy/objc-arc-and-properties.m =================================================================== --- /dev/null +++ test/clang-tidy/objc-arc-and-properties.m @@ -0,0 +1,21 @@ +// RUN: %check_clang_tidy %s misc-suspicious-semicolon %t + +// This test checks if Objective-C 2.0 (@properties) and +// Automatic Reference Counting (ARC) are enabled for .m files +// checked via check_clang_tidy.py. + +#if !__has_feature(objc_arc) +#error Objective-C ARC not enabled as expected +#endif + +@interface Foo +@property (nonatomic, assign) int shouldDoStuff; +- (void)nop; +@end + +void fail(Foo *f) +{ + if(f.shouldDoStuff); [f nop]; + // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: potentially unintended semicolon [misc-suspicious-semicolon] + // CHECK-FIXES: if(f.shouldDoStuff) [f nop]; +} Index: test/clang-tidy/objc-no-arc-or-properties.m =================================================================== --- /dev/null +++ test/clang-tidy/objc-no-arc-or-properties.m @@ -0,0 +1,29 @@ +// RUN: %check_clang_tidy %s misc-suspicious-semicolon %t -- -- -fno-objc-arc -fobjc-abi-version=1 + +// This test ensures check_clang_tidy.py allows disabling Objective-C ARC and +// Objective-C 2.0 via passing arguments after -- on the command line. +// +// (We could include a test which doesn't pass any arguments after -- +// to check if ARC and ObjC 2.0 are disabled by default, but that test +// could change behavior based on the default Objective-C runtime for +// the platform, which would make this test flaky.) + +#if __has_feature(objc_arc) +#error Objective-C ARC unexpectedly enabled even with -fno-objc-arc +#endif + +#ifdef __OBJC2__ +#error Objective-C 2.0 unexpectedly enabled even with -fobjc-abi-version=1 +#endif + +@interface Foo +- (int)shouldDoStuff; +- (void)nop; +@end + +void fail(Foo *f) +{ + if([f shouldDoStuff]); [f nop]; + // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: potentially unintended semicolon [misc-suspicious-semicolon] + // CHECK-FIXES: if([f shouldDoStuff]) [f nop]; +}