1// RUN: %check_clang_tidy -check-suffix=DEFAULT %s \
2// RUN: bugprone-narrowing-conversions %t --
3
4// RUN: %check_clang_tidy -check-suffix=IGNORED %s \
5// RUN: bugprone-narrowing-conversions %t -- \
6// RUN: -config='{CheckOptions: { \
7// RUN: bugprone-narrowing-conversions.IgnoreConversionFromTypes: "global_size_t;nested_size_type;long" \
8// RUN: }}'
9
10// We use global_size_t instead of 'size_t' because windows predefines size_t.
11typedef long long global_size_t;
12
13struct vector {
14 typedef long long nested_size_type;
15
16 global_size_t size() const { return 0; }
17};
18
19void narrowing_global_size_t() {
20 int i;
21 global_size_t j;
22 i = j;
23 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'global_size_t' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
24 // IGNORED: Warning is disabled with IgnoreConversionFromTypes=global_size_t.
25}
26
27void narrowing_size_type() {
28 int i;
29 vector::nested_size_type j;
30 i = j;
31 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'vector::nested_size_type' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
32 // IGNORED: Warning is disabled with IgnoreConversionFromTypes=nested_size_type.
33}
34
35void narrowing_size_method() {
36 vector v;
37 int i, j;
38 i = v.size();
39 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'global_size_t' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
40 // IGNORED: Warning is disabled with IgnoreConversionFromTypes=global_size_t.
41
42 i = j + v.size();
43 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'global_size_t' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
44 // IGNORED: Warning is disabled with IgnoreConversionFromTypes=global_size_t.
45}
46
47void narrowing_size_method_binary_expr() {
48 int i;
49 int j;
50 vector v;
51 i = j + v.size();
52 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'global_size_t' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
53 // IGNORED: Warning is disabled with IgnoreConversionFromTypes=global_size_t.
54}
55
56void narrowing_size_method_binary_op() {
57 int i, j;
58 vector v;
59 i += v.size();
60 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:8: warning: narrowing conversion from 'global_size_t' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
61 // IGNORED: Warning is disabled with IgnoreConversionFromTypes=global_size_t.
62
63 i += j + v.size();
64 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:8: warning: narrowing conversion from 'global_size_t' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
65 // IGNORED: Warning is disabled with IgnoreConversionFromTypes=global_size_t.
66}
67
68void most_narrowing_is_not_ok() {
69 int i;
70 long long j;
71 i = j;
72 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'long long' to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
73 // CHECK-MESSAGES-IGNORED: :[[@LINE-2]]:7: warning: narrowing conversion from 'long long' to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
74}
75
76void test_ignore_builtin_type_pr58809() {
77 long x = 123;
78 short y = x;
79 // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:13: warning: narrowing conversion from 'long' to signed type 'short' is implementation-defined [bugprone-narrowing-conversions]
80 // CHECK-MESSAGES-NOT-IGNORED: :[[@LINE-2]]:13: warning: narrowing conversion from 'long' to signed type 'short' is implementation-defined [bugprone-narrowing-conversions]
81}
82

source code of clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions-ignoreconversionfromtypes-option.cpp