1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-array-bounds %s -fpascal-strings 2 // RUN: %clang_cc1 -fdiagnostics-parseable-fixits -x c++ %s 2>&1 -Wno-array-bounds -fpascal-strings | FileCheck %s 3 4 void consume(const char* c) {} 5 void consume(const unsigned char* c) {} 6 void consume(const wchar_t* c) {} 7 void consumeChar(char c) {} 8 9 enum MyEnum { 10 kMySmallEnum = 1, 11 kMyEnum = 5 12 }; 13 14 enum OperatorOverloadEnum { 15 kMyOperatorOverloadedEnum = 5 16 }; 17 18 const char* operator+(const char* c, OperatorOverloadEnum e) { 19 return "yo"; 20 } 21 22 const char* operator+(OperatorOverloadEnum e, const char* c) { 23 return "yo"; 24 } 25 26 void f(int index) { 27 // Should warn. 28 // CHECK: fix-it:"{{.*}}":{31:11-31:11}:"&" 29 // CHECK: fix-it:"{{.*}}":{31:17-31:18}:"[" 30 // CHECK: fix-it:"{{.*}}":{31:20-31:20}:"]" 31 consume("foo" + 5); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 32 consume("foo" + index); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 33 consume("foo" + kMyEnum); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 34 consume("foo" + kMySmallEnum); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 35 36 consume(5 + "foo"); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 37 consume(index + "foo"); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 38 consume(kMyEnum + "foo"); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 39 consume(kMySmallEnum + "foo"); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 40 41 // FIXME: suggest replacing with "foo"[5] 42 consumeChar(*("foo" + 5)); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 43 consumeChar(*(5 + "foo")); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 44 45 consume(L"foo" + 5); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 46 consume(L"foo" + 2); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 47 48 consume("foo" + 3); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 49 consume("foo" + 4); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 50 consume("\pfoo" + 4); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 51 52 #define A "foo" 53 #define B "bar" 54 consume(A B + sizeof(A) - 1); // expected-warning {{to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 55 56 // Should not warn. 57 consume(&("foo"[3])); 58 consume(&("foo"[index])); 59 consume(&("foo"[kMyEnum])); 60 61 62 consume("foo" + kMyOperatorOverloadedEnum); 63 consume(kMyOperatorOverloadedEnum + "foo"); 64 } 65 66 template <typename T> 67 void PR21848() { 68 (void)(sizeof(T) + ""); // expected-warning {{to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} 69 } 70 template void PR21848<int>(); // expected-note {{in instantiation of function template specialization 'PR21848<int>' requested here}} 71