forked from OSchip/llvm-project
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 llvm-svn: 346806
This commit is contained in:
parent
f54aeed6f4
commit
e19dc6137f
|
@ -166,6 +166,8 @@ public:
|
|||
|
||||
ZArg, // MS extension
|
||||
|
||||
VArg, // OpenCL vectors
|
||||
|
||||
// Objective-C specific specifiers.
|
||||
ObjCObjArg, // '@'
|
||||
ObjCBeg = ObjCObjArg,
|
||||
|
|
|
@ -618,6 +618,9 @@ const char *ConversionSpecifier::toString() const {
|
|||
|
||||
// MS specific specifiers.
|
||||
case ZArg: return "Z";
|
||||
|
||||
// OpenCL specific specifiers.
|
||||
case VArg: return "v";
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -875,6 +878,8 @@ bool FormatSpecifier::hasStandardConversionSpecifier(
|
|||
case ConversionSpecifier::CArg:
|
||||
case ConversionSpecifier::SArg:
|
||||
return LangOpt.ObjC;
|
||||
case ConversionSpecifier::VArg:
|
||||
return LangOpt.OpenCL;
|
||||
case ConversionSpecifier::InvalidSpecifier:
|
||||
case ConversionSpecifier::FreeBSDbArg:
|
||||
case ConversionSpecifier::FreeBSDDArg:
|
||||
|
|
|
@ -362,6 +362,12 @@ static PrintfSpecifierResult ParsePrintfSpecifier(FormatStringHandler &H,
|
|||
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() const {
|
|||
case ConversionSpecifier::FreeBSDrArg:
|
||||
case ConversionSpecifier::FreeBSDyArg:
|
||||
case ConversionSpecifier::PArg:
|
||||
case ConversionSpecifier::VArg:
|
||||
return true;
|
||||
|
||||
default:
|
||||
|
|
|
@ -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 *, ...)
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue