Author: arsenm Date: Tue Nov 13 14:30:35 2018 New Revision: 346806 URL: http://llvm.org/viewvc/llvm-project?rev=346806&view=rev Log: OpenCL: Don't warn on v printf modifier
This avoids spurious warnings, but could use a lot of work. For example the number of vector elements is not verified, and the passed value type is not checked. Fixes bug 39486 Added: cfe/trunk/test/SemaOpenCL/printf-format-strings.cl Modified: cfe/trunk/include/clang/AST/FormatString.h cfe/trunk/lib/AST/FormatString.cpp cfe/trunk/lib/AST/PrintfFormatString.cpp cfe/trunk/test/Sema/format-strings.c Modified: cfe/trunk/include/clang/AST/FormatString.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/FormatString.h?rev=346806&r1=346805&r2=346806&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/FormatString.h (original) +++ cfe/trunk/include/clang/AST/FormatString.h Tue Nov 13 14:30:35 2018 @@ -166,6 +166,8 @@ public: ZArg, // MS extension + VArg, // OpenCL vectors + // Objective-C specific specifiers. ObjCObjArg, // '@' ObjCBeg = ObjCObjArg, Modified: cfe/trunk/lib/AST/FormatString.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/FormatString.cpp?rev=346806&r1=346805&r2=346806&view=diff ============================================================================== --- cfe/trunk/lib/AST/FormatString.cpp (original) +++ cfe/trunk/lib/AST/FormatString.cpp Tue Nov 13 14:30:35 2018 @@ -618,6 +618,9 @@ const char *ConversionSpecifier::toStrin // MS specific specifiers. case ZArg: return "Z"; + + // OpenCL specific specifiers. + case VArg: return "v"; } return nullptr; } @@ -875,6 +878,8 @@ bool FormatSpecifier::hasStandardConvers case ConversionSpecifier::CArg: case ConversionSpecifier::SArg: return LangOpt.ObjC; + case ConversionSpecifier::VArg: + return LangOpt.OpenCL; case ConversionSpecifier::InvalidSpecifier: case ConversionSpecifier::FreeBSDbArg: case ConversionSpecifier::FreeBSDDArg: Modified: cfe/trunk/lib/AST/PrintfFormatString.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/PrintfFormatString.cpp?rev=346806&r1=346805&r2=346806&view=diff ============================================================================== --- cfe/trunk/lib/AST/PrintfFormatString.cpp (original) +++ cfe/trunk/lib/AST/PrintfFormatString.cpp Tue Nov 13 14:30:35 2018 @@ -362,6 +362,12 @@ static PrintfSpecifierResult ParsePrintf case 'Z': if (Target.getTriple().isOSMSVCRT()) k = ConversionSpecifier::ZArg; + break; + // OpenCL specific. + case 'v': + if (LO.OpenCL) + k = ConversionSpecifier::VArg; + break; } // Check to see if we used the Objective-C modifier flags with @@ -1026,6 +1032,7 @@ bool PrintfSpecifier::hasValidPrecision( case ConversionSpecifier::FreeBSDrArg: case ConversionSpecifier::FreeBSDyArg: case ConversionSpecifier::PArg: + case ConversionSpecifier::VArg: return true; default: Modified: cfe/trunk/test/Sema/format-strings.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings.c?rev=346806&r1=346805&r2=346806&view=diff ============================================================================== --- cfe/trunk/test/Sema/format-strings.c (original) +++ cfe/trunk/test/Sema/format-strings.c Tue Nov 13 14:30:35 2018 @@ -613,6 +613,11 @@ void pr12761(char c) { printf("%hhx", c); } +void test_opencl_vector_format(int x) { + printf("%v4d", x); // expected-warning{{invalid conversion specifier 'v'}} + printf("%vd", x); // expected-warning{{invalid conversion specifier 'v'}} + printf("%0vd", x); // expected-warning{{invalid conversion specifier 'v'}} +} // Test that we correctly merge the format in both orders. extern void test14_foo(const char *, const char *, ...) Added: cfe/trunk/test/SemaOpenCL/printf-format-strings.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/printf-format-strings.cl?rev=346806&view=auto ============================================================================== --- cfe/trunk/test/SemaOpenCL/printf-format-strings.cl (added) +++ cfe/trunk/test/SemaOpenCL/printf-format-strings.cl Tue Nov 13 14:30:35 2018 @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -cl-std=CL1.2 -fsyntax-only -verify %s + +typedef __attribute__((ext_vector_type(2))) float float2; +typedef __attribute__((ext_vector_type(4))) float float4; +typedef __attribute__((ext_vector_type(4))) int int4; + +int printf(__constant const char* st, ...) __attribute__((format(printf, 1, 2))); + +kernel void format_v4f32(float4 arg) +{ + printf("%v4f\n", arg); // expected-no-diagnostics +} + +kernel void format_v4f32_wrong_num_elts(float2 arg) +{ + printf("%v4f\n", arg); // expected-no-diagnostics +} + +kernel void vector_precision_modifier_v4f32(float4 arg) +{ + printf("%.2v4f\n", arg); // expected-no-diagnostics +} + +// FIXME: This should warn +kernel void format_missing_num_elts(float4 arg) +{ + printf("%vf\n", arg); // expected-no-diagnostics +} + +// FIXME: This should warn +kernel void vector_precision_modifier_v4i32(int4 arg) +{ + printf("%.2v4f\n", arg); // expected-no-diagnostics +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits