150
|
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}}
|