adlint 3.0.4 → 3.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +374 -13
- data/INSTALL +1 -3
- data/MANIFEST +12 -0
- data/NEWS +30 -4
- data/README +0 -4
- data/TODO +2 -1
- data/etc/mesg.d/c_builtin/en_US/messages.yml +2 -2
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +2 -2
- data/etc/mesg.d/core/en_US/messages.yml +5 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +5 -1
- data/features/code_check/W0422.feature +128 -0
- data/features/code_check/W0491.feature +57 -0
- data/features/code_check/W0492.feature +80 -0
- data/features/code_check/W0542.feature +20 -0
- data/features/code_check/W0580.feature +25 -0
- data/features/code_check/W0610.feature +36 -0
- data/features/code_check/W0642.feature +67 -0
- data/features/code_check/W0786.feature +39 -0
- data/features/code_check/W0830.feature +27 -0
- data/features/code_check/W1047.feature +72 -0
- data/features/code_check/W9003.feature +22 -0
- data/features/code_extraction/TODO +1 -0
- data/features/metric_measurement/TODO +1 -0
- data/lib/adlint/analyzer.rb +2 -2
- data/lib/adlint/cc1/ctrlexpr.rb +27 -6
- data/lib/adlint/cc1/domain.rb +72 -12
- data/lib/adlint/cc1/enum.rb +4 -0
- data/lib/adlint/cc1/expr.rb +31 -29
- data/lib/adlint/cc1/interp.rb +45 -56
- data/lib/adlint/cc1/lexer.rb +26 -5
- data/lib/adlint/cc1/mediator.rb +35 -6
- data/lib/adlint/cc1/object.rb +62 -19
- data/lib/adlint/cc1/parser.rb +948 -904
- data/lib/adlint/cc1/parser.y +59 -29
- data/lib/adlint/cc1/phase.rb +6 -8
- data/lib/adlint/cc1/syntax.rb +70 -17
- data/lib/adlint/cc1/util.rb +4 -4
- data/lib/adlint/code.rb +16 -6
- data/lib/adlint/cpp/eval.rb +31 -25
- data/lib/adlint/cpp/lexer.rb +11 -5
- data/lib/adlint/cpp/macro.rb +34 -7
- data/lib/adlint/cpp/phase.rb +8 -8
- data/lib/adlint/error.rb +6 -0
- data/lib/adlint/exam/c_builtin/cc1_check.rb +557 -594
- data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +72 -72
- data/lib/adlint/exam/c_builtin/cc1_code.rb +72 -52
- data/lib/adlint/exam/c_builtin/cc1_metric.rb +131 -131
- data/lib/adlint/exam/c_builtin/cpp_check.rb +48 -48
- data/lib/adlint/exam/c_builtin/cpp_check_shima.rb +2 -2
- data/lib/adlint/exam/c_builtin/cpp_code.rb +21 -21
- data/lib/adlint/exam/c_builtin/ld_check.rb +88 -87
- data/lib/adlint/exam/c_builtin/ld_metric.rb +4 -5
- data/lib/adlint/exam/c_builtin.rb +6 -6
- data/lib/adlint/ld/object.rb +269 -186
- data/lib/adlint/ld/phase.rb +19 -19
- data/lib/adlint/ld/typedef.rb +7 -7
- data/lib/adlint/ld/util.rb +25 -17
- data/lib/adlint/location.rb +6 -1
- data/lib/adlint/memo.rb +66 -13
- data/lib/adlint/prelude.rb +2 -2
- data/lib/adlint/report.rb +13 -14
- data/lib/adlint/util.rb +1 -1
- data/lib/adlint/version.rb +2 -2
- data/share/doc/Makefile +6 -2
- data/share/doc/c99gram.dot +502 -0
- data/share/doc/c99gram.pdf +0 -0
- data/share/doc/developers_guide_ja.html +4 -3
- data/share/doc/developers_guide_ja.texi +2 -1
- data/share/doc/users_guide_en.html +9 -9
- data/share/doc/users_guide_en.texi +7 -7
- data/share/doc/users_guide_ja.html +9 -9
- data/share/doc/users_guide_ja.texi +7 -7
- metadata +14 -2
@@ -56,9 +56,9 @@ module CBuiltin #:nodoc:
|
|
56
56
|
|
57
57
|
def initialize(phase_ctxt)
|
58
58
|
super
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
60
|
+
traversal.enter_grouped_expression += T(:enter_grouped_expression)
|
61
|
+
traversal.leave_grouped_expression += T(:leave_grouped_expression)
|
62
62
|
@group_depth = 0
|
63
63
|
end
|
64
64
|
|
@@ -82,8 +82,8 @@ module CBuiltin #:nodoc:
|
|
82
82
|
|
83
83
|
def initialize(phase_ctxt)
|
84
84
|
super
|
85
|
-
|
86
|
-
|
85
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
86
|
+
traversal.enter_kandr_function_definition += T(:check)
|
87
87
|
end
|
88
88
|
|
89
89
|
private
|
@@ -101,8 +101,8 @@ module CBuiltin #:nodoc:
|
|
101
101
|
|
102
102
|
def initialize(phase_ctxt)
|
103
103
|
super
|
104
|
-
|
105
|
-
|
104
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
105
|
+
traversal.enter_switch_statement += T(:check)
|
106
106
|
end
|
107
107
|
|
108
108
|
private
|
@@ -138,8 +138,8 @@ module CBuiltin #:nodoc:
|
|
138
138
|
|
139
139
|
def initialize(phase_ctxt)
|
140
140
|
super
|
141
|
-
|
142
|
-
|
141
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
142
|
+
traversal.enter_switch_statement += T(:enter_switch_statement)
|
143
143
|
end
|
144
144
|
|
145
145
|
private
|
@@ -199,8 +199,8 @@ module CBuiltin #:nodoc:
|
|
199
199
|
|
200
200
|
def initialize(phase_ctxt)
|
201
201
|
super
|
202
|
-
|
203
|
-
|
202
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
203
|
+
traversal.enter_conditional_expression += T(:check)
|
204
204
|
end
|
205
205
|
|
206
206
|
private
|
@@ -221,8 +221,8 @@ module CBuiltin #:nodoc:
|
|
221
221
|
|
222
222
|
def initialize(phase_ctxt)
|
223
223
|
super
|
224
|
-
|
225
|
-
|
224
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
225
|
+
traversal.enter_continue_statement += T(:check)
|
226
226
|
end
|
227
227
|
|
228
228
|
private
|
@@ -534,33 +534,35 @@ module CBuiltin #:nodoc:
|
|
534
534
|
@interp.on_indirection_expr_evaled += T(:check_indirection)
|
535
535
|
@interp.on_member_access_expr_evaled += T(:check_member_access)
|
536
536
|
@interp.on_array_subscript_expr_evaled += T(:check_array_subscript)
|
537
|
-
@enum_tbl = @interp.environment.enumerator_table
|
538
537
|
end
|
539
538
|
|
540
539
|
private
|
541
540
|
def check_indirection(expr, var, *)
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
541
|
+
if @interp.constant_expression?(expr.operand)
|
542
|
+
if var.value.scalar? &&
|
543
|
+
var.value.must_be_equal_to?(@interp.scalar_value_of(0))
|
544
|
+
W(expr.location)
|
545
|
+
end
|
546
546
|
end
|
547
547
|
end
|
548
548
|
|
549
549
|
def check_member_access(expr, outer_var, *)
|
550
550
|
return unless outer_var.type.pointer?
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
551
|
+
if @interp.constant_expression?(expr.expression)
|
552
|
+
if outer_var.value.scalar? &&
|
553
|
+
outer_var.value.must_be_equal_to?(@interp.scalar_value_of(0))
|
554
|
+
W(expr.location)
|
555
|
+
end
|
555
556
|
end
|
556
557
|
end
|
557
558
|
|
558
559
|
def check_array_subscript(expr, ptr_var, *)
|
559
560
|
return unless ptr_var.type.pointer?
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
561
|
+
if @interp.constant_expression?(expr.expression)
|
562
|
+
if ptr_var.value.scalar? &&
|
563
|
+
ptr_var.value.must_be_equal_to?(@interp.scalar_value_of(0))
|
564
|
+
W(expr.location)
|
565
|
+
end
|
564
566
|
end
|
565
567
|
end
|
566
568
|
end
|
@@ -585,7 +587,6 @@ module CBuiltin #:nodoc:
|
|
585
587
|
@interp.on_postfix_increment_expr_evaled += T(:check_unary_postfix)
|
586
588
|
@interp.on_prefix_decrement_expr_evaled += T(:check_unary_prefix)
|
587
589
|
@interp.on_postfix_decrement_expr_evaled += T(:check_unary_postfix)
|
588
|
-
@enum_tbl = @interp.environment.enumerator_table
|
589
590
|
end
|
590
591
|
|
591
592
|
private
|
@@ -593,12 +594,12 @@ module CBuiltin #:nodoc:
|
|
593
594
|
lhs_type, lhs_val = lhs_var.type, lhs_var.value
|
594
595
|
rhs_type, rhs_val = rhs_var.type, rhs_var.value
|
595
596
|
|
596
|
-
if expr.lhs_operand
|
597
|
+
if @interp.constant_expression?(expr.lhs_operand) && lhs_type.pointer? &&
|
597
598
|
lhs_val.must_be_equal_to?(@interp.scalar_value_of(0))
|
598
599
|
W(expr.lhs_operand.location)
|
599
600
|
end
|
600
601
|
|
601
|
-
if expr.rhs_operand
|
602
|
+
if @interp.constant_expression?(expr.rhs_operand) && rhs_type.pointer? &&
|
602
603
|
rhs_val.must_be_equal_to?(@interp.scalar_value_of(0))
|
603
604
|
W(expr.rhs_operand.location)
|
604
605
|
end
|
@@ -607,7 +608,7 @@ module CBuiltin #:nodoc:
|
|
607
608
|
def check_unary_prefix(expr, ope_var, org_val)
|
608
609
|
type, val = ope_var.type, org_val
|
609
610
|
|
610
|
-
if expr.operand
|
611
|
+
if @interp.constant_expression?(expr.operand) && type.pointer? &&
|
611
612
|
val.must_be_equal_to?(@interp.scalar_value_of(0))
|
612
613
|
W(expr.operand.location)
|
613
614
|
end
|
@@ -616,7 +617,7 @@ module CBuiltin #:nodoc:
|
|
616
617
|
def check_unary_postfix(expr, ope_var, *)
|
617
618
|
type, val = ope_var.type, ope_var.value
|
618
619
|
|
619
|
-
if expr.operand
|
620
|
+
if @interp.constant_expression?(expr.operand) && type.pointer? &&
|
620
621
|
val.must_be_equal_to?(@interp.scalar_value_of(0))
|
621
622
|
W(expr.operand.location)
|
622
623
|
end
|
@@ -764,13 +765,13 @@ module CBuiltin #:nodoc:
|
|
764
765
|
|
765
766
|
def initialize(phase_ctxt)
|
766
767
|
super
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
768
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
769
|
+
traversal.enter_init_declarator += T(:check_init_decl)
|
770
|
+
traversal.enter_struct_declarator += T(:check_struct_decl)
|
771
|
+
traversal.enter_parameter_declaration += T(:check_parameter_decl)
|
772
|
+
traversal.enter_kandr_function_definition += T(:check_kandr_fundef)
|
773
|
+
traversal.enter_ansi_function_definition += T(:check_ansi_fundef)
|
774
|
+
traversal.enter_type_name += T(:check_type_name)
|
774
775
|
end
|
775
776
|
|
776
777
|
private
|
@@ -892,11 +893,11 @@ module CBuiltin #:nodoc:
|
|
892
893
|
|
893
894
|
def initialize(phase_ctxt)
|
894
895
|
super
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
896
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
897
|
+
traversal.enter_struct_specifier += T(:enter_struct_specifier)
|
898
|
+
traversal.leave_struct_specifier += T(:leave_struct_specifier)
|
899
|
+
traversal.enter_union_specifier += T(:enter_union_specifier)
|
900
|
+
traversal.leave_union_specifier += T(:leave_union_specifier)
|
900
901
|
@nest_level = 0
|
901
902
|
end
|
902
903
|
|
@@ -929,8 +930,8 @@ module CBuiltin #:nodoc:
|
|
929
930
|
|
930
931
|
def initialize(phase_ctxt)
|
931
932
|
super
|
932
|
-
|
933
|
-
|
933
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
934
|
+
traversal.enter_variable_definition += T(:check)
|
934
935
|
end
|
935
936
|
|
936
937
|
private
|
@@ -950,12 +951,12 @@ module CBuiltin #:nodoc:
|
|
950
951
|
|
951
952
|
def initialize(phase_ctxt)
|
952
953
|
super
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
954
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
955
|
+
traversal.enter_compound_statement += T(:enter_block)
|
956
|
+
traversal.leave_compound_statement += T(:leave_block)
|
957
|
+
traversal.enter_variable_definition += T(:add_identifier)
|
958
|
+
traversal.enter_variable_declaration += T(:add_identifier)
|
959
|
+
traversal.enter_typedef_declaration += T(:add_identifier)
|
959
960
|
@block_stack = [0]
|
960
961
|
end
|
961
962
|
|
@@ -983,9 +984,9 @@ module CBuiltin #:nodoc:
|
|
983
984
|
|
984
985
|
def initialize(phase_ctxt)
|
985
986
|
super
|
986
|
-
|
987
|
-
|
988
|
-
|
987
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
988
|
+
traversal.enter_struct_type_declaration += T(:check)
|
989
|
+
traversal.enter_union_type_declaration += T(:check)
|
989
990
|
end
|
990
991
|
|
991
992
|
private
|
@@ -1012,9 +1013,9 @@ module CBuiltin #:nodoc:
|
|
1012
1013
|
|
1013
1014
|
def initialize(phase_ctxt)
|
1014
1015
|
super
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1016
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1017
|
+
traversal.enter_struct_type_declaration += T(:check_struct)
|
1018
|
+
traversal.enter_union_type_declaration += T(:check_union)
|
1018
1019
|
end
|
1019
1020
|
|
1020
1021
|
private
|
@@ -1044,8 +1045,8 @@ module CBuiltin #:nodoc:
|
|
1044
1045
|
|
1045
1046
|
def initialize(phase_ctxt)
|
1046
1047
|
super
|
1047
|
-
|
1048
|
-
|
1048
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1049
|
+
traversal.enter_enum_type_declaration += T(:check)
|
1049
1050
|
end
|
1050
1051
|
|
1051
1052
|
private
|
@@ -1065,8 +1066,8 @@ module CBuiltin #:nodoc:
|
|
1065
1066
|
|
1066
1067
|
def initialize(phase_ctxt)
|
1067
1068
|
super
|
1068
|
-
|
1069
|
-
|
1069
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1070
|
+
traversal.enter_variable_definition += T(:enter_variable_definition)
|
1070
1071
|
end
|
1071
1072
|
|
1072
1073
|
private
|
@@ -1180,19 +1181,19 @@ module CBuiltin #:nodoc:
|
|
1180
1181
|
|
1181
1182
|
def initialize(phase_ctxt)
|
1182
1183
|
super
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1184
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1185
|
+
traversal.enter_if_statement += T(:enter_if_statement)
|
1186
|
+
traversal.leave_if_statement += T(:leave_if_statement)
|
1187
|
+
traversal.enter_switch_statement += T(:enter_switch_statement)
|
1188
|
+
traversal.leave_switch_statement += T(:leave_switch_statement)
|
1189
|
+
traversal.enter_while_statement += T(:enter_while_statement)
|
1190
|
+
traversal.leave_while_statement += T(:leave_while_statement)
|
1191
|
+
traversal.enter_do_statement += T(:enter_do_statement)
|
1192
|
+
traversal.leave_do_statement += T(:leave_do_statement)
|
1193
|
+
traversal.enter_for_statement += T(:enter_for_statement)
|
1194
|
+
traversal.leave_for_statement += T(:leave_for_statement)
|
1195
|
+
traversal.enter_c99_for_statement += T(:enter_c99_for_statement)
|
1196
|
+
traversal.leave_c99_for_statement += T(:leave_c99_for_statement)
|
1196
1197
|
@ctrl_stmt_level = 0
|
1197
1198
|
end
|
1198
1199
|
|
@@ -1261,10 +1262,10 @@ module CBuiltin #:nodoc:
|
|
1261
1262
|
|
1262
1263
|
def initialize(phase_ctxt)
|
1263
1264
|
super
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1265
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1266
|
+
traversal.enter_switch_statement += T(:enter_switch_statement)
|
1267
|
+
traversal.leave_switch_statement += T(:leave_switch_statement)
|
1268
|
+
traversal.enter_case_labeled_statement += T(:check)
|
1268
1269
|
@label_num_stack = []
|
1269
1270
|
end
|
1270
1271
|
|
@@ -1399,8 +1400,8 @@ module CBuiltin #:nodoc:
|
|
1399
1400
|
|
1400
1401
|
def initialize(phase_ctxt)
|
1401
1402
|
super
|
1402
|
-
|
1403
|
-
|
1403
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1404
|
+
traversal.enter_string_literal_specifier += T(:check)
|
1404
1405
|
end
|
1405
1406
|
|
1406
1407
|
private
|
@@ -1420,8 +1421,8 @@ module CBuiltin #:nodoc:
|
|
1420
1421
|
|
1421
1422
|
def initialize(phase_ctxt)
|
1422
1423
|
super
|
1423
|
-
|
1424
|
-
|
1424
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1425
|
+
traversal.enter_typeof_type_specifier += T(:check)
|
1425
1426
|
end
|
1426
1427
|
|
1427
1428
|
private
|
@@ -1439,9 +1440,9 @@ module CBuiltin #:nodoc:
|
|
1439
1440
|
|
1440
1441
|
def initialize(phase_ctxt)
|
1441
1442
|
super
|
1442
|
-
|
1443
|
-
|
1444
|
-
|
1443
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1444
|
+
traversal.enter_alignof_expression += T(:check)
|
1445
|
+
traversal.enter_alignof_type_expression += T(:check)
|
1445
1446
|
end
|
1446
1447
|
|
1447
1448
|
private
|
@@ -1478,8 +1479,8 @@ module CBuiltin #:nodoc:
|
|
1478
1479
|
|
1479
1480
|
def initialize(phase_ctxt)
|
1480
1481
|
super
|
1481
|
-
|
1482
|
-
|
1482
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1483
|
+
traversal.enter_simple_assignment_expression += T(:check)
|
1483
1484
|
end
|
1484
1485
|
|
1485
1486
|
private
|
@@ -1499,9 +1500,9 @@ module CBuiltin #:nodoc:
|
|
1499
1500
|
|
1500
1501
|
def initialize(phase_ctxt)
|
1501
1502
|
super
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1503
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1504
|
+
traversal.enter_ansi_function_definition += T(:check_ansi_function)
|
1505
|
+
traversal.enter_kandr_function_definition += T(:check_kandr_function)
|
1505
1506
|
@interp = phase_ctxt[:cc1_interpreter]
|
1506
1507
|
end
|
1507
1508
|
|
@@ -1579,9 +1580,9 @@ module CBuiltin #:nodoc:
|
|
1579
1580
|
|
1580
1581
|
def initialize(phase_ctxt)
|
1581
1582
|
super
|
1582
|
-
|
1583
|
-
|
1584
|
-
|
1583
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1584
|
+
traversal.enter_bit_access_by_value_expression += T(:check)
|
1585
|
+
traversal.enter_bit_access_by_pointer_expression += T(:check)
|
1585
1586
|
end
|
1586
1587
|
|
1587
1588
|
private
|
@@ -1690,8 +1691,8 @@ module CBuiltin #:nodoc:
|
|
1690
1691
|
|
1691
1692
|
def initialize(phase_ctxt)
|
1692
1693
|
super
|
1693
|
-
|
1694
|
-
|
1694
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1695
|
+
traversal.enter_function_declaration += T(:check)
|
1695
1696
|
end
|
1696
1697
|
|
1697
1698
|
private
|
@@ -1709,8 +1710,8 @@ module CBuiltin #:nodoc:
|
|
1709
1710
|
|
1710
1711
|
def initialize(phase_ctxt)
|
1711
1712
|
super
|
1712
|
-
|
1713
|
-
|
1713
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1714
|
+
traversal.enter_variable_definition += T(:check)
|
1714
1715
|
@interp = phase_ctxt[:cc1_interpreter]
|
1715
1716
|
end
|
1716
1717
|
|
@@ -1720,9 +1721,9 @@ module CBuiltin #:nodoc:
|
|
1720
1721
|
|
1721
1722
|
if node.type.array? && node.type.base_type.same_as?(@interp.char_t)
|
1722
1723
|
if len = node.type.length
|
1723
|
-
|
1724
|
-
node.initializer.expression.accept(
|
1725
|
-
if str_lit =
|
1724
|
+
finder = StringLiteralSpecifierFinder.new
|
1725
|
+
node.initializer.expression.accept(finder)
|
1726
|
+
if str_lit = finder.result
|
1726
1727
|
str = unquote_string_literal(str_lit)
|
1727
1728
|
W(node.location) if len <= str.length
|
1728
1729
|
end
|
@@ -1846,8 +1847,8 @@ module CBuiltin #:nodoc:
|
|
1846
1847
|
|
1847
1848
|
def initialize(phase_ctxt)
|
1848
1849
|
super
|
1849
|
-
|
1850
|
-
|
1850
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1851
|
+
traversal.enter_comma_separated_expression += T(:check)
|
1851
1852
|
end
|
1852
1853
|
|
1853
1854
|
private
|
@@ -1871,7 +1872,7 @@ module CBuiltin #:nodoc:
|
|
1871
1872
|
def do_prepare(phase_ctxt) end
|
1872
1873
|
|
1873
1874
|
def do_execute(phase_ctxt)
|
1874
|
-
phase_ctxt[:
|
1875
|
+
phase_ctxt[:cc1_ast].accept(Visitor.new(phase_ctxt))
|
1875
1876
|
end
|
1876
1877
|
|
1877
1878
|
class Visitor < Cc1::SyntaxTreeVisitor
|
@@ -1925,8 +1926,8 @@ module CBuiltin #:nodoc:
|
|
1925
1926
|
|
1926
1927
|
def initialize(phase_ctxt)
|
1927
1928
|
super
|
1928
|
-
|
1929
|
-
|
1929
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1930
|
+
traversal.enter_conditional_expression += T(:check)
|
1930
1931
|
end
|
1931
1932
|
|
1932
1933
|
private
|
@@ -1949,14 +1950,14 @@ module CBuiltin #:nodoc:
|
|
1949
1950
|
|
1950
1951
|
def initialize(phase_ctxt)
|
1951
1952
|
super
|
1952
|
-
|
1953
|
-
|
1954
|
-
|
1955
|
-
|
1956
|
-
|
1957
|
-
|
1958
|
-
|
1959
|
-
|
1953
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
1954
|
+
traversal.enter_simple_assignment_expression += T(:enter_assignment)
|
1955
|
+
traversal.leave_simple_assignment_expression += T(:leave_assignment)
|
1956
|
+
traversal.enter_compound_assignment_expression += T(:enter_assignment)
|
1957
|
+
traversal.leave_compound_assignment_expression += T(:leave_assignment)
|
1958
|
+
traversal.enter_function_call_expression += T(:enter_assignment)
|
1959
|
+
traversal.leave_function_call_expression += T(:leave_assignment)
|
1960
|
+
traversal.enter_comma_separated_expression += T(:check)
|
1960
1961
|
@assignment_depth = 0
|
1961
1962
|
end
|
1962
1963
|
|
@@ -2028,13 +2029,12 @@ module CBuiltin #:nodoc:
|
|
2028
2029
|
super
|
2029
2030
|
@interp = phase_ctxt[:cc1_interpreter]
|
2030
2031
|
@interp.on_multiplicative_expr_evaled += T(:check)
|
2031
|
-
@enum_tbl = @interp.environment.enumerator_table
|
2032
2032
|
end
|
2033
2033
|
|
2034
2034
|
private
|
2035
2035
|
def check(expr, lhs_var, rhs_var, *)
|
2036
2036
|
return if expr.operator.type == "*"
|
2037
|
-
return if expr.rhs_operand
|
2037
|
+
return if @interp.constant_expression?(expr.rhs_operand)
|
2038
2038
|
|
2039
2039
|
return unless rhs_var.type.scalar? && rhs_var.value.scalar?
|
2040
2040
|
return if rhs_var.value.must_be_equal_to?(@interp.scalar_value_of(0))
|
@@ -2056,13 +2056,12 @@ module CBuiltin #:nodoc:
|
|
2056
2056
|
super
|
2057
2057
|
@interp = phase_ctxt[:cc1_interpreter]
|
2058
2058
|
@interp.on_multiplicative_expr_evaled += T(:check)
|
2059
|
-
@enum_tbl = @interp.environment.enumerator_table
|
2060
2059
|
end
|
2061
2060
|
|
2062
2061
|
private
|
2063
2062
|
def check(expr, lhs_var, rhs_var, *)
|
2064
2063
|
return if expr.operator.type == "*"
|
2065
|
-
return unless expr.rhs_operand
|
2064
|
+
return unless @interp.constant_expression?(expr.rhs_operand)
|
2066
2065
|
|
2067
2066
|
return unless rhs_var.type.scalar? && rhs_var.value.scalar?
|
2068
2067
|
|
@@ -2083,13 +2082,12 @@ module CBuiltin #:nodoc:
|
|
2083
2082
|
super
|
2084
2083
|
@interp = phase_ctxt[:cc1_interpreter]
|
2085
2084
|
@interp.on_multiplicative_expr_evaled += T(:check)
|
2086
|
-
@enum_tbl = @interp.environment.enumerator_table
|
2087
2085
|
end
|
2088
2086
|
|
2089
2087
|
private
|
2090
2088
|
def check(expr, lhs_var, rhs_var, *)
|
2091
2089
|
return if expr.operator.type == "*"
|
2092
|
-
return if expr.rhs_operand
|
2090
|
+
return if @interp.constant_expression?(expr.rhs_operand)
|
2093
2091
|
|
2094
2092
|
return unless rhs_var.type.scalar? && rhs_var.value.scalar?
|
2095
2093
|
|
@@ -2511,7 +2509,7 @@ module CBuiltin #:nodoc:
|
|
2511
2509
|
def do_prepare(phase_ctxt) end
|
2512
2510
|
|
2513
2511
|
def do_execute(phase_ctxt)
|
2514
|
-
phase_ctxt[:
|
2512
|
+
phase_ctxt[:cc1_ast].accept(Visitor.new(phase_ctxt))
|
2515
2513
|
end
|
2516
2514
|
|
2517
2515
|
class Visitor < Cc1::SyntaxTreeVisitor
|
@@ -2732,7 +2730,7 @@ module CBuiltin #:nodoc:
|
|
2732
2730
|
def do_prepare(phase_ctxt) end
|
2733
2731
|
|
2734
2732
|
def do_execute(phase_ctxt)
|
2735
|
-
phase_ctxt[:
|
2733
|
+
phase_ctxt[:cc1_ast].accept(Visitor.new(phase_ctxt))
|
2736
2734
|
end
|
2737
2735
|
|
2738
2736
|
class Visitor < Cc1::SyntaxTreeVisitor
|
@@ -8088,8 +8086,8 @@ module CBuiltin #:nodoc:
|
|
8088
8086
|
|
8089
8087
|
def initialize(phase_ctxt)
|
8090
8088
|
super
|
8091
|
-
|
8092
|
-
|
8089
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
8090
|
+
traversal.enter_enum_type_declaration += T(:check)
|
8093
8091
|
end
|
8094
8092
|
|
8095
8093
|
private
|
@@ -8113,13 +8111,13 @@ module CBuiltin #:nodoc:
|
|
8113
8111
|
|
8114
8112
|
def initialize(phase_ctxt)
|
8115
8113
|
super
|
8116
|
-
|
8117
|
-
|
8118
|
-
|
8119
|
-
|
8120
|
-
|
8121
|
-
|
8122
|
-
|
8114
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
8115
|
+
traversal.enter_if_statement += T(:check_if_statement)
|
8116
|
+
traversal.enter_if_else_statement += T(:check_if_else_statement)
|
8117
|
+
traversal.enter_while_statement += T(:check_while_statement)
|
8118
|
+
traversal.enter_do_statement += T(:check_do_statement)
|
8119
|
+
traversal.enter_for_statement += T(:check_for_statement)
|
8120
|
+
traversal.enter_c99_for_statement += T(:check_for_statement)
|
8123
8121
|
end
|
8124
8122
|
|
8125
8123
|
private
|
@@ -8187,13 +8185,13 @@ module CBuiltin #:nodoc:
|
|
8187
8185
|
|
8188
8186
|
def initialize(phase_ctxt)
|
8189
8187
|
super
|
8190
|
-
|
8191
|
-
|
8192
|
-
|
8193
|
-
|
8194
|
-
|
8195
|
-
|
8196
|
-
|
8188
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
8189
|
+
traversal.enter_if_statement += T(:check_if_statement)
|
8190
|
+
traversal.enter_if_else_statement += T(:check_if_else_statement)
|
8191
|
+
traversal.enter_while_statement += T(:check_while_statement)
|
8192
|
+
traversal.enter_do_statement += T(:check_do_statement)
|
8193
|
+
traversal.enter_for_statement += T(:check_for_statement)
|
8194
|
+
traversal.enter_c99_for_statement += T(:check_for_statement)
|
8197
8195
|
end
|
8198
8196
|
|
8199
8197
|
private
|
@@ -8265,33 +8263,35 @@ module CBuiltin #:nodoc:
|
|
8265
8263
|
@interp.on_indirection_expr_evaled += T(:check_indirection)
|
8266
8264
|
@interp.on_member_access_expr_evaled += T(:check_member_access)
|
8267
8265
|
@interp.on_array_subscript_expr_evaled += T(:check_array_subscript)
|
8268
|
-
@enum_tbl = @interp.environment.enumerator_table
|
8269
8266
|
end
|
8270
8267
|
|
8271
8268
|
private
|
8272
8269
|
def check_indirection(expr, ptr_var, *)
|
8273
|
-
|
8274
|
-
|
8275
|
-
|
8276
|
-
|
8270
|
+
unless @interp.constant_expression?(expr.operand)
|
8271
|
+
if ptr_var.value.scalar? &&
|
8272
|
+
ptr_var.value.must_be_equal_to?(@interp.scalar_value_of(0))
|
8273
|
+
W(expr.location)
|
8274
|
+
end
|
8277
8275
|
end
|
8278
8276
|
end
|
8279
8277
|
|
8280
8278
|
def check_member_access(expr, outer_var, *)
|
8281
8279
|
return unless outer_var.type.pointer?
|
8282
|
-
|
8283
|
-
|
8284
|
-
|
8285
|
-
|
8280
|
+
unless @interp.constant_expression?(expr.expression)
|
8281
|
+
if outer_var.value.scalar? &&
|
8282
|
+
outer_var.value.must_be_equal_to?(@interp.scalar_value_of(0))
|
8283
|
+
W(expr.location)
|
8284
|
+
end
|
8286
8285
|
end
|
8287
8286
|
end
|
8288
8287
|
|
8289
8288
|
def check_array_subscript(expr, ary_or_ptr, *)
|
8290
8289
|
return unless ary_or_ptr.type.pointer?
|
8291
|
-
|
8292
|
-
|
8293
|
-
|
8294
|
-
|
8290
|
+
unless @interp.constant_expression?(expr.expression)
|
8291
|
+
if ary_or_ptr.value.scalar? &&
|
8292
|
+
ary_or_ptr.value.must_be_equal_to?(@interp.scalar_value_of(0))
|
8293
|
+
W(expr.location)
|
8294
|
+
end
|
8295
8295
|
end
|
8296
8296
|
end
|
8297
8297
|
end
|
@@ -8309,12 +8309,11 @@ module CBuiltin #:nodoc:
|
|
8309
8309
|
@interp.on_indirection_expr_evaled += T(:check_indirection)
|
8310
8310
|
@interp.on_member_access_expr_evaled += T(:check_member_access)
|
8311
8311
|
@interp.on_array_subscript_expr_evaled += T(:check_array_subscript)
|
8312
|
-
@enum_tbl = @interp.environment.enumerator_table
|
8313
8312
|
end
|
8314
8313
|
|
8315
8314
|
private
|
8316
8315
|
def check_indirection(expr, ptr_var, *)
|
8317
|
-
return if expr.operand
|
8316
|
+
return if @interp.constant_expression?(expr.operand)
|
8318
8317
|
return unless ptr_var.value.scalar?
|
8319
8318
|
|
8320
8319
|
if !ptr_var.value.must_be_equal_to?(@interp.scalar_value_of(0)) &&
|
@@ -8325,7 +8324,7 @@ module CBuiltin #:nodoc:
|
|
8325
8324
|
|
8326
8325
|
def check_member_access(expr, outer_var, *)
|
8327
8326
|
return unless outer_var.type.pointer?
|
8328
|
-
return if expr.expression
|
8327
|
+
return if @interp.constant_expression?(expr.expression)
|
8329
8328
|
return unless outer_var.value.scalar?
|
8330
8329
|
|
8331
8330
|
if !outer_var.value.must_be_equal_to?(@interp.scalar_value_of(0)) &&
|
@@ -8336,7 +8335,7 @@ module CBuiltin #:nodoc:
|
|
8336
8335
|
|
8337
8336
|
def check_array_subscript(expr, ary_or_ptr, *)
|
8338
8337
|
return unless ary_or_ptr.type.pointer?
|
8339
|
-
return if expr.expression
|
8338
|
+
return if @interp.constant_expression?(expr.expression)
|
8340
8339
|
return unless ary_or_ptr.value.scalar?
|
8341
8340
|
|
8342
8341
|
if !ary_or_ptr.value.must_be_equal_to?(@interp.scalar_value_of(0)) &&
|
@@ -8473,7 +8472,7 @@ module CBuiltin #:nodoc:
|
|
8473
8472
|
def do_prepare(phase_ctxt) end
|
8474
8473
|
|
8475
8474
|
def do_execute(phase_ctxt)
|
8476
|
-
phase_ctxt[:
|
8475
|
+
phase_ctxt[:cc1_ast].accept(Visitor.new(phase_ctxt))
|
8477
8476
|
end
|
8478
8477
|
|
8479
8478
|
class Visitor < Cc1::SyntaxTreeVisitor
|
@@ -8681,8 +8680,9 @@ module CBuiltin #:nodoc:
|
|
8681
8680
|
private
|
8682
8681
|
def do_prepare(phase_ctxt)
|
8683
8682
|
fpath = phase_ctxt[:sources].first.fpath
|
8684
|
-
|
8685
|
-
|
8683
|
+
@tokens = phase_ctxt[:cc1_tokens].select { |tok|
|
8684
|
+
tok.location.fpath == fpath
|
8685
|
+
}
|
8686
8686
|
@index = 0
|
8687
8687
|
@indent_level = 0
|
8688
8688
|
@indent_widths = Hash.new(0)
|
@@ -8884,8 +8884,9 @@ module CBuiltin #:nodoc:
|
|
8884
8884
|
private
|
8885
8885
|
def do_prepare(phase_ctxt)
|
8886
8886
|
fpath = phase_ctxt[:sources].first.fpath
|
8887
|
-
|
8888
|
-
|
8887
|
+
@tokens = phase_ctxt[:cc1_tokens].select { |tok|
|
8888
|
+
tok.location.fpath == fpath
|
8889
|
+
}
|
8889
8890
|
@index = 0
|
8890
8891
|
@indent_level = 0
|
8891
8892
|
@indent_width = indent_width
|
@@ -9111,8 +9112,8 @@ module CBuiltin #:nodoc:
|
|
9111
9112
|
|
9112
9113
|
def initialize(phase_ctxt)
|
9113
9114
|
super
|
9114
|
-
|
9115
|
-
|
9115
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
9116
|
+
traversal.enter_compound_statement += T(:check)
|
9116
9117
|
end
|
9117
9118
|
|
9118
9119
|
private
|
@@ -9161,7 +9162,7 @@ module CBuiltin #:nodoc:
|
|
9161
9162
|
def do_prepare(phase_ctxt) end
|
9162
9163
|
|
9163
9164
|
def do_execute(phase_ctxt)
|
9164
|
-
phase_ctxt[:
|
9165
|
+
phase_ctxt[:cc1_ast].accept(Visitor.new(phase_ctxt))
|
9165
9166
|
end
|
9166
9167
|
|
9167
9168
|
class Visitor < Cc1::SyntaxTreeVisitor
|
@@ -9265,12 +9266,12 @@ module CBuiltin #:nodoc:
|
|
9265
9266
|
|
9266
9267
|
def initialize(phase_ctxt)
|
9267
9268
|
super
|
9268
|
-
|
9269
|
-
|
9270
|
-
|
9271
|
-
|
9272
|
-
|
9273
|
-
|
9269
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
9270
|
+
traversal.enter_comma_separated_expression += T(:check)
|
9271
|
+
traversal.enter_for_statement += T(:enter_for_statement)
|
9272
|
+
traversal.leave_for_statement += T(:leave_for_statement)
|
9273
|
+
traversal.enter_c99_for_statement += T(:enter_for_statement)
|
9274
|
+
traversal.leave_c99_for_statement += T(:leave_for_statement)
|
9274
9275
|
@in_for_stmt = false
|
9275
9276
|
end
|
9276
9277
|
|
@@ -9330,10 +9331,10 @@ module CBuiltin #:nodoc:
|
|
9330
9331
|
|
9331
9332
|
def initialize(phase_ctxt)
|
9332
9333
|
super
|
9333
|
-
|
9334
|
-
|
9335
|
-
|
9336
|
-
|
9334
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
9335
|
+
traversal.enter_function_declaration += T(:check_function)
|
9336
|
+
traversal.enter_ansi_function_definition += T(:check_function)
|
9337
|
+
traversal.enter_kandr_function_definition += T(:check_function)
|
9337
9338
|
end
|
9338
9339
|
|
9339
9340
|
private
|
@@ -9351,10 +9352,10 @@ module CBuiltin #:nodoc:
|
|
9351
9352
|
|
9352
9353
|
def initialize(phase_ctxt)
|
9353
9354
|
super
|
9354
|
-
|
9355
|
-
|
9356
|
-
|
9357
|
-
|
9355
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
9356
|
+
traversal.enter_variable_declaration += T(:check_variable)
|
9357
|
+
traversal.enter_variable_definition += T(:check_variable)
|
9358
|
+
traversal.enter_parameter_definition += T(:check_variable)
|
9358
9359
|
end
|
9359
9360
|
|
9360
9361
|
private
|
@@ -9484,17 +9485,17 @@ module CBuiltin #:nodoc:
|
|
9484
9485
|
|
9485
9486
|
def initialize(phase_ctxt)
|
9486
9487
|
super
|
9487
|
-
|
9488
|
-
|
9489
|
-
|
9490
|
-
|
9491
|
-
|
9492
|
-
|
9493
|
-
|
9494
|
-
|
9495
|
-
|
9496
|
-
|
9497
|
-
|
9488
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
9489
|
+
traversal.enter_initializer += T(:check_initializer)
|
9490
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
9491
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
9492
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
9493
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
9494
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
9495
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
9496
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
9497
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
9498
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
9498
9499
|
end
|
9499
9500
|
|
9500
9501
|
private
|
@@ -9659,17 +9660,17 @@ module CBuiltin #:nodoc:
|
|
9659
9660
|
|
9660
9661
|
def initialize(phase_ctxt)
|
9661
9662
|
super
|
9662
|
-
|
9663
|
-
|
9664
|
-
|
9665
|
-
|
9666
|
-
|
9667
|
-
|
9668
|
-
|
9669
|
-
|
9670
|
-
|
9671
|
-
|
9672
|
-
|
9663
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
9664
|
+
traversal.enter_initializer += T(:check_initializer)
|
9665
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
9666
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
9667
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
9668
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
9669
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
9670
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
9671
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
9672
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
9673
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
9673
9674
|
end
|
9674
9675
|
|
9675
9676
|
private
|
@@ -9845,17 +9846,17 @@ module CBuiltin #:nodoc:
|
|
9845
9846
|
|
9846
9847
|
def initialize(phase_ctxt)
|
9847
9848
|
super
|
9848
|
-
|
9849
|
-
|
9850
|
-
|
9851
|
-
|
9852
|
-
|
9853
|
-
|
9854
|
-
|
9855
|
-
|
9856
|
-
|
9857
|
-
|
9858
|
-
|
9849
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
9850
|
+
traversal.enter_initializer += T(:check_initializer)
|
9851
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
9852
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
9853
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
9854
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
9855
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
9856
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
9857
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
9858
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
9859
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
9859
9860
|
end
|
9860
9861
|
|
9861
9862
|
private
|
@@ -10422,17 +10423,17 @@ module CBuiltin #:nodoc:
|
|
10422
10423
|
|
10423
10424
|
def initialize(phase_ctxt)
|
10424
10425
|
super
|
10425
|
-
|
10426
|
-
|
10427
|
-
|
10428
|
-
|
10429
|
-
|
10430
|
-
|
10431
|
-
|
10432
|
-
|
10433
|
-
|
10434
|
-
|
10435
|
-
|
10426
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
10427
|
+
traversal.enter_initializer += T(:check_initializer)
|
10428
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
10429
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
10430
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
10431
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
10432
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
10433
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
10434
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
10435
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
10436
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
10436
10437
|
end
|
10437
10438
|
|
10438
10439
|
private
|
@@ -10597,17 +10598,17 @@ module CBuiltin #:nodoc:
|
|
10597
10598
|
|
10598
10599
|
def initialize(phase_ctxt)
|
10599
10600
|
super
|
10600
|
-
|
10601
|
-
|
10602
|
-
|
10603
|
-
|
10604
|
-
|
10605
|
-
|
10606
|
-
|
10607
|
-
|
10608
|
-
|
10609
|
-
|
10610
|
-
|
10601
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
10602
|
+
traversal.enter_initializer += T(:check_initializer)
|
10603
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
10604
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
10605
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
10606
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
10607
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
10608
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
10609
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
10610
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
10611
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
10611
10612
|
end
|
10612
10613
|
|
10613
10614
|
private
|
@@ -10715,17 +10716,17 @@ module CBuiltin #:nodoc:
|
|
10715
10716
|
|
10716
10717
|
def initialize(phase_ctxt)
|
10717
10718
|
super
|
10718
|
-
|
10719
|
-
|
10720
|
-
|
10721
|
-
|
10722
|
-
|
10723
|
-
|
10724
|
-
|
10725
|
-
|
10726
|
-
|
10727
|
-
|
10728
|
-
|
10719
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
10720
|
+
traversal.enter_initializer += T(:check_initializer)
|
10721
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
10722
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
10723
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
10724
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
10725
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
10726
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
10727
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
10728
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
10729
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
10729
10730
|
end
|
10730
10731
|
|
10731
10732
|
private
|
@@ -10904,17 +10905,17 @@ module CBuiltin #:nodoc:
|
|
10904
10905
|
|
10905
10906
|
def initialize(phase_ctxt)
|
10906
10907
|
super
|
10907
|
-
|
10908
|
-
|
10909
|
-
|
10910
|
-
|
10911
|
-
|
10912
|
-
|
10913
|
-
|
10914
|
-
|
10915
|
-
|
10916
|
-
|
10917
|
-
|
10908
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
10909
|
+
traversal.enter_initializer += T(:check_initializer)
|
10910
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
10911
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
10912
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
10913
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
10914
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
10915
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
10916
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
10917
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
10918
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
10918
10919
|
end
|
10919
10920
|
|
10920
10921
|
private
|
@@ -11068,17 +11069,17 @@ module CBuiltin #:nodoc:
|
|
11068
11069
|
|
11069
11070
|
def initialize(phase_ctxt)
|
11070
11071
|
super
|
11071
|
-
|
11072
|
-
|
11073
|
-
|
11074
|
-
|
11075
|
-
|
11076
|
-
|
11077
|
-
|
11078
|
-
|
11079
|
-
|
11080
|
-
|
11081
|
-
|
11072
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11073
|
+
traversal.enter_initializer += T(:check_initializer)
|
11074
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
11075
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
11076
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
11077
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
11078
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
11079
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
11080
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
11081
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
11082
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
11082
11083
|
end
|
11083
11084
|
|
11084
11085
|
private
|
@@ -11269,17 +11270,17 @@ module CBuiltin #:nodoc:
|
|
11269
11270
|
|
11270
11271
|
def initialize(phase_ctxt)
|
11271
11272
|
super
|
11272
|
-
|
11273
|
-
|
11274
|
-
|
11275
|
-
|
11276
|
-
|
11277
|
-
|
11278
|
-
|
11279
|
-
|
11280
|
-
|
11281
|
-
|
11282
|
-
|
11273
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11274
|
+
traversal.enter_initializer += T(:check_initializer)
|
11275
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
11276
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
11277
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
11278
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
11279
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
11280
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
11281
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
11282
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
11283
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
11283
11284
|
end
|
11284
11285
|
|
11285
11286
|
private
|
@@ -11433,17 +11434,17 @@ module CBuiltin #:nodoc:
|
|
11433
11434
|
|
11434
11435
|
def initialize(phase_ctxt)
|
11435
11436
|
super
|
11436
|
-
|
11437
|
-
|
11438
|
-
|
11439
|
-
|
11440
|
-
|
11441
|
-
|
11442
|
-
|
11443
|
-
|
11444
|
-
|
11445
|
-
|
11446
|
-
|
11437
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11438
|
+
traversal.enter_initializer += T(:check_initializer)
|
11439
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
11440
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
11441
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
11442
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
11443
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
11444
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
11445
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
11446
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
11447
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
11447
11448
|
end
|
11448
11449
|
|
11449
11450
|
private
|
@@ -11607,17 +11608,17 @@ module CBuiltin #:nodoc:
|
|
11607
11608
|
|
11608
11609
|
def initialize(phase_ctxt)
|
11609
11610
|
super
|
11610
|
-
|
11611
|
-
|
11612
|
-
|
11613
|
-
|
11614
|
-
|
11615
|
-
|
11616
|
-
|
11617
|
-
|
11618
|
-
|
11619
|
-
|
11620
|
-
|
11611
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11612
|
+
traversal.enter_initializer += T(:check_initializer)
|
11613
|
+
traversal.enter_expression_statement += T(:check_expr_statement)
|
11614
|
+
traversal.enter_if_statement += T(:check_selection_statement)
|
11615
|
+
traversal.enter_if_else_statement += T(:check_selection_statement)
|
11616
|
+
traversal.enter_switch_statement += T(:check_selection_statement)
|
11617
|
+
traversal.enter_while_statement += T(:check_iteration_statement)
|
11618
|
+
traversal.enter_do_statement += T(:check_iteration_statement)
|
11619
|
+
traversal.enter_for_statement += T(:check_iteration_statement)
|
11620
|
+
traversal.enter_c99_for_statement += T(:check_iteration_statement)
|
11621
|
+
traversal.enter_return_statement += T(:check_return_statement)
|
11621
11622
|
end
|
11622
11623
|
|
11623
11624
|
private
|
@@ -11857,9 +11858,9 @@ module CBuiltin #:nodoc:
|
|
11857
11858
|
|
11858
11859
|
def initialize(phase_ctxt)
|
11859
11860
|
super
|
11860
|
-
|
11861
|
-
|
11862
|
-
|
11861
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11862
|
+
traversal.enter_logical_and_expression += T(:check)
|
11863
|
+
traversal.enter_logical_or_expression += T(:check)
|
11863
11864
|
end
|
11864
11865
|
|
11865
11866
|
private
|
@@ -11877,13 +11878,13 @@ module CBuiltin #:nodoc:
|
|
11877
11878
|
|
11878
11879
|
def initialize(phase_ctxt)
|
11879
11880
|
super
|
11880
|
-
|
11881
|
-
|
11882
|
-
|
11883
|
-
|
11884
|
-
|
11885
|
-
|
11886
|
-
|
11881
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11882
|
+
traversal.enter_expression_statement += T(:enter_expr_stmt)
|
11883
|
+
traversal.leave_expression_statement += T(:leave_expr_stmt)
|
11884
|
+
traversal.enter_postfix_increment_expression += T(:check)
|
11885
|
+
traversal.enter_postfix_decrement_expression += T(:check)
|
11886
|
+
traversal.enter_prefix_increment_expression += T(:check)
|
11887
|
+
traversal.enter_prefix_decrement_expression += T(:check)
|
11887
11888
|
@cur_stmt = nil
|
11888
11889
|
end
|
11889
11890
|
|
@@ -11914,8 +11915,8 @@ module CBuiltin #:nodoc:
|
|
11914
11915
|
|
11915
11916
|
def initialize(phase_ctxt)
|
11916
11917
|
super
|
11917
|
-
|
11918
|
-
|
11918
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11919
|
+
traversal.enter_member_declaration += T(:check)
|
11919
11920
|
end
|
11920
11921
|
|
11921
11922
|
private
|
@@ -11936,8 +11937,8 @@ module CBuiltin #:nodoc:
|
|
11936
11937
|
|
11937
11938
|
def initialize(phase_ctxt)
|
11938
11939
|
super
|
11939
|
-
|
11940
|
-
|
11940
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11941
|
+
traversal.enter_constant_specifier += T(:check)
|
11941
11942
|
end
|
11942
11943
|
|
11943
11944
|
private
|
@@ -11957,9 +11958,9 @@ module CBuiltin #:nodoc:
|
|
11957
11958
|
|
11958
11959
|
def initialize(phase_ctxt)
|
11959
11960
|
super
|
11960
|
-
|
11961
|
-
|
11962
|
-
|
11961
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11962
|
+
traversal.enter_constant_specifier += T(:check_constant)
|
11963
|
+
traversal.enter_string_literal_specifier += T(:check_string_literal)
|
11963
11964
|
end
|
11964
11965
|
|
11965
11966
|
private
|
@@ -11985,8 +11986,8 @@ module CBuiltin #:nodoc:
|
|
11985
11986
|
|
11986
11987
|
def initialize(phase_ctxt)
|
11987
11988
|
super
|
11988
|
-
|
11989
|
-
|
11989
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
11990
|
+
traversal.enter_switch_statement += T(:check_switch_statement)
|
11990
11991
|
end
|
11991
11992
|
|
11992
11993
|
private
|
@@ -12106,12 +12107,12 @@ module CBuiltin #:nodoc:
|
|
12106
12107
|
|
12107
12108
|
def initialize(phase_ctxt)
|
12108
12109
|
super
|
12109
|
-
|
12110
|
-
|
12111
|
-
|
12112
|
-
|
12113
|
-
|
12114
|
-
|
12110
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12111
|
+
traversal.enter_comma_separated_expression += T(:check)
|
12112
|
+
traversal.enter_for_statement += T(:enter_for_statement)
|
12113
|
+
traversal.leave_for_statement += T(:leave_for_statement)
|
12114
|
+
traversal.enter_c99_for_statement += T(:enter_for_statement)
|
12115
|
+
traversal.leave_c99_for_statement += T(:leave_for_statement)
|
12115
12116
|
@in_for_stmt = false
|
12116
12117
|
end
|
12117
12118
|
|
@@ -12138,8 +12139,8 @@ module CBuiltin #:nodoc:
|
|
12138
12139
|
|
12139
12140
|
def initialize(phase_ctxt)
|
12140
12141
|
super
|
12141
|
-
|
12142
|
-
|
12142
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12143
|
+
traversal.enter_switch_statement += T(:check)
|
12143
12144
|
end
|
12144
12145
|
|
12145
12146
|
private
|
@@ -12194,8 +12195,8 @@ module CBuiltin #:nodoc:
|
|
12194
12195
|
|
12195
12196
|
def initialize(phase_ctxt)
|
12196
12197
|
super
|
12197
|
-
|
12198
|
-
|
12198
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12199
|
+
traversal.enter_ansi_function_definition += T(:check)
|
12199
12200
|
end
|
12200
12201
|
|
12201
12202
|
private
|
@@ -12215,8 +12216,8 @@ module CBuiltin #:nodoc:
|
|
12215
12216
|
|
12216
12217
|
def initialize(phase_ctxt)
|
12217
12218
|
super
|
12218
|
-
|
12219
|
-
|
12219
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12220
|
+
traversal.enter_function_declaration += T(:check)
|
12220
12221
|
end
|
12221
12222
|
|
12222
12223
|
private
|
@@ -12276,8 +12277,8 @@ module CBuiltin #:nodoc:
|
|
12276
12277
|
|
12277
12278
|
def initialize(phase_ctxt)
|
12278
12279
|
super
|
12279
|
-
|
12280
|
-
|
12280
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12281
|
+
traversal.enter_ansi_function_definition += T(:check)
|
12281
12282
|
@interp = phase_ctxt[:cc1_interpreter]
|
12282
12283
|
end
|
12283
12284
|
|
@@ -12363,8 +12364,8 @@ module CBuiltin #:nodoc:
|
|
12363
12364
|
|
12364
12365
|
def initialize(phase_ctxt)
|
12365
12366
|
super
|
12366
|
-
|
12367
|
-
|
12367
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12368
|
+
traversal.enter_switch_statement += T(:check)
|
12368
12369
|
end
|
12369
12370
|
|
12370
12371
|
private
|
@@ -12466,8 +12467,8 @@ module CBuiltin #:nodoc:
|
|
12466
12467
|
|
12467
12468
|
def initialize(phase_ctxt)
|
12468
12469
|
super
|
12469
|
-
|
12470
|
-
|
12470
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12471
|
+
traversal.enter_union_type_declaration += T(:check)
|
12471
12472
|
end
|
12472
12473
|
|
12473
12474
|
private
|
@@ -12563,8 +12564,8 @@ module CBuiltin #:nodoc:
|
|
12563
12564
|
|
12564
12565
|
def initialize(phase_ctxt)
|
12565
12566
|
super
|
12566
|
-
|
12567
|
-
|
12567
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12568
|
+
traversal.enter_unary_arithmetic_expression += T(:check)
|
12568
12569
|
end
|
12569
12570
|
|
12570
12571
|
private
|
@@ -12609,8 +12610,8 @@ module CBuiltin #:nodoc:
|
|
12609
12610
|
|
12610
12611
|
def initialize(phase_ctxt)
|
12611
12612
|
super
|
12612
|
-
|
12613
|
-
|
12613
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12614
|
+
traversal.enter_unary_arithmetic_expression += T(:check)
|
12614
12615
|
end
|
12615
12616
|
|
12616
12617
|
private
|
@@ -12665,8 +12666,8 @@ module CBuiltin #:nodoc:
|
|
12665
12666
|
|
12666
12667
|
def initialize(phase_ctxt)
|
12667
12668
|
super
|
12668
|
-
|
12669
|
-
|
12669
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12670
|
+
traversal.enter_expression_statement += T(:check)
|
12670
12671
|
end
|
12671
12672
|
|
12672
12673
|
private
|
@@ -12690,8 +12691,8 @@ module CBuiltin #:nodoc:
|
|
12690
12691
|
|
12691
12692
|
def initialize(phase_ctxt)
|
12692
12693
|
super
|
12693
|
-
|
12694
|
-
|
12694
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12695
|
+
traversal.enter_variable_definition += T(:check)
|
12695
12696
|
end
|
12696
12697
|
|
12697
12698
|
private
|
@@ -12733,10 +12734,10 @@ module CBuiltin #:nodoc:
|
|
12733
12734
|
|
12734
12735
|
def initialize(phase_ctxt)
|
12735
12736
|
super
|
12736
|
-
|
12737
|
-
|
12738
|
-
|
12739
|
-
|
12737
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12738
|
+
traversal.enter_compound_statement += T(:enter_block)
|
12739
|
+
traversal.leave_compound_statement += T(:leave_block)
|
12740
|
+
traversal.enter_generic_labeled_statement += T(:check)
|
12740
12741
|
@blocks = []
|
12741
12742
|
end
|
12742
12743
|
|
@@ -12778,10 +12779,10 @@ module CBuiltin #:nodoc:
|
|
12778
12779
|
|
12779
12780
|
def initialize(phase_ctxt)
|
12780
12781
|
super
|
12781
|
-
|
12782
|
-
|
12783
|
-
|
12784
|
-
|
12782
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
12783
|
+
traversal.enter_compound_statement += T(:enter_block)
|
12784
|
+
traversal.leave_compound_statement += T(:leave_block)
|
12785
|
+
traversal.enter_generic_labeled_statement += T(:check)
|
12785
12786
|
@blocks = []
|
12786
12787
|
end
|
12787
12788
|
|
@@ -12918,7 +12919,6 @@ module CBuiltin #:nodoc:
|
|
12918
12919
|
super
|
12919
12920
|
@interp = phase_ctxt[:cc1_interpreter]
|
12920
12921
|
@interp.on_shift_expr_evaled += T(:check)
|
12921
|
-
@enum_tbl = @interp.environment.enumerator_table
|
12922
12922
|
end
|
12923
12923
|
|
12924
12924
|
private
|
@@ -12926,7 +12926,7 @@ module CBuiltin #:nodoc:
|
|
12926
12926
|
op = expr.operator.type
|
12927
12927
|
return unless op == "<<" || op == "<<="
|
12928
12928
|
|
12929
|
-
return unless expr.lhs_operand
|
12929
|
+
return unless @interp.constant_expression?(expr.lhs_operand)
|
12930
12930
|
return unless lhs_var.type.signed?
|
12931
12931
|
|
12932
12932
|
if lhs_var.value.must_be_less_than?(@interp.scalar_value_of(0)) or
|
@@ -12954,7 +12954,6 @@ module CBuiltin #:nodoc:
|
|
12954
12954
|
super
|
12955
12955
|
@interp = phase_ctxt[:cc1_interpreter]
|
12956
12956
|
@interp.on_shift_expr_evaled += T(:check)
|
12957
|
-
@enum_tbl = @interp.environment.enumerator_table
|
12958
12957
|
end
|
12959
12958
|
|
12960
12959
|
private
|
@@ -12962,7 +12961,7 @@ module CBuiltin #:nodoc:
|
|
12962
12961
|
op = expr.operator.type
|
12963
12962
|
return unless op == "<<" || op == "<<="
|
12964
12963
|
|
12965
|
-
return if expr.lhs_operand
|
12964
|
+
return if @interp.constant_expression?(expr.lhs_operand)
|
12966
12965
|
return unless lhs_var.type.signed?
|
12967
12966
|
|
12968
12967
|
if lhs_var.value.must_be_less_than?(@interp.scalar_value_of(0)) or
|
@@ -12990,7 +12989,6 @@ module CBuiltin #:nodoc:
|
|
12990
12989
|
super
|
12991
12990
|
@interp = phase_ctxt[:cc1_interpreter]
|
12992
12991
|
@interp.on_shift_expr_evaled += T(:check)
|
12993
|
-
@enum_tbl = @interp.environment.enumerator_table
|
12994
12992
|
end
|
12995
12993
|
|
12996
12994
|
private
|
@@ -12998,7 +12996,7 @@ module CBuiltin #:nodoc:
|
|
12998
12996
|
op = expr.operator.type
|
12999
12997
|
return unless op == "<<" || op == "<<="
|
13000
12998
|
|
13001
|
-
return if expr.lhs_operand
|
12999
|
+
return if @interp.constant_expression?(expr.lhs_operand)
|
13002
13000
|
return unless lhs_var.type.signed?
|
13003
13001
|
|
13004
13002
|
if !lhs_var.value.must_be_less_than?(@interp.scalar_value_of(0)) &&
|
@@ -13351,7 +13349,6 @@ module CBuiltin #:nodoc:
|
|
13351
13349
|
@interp = phase_ctxt[:cc1_interpreter]
|
13352
13350
|
@interp.on_function_call_expr_evaled += T(:call_function)
|
13353
13351
|
@interp.on_explicit_function_declared += T(:check)
|
13354
|
-
@enum_tbl = @interp.environment.enumerator_table
|
13355
13352
|
@funcalls = Hash.new { |hash, key| hash[key] = [] }
|
13356
13353
|
end
|
13357
13354
|
|
@@ -13366,7 +13363,8 @@ module CBuiltin #:nodoc:
|
|
13366
13363
|
if args.size == param_types.size
|
13367
13364
|
types = args.map { |ary| ary.first }.zip(param_types)
|
13368
13365
|
conformed = types.each_with_index.all? { |(atype, ptype), idx|
|
13369
|
-
funcall_expr.argument_expressions[idx]
|
13366
|
+
arg_expr = funcall_expr.argument_expressions[idx]
|
13367
|
+
@interp.constant_expression?(arg_expr) &&
|
13370
13368
|
untyped_pointer_conversion?(atype, ptype, args[idx].last) or
|
13371
13369
|
atype.convertible?(ptype)
|
13372
13370
|
}
|
@@ -13405,7 +13403,6 @@ module CBuiltin #:nodoc:
|
|
13405
13403
|
@interp = phase_ctxt[:cc1_interpreter]
|
13406
13404
|
@interp.on_function_call_expr_evaled += T(:call_function)
|
13407
13405
|
@interp.on_explicit_function_defined += T(:check)
|
13408
|
-
@enum_tbl = @interp.environment.enumerator_table
|
13409
13406
|
@funcalls = Hash.new { |hash, key| hash[key] = [] }
|
13410
13407
|
end
|
13411
13408
|
|
@@ -13420,7 +13417,8 @@ module CBuiltin #:nodoc:
|
|
13420
13417
|
if args.size == param_types.size
|
13421
13418
|
types = args.map { |ary| ary.first }.zip(param_types)
|
13422
13419
|
conformed = types.each_with_index.all? { |(atype, ptype), idx|
|
13423
|
-
funcall_expr.argument_expressions[idx]
|
13420
|
+
arg_expr = funcall_expr.argument_expressions[idx]
|
13421
|
+
@interp.constant_expression?(arg_expr) &&
|
13424
13422
|
untyped_pointer_conversion?(atype, ptype, args[idx].last) or
|
13425
13423
|
atype.convertible?(ptype)
|
13426
13424
|
}
|
@@ -13458,7 +13456,6 @@ module CBuiltin #:nodoc:
|
|
13458
13456
|
super
|
13459
13457
|
@interp = phase_ctxt[:cc1_interpreter]
|
13460
13458
|
@interp.on_function_call_expr_evaled += T(:check)
|
13461
|
-
@enum_tbl = @interp.environment.enumerator_table
|
13462
13459
|
end
|
13463
13460
|
|
13464
13461
|
private
|
@@ -13474,7 +13471,7 @@ module CBuiltin #:nodoc:
|
|
13474
13471
|
|
13475
13472
|
args.zip(param_types).each_with_index do |(arg, ptype), idx|
|
13476
13473
|
arg_expr = funcall_expr.argument_expressions[idx]
|
13477
|
-
if
|
13474
|
+
if @interp.constant_expression?(arg_expr)
|
13478
13475
|
next if untyped_pointer_conversion?(arg.first, ptype, arg.last)
|
13479
13476
|
end
|
13480
13477
|
|
@@ -13774,18 +13771,18 @@ module CBuiltin #:nodoc:
|
|
13774
13771
|
|
13775
13772
|
def initialize(phase_ctxt)
|
13776
13773
|
super
|
13777
|
-
|
13778
|
-
|
13779
|
-
|
13780
|
-
|
13781
|
-
|
13782
|
-
|
13783
|
-
|
13784
|
-
|
13785
|
-
|
13786
|
-
|
13787
|
-
|
13788
|
-
|
13774
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
13775
|
+
traversal.enter_break_statement += T(:check)
|
13776
|
+
traversal.enter_switch_statement += T(:enter_breakable_statement)
|
13777
|
+
traversal.leave_switch_statement += T(:leave_breakable_statement)
|
13778
|
+
traversal.enter_while_statement += T(:enter_breakable_statement)
|
13779
|
+
traversal.leave_while_statement += T(:leave_breakable_statement)
|
13780
|
+
traversal.enter_do_statement += T(:enter_breakable_statement)
|
13781
|
+
traversal.leave_do_statement += T(:leave_breakable_statement)
|
13782
|
+
traversal.enter_for_statement += T(:enter_breakable_statement)
|
13783
|
+
traversal.leave_for_statement += T(:leave_breakable_statement)
|
13784
|
+
traversal.enter_c99_for_statement += T(:enter_breakable_statement)
|
13785
|
+
traversal.leave_c99_for_statement += T(:leave_breakable_statement)
|
13789
13786
|
@breakable_stmts = []
|
13790
13787
|
end
|
13791
13788
|
|
@@ -14073,7 +14070,7 @@ module CBuiltin #:nodoc:
|
|
14073
14070
|
|
14074
14071
|
def check(*)
|
14075
14072
|
if ctrlexpr = @iter_stmts.last.ctrlexpr
|
14076
|
-
unless
|
14073
|
+
unless @interp.constant_expression?(ctrlexpr)
|
14077
14074
|
ctrlexpr_val = @iter_stmts.last.ctrlexpr_val
|
14078
14075
|
ctrl_vars = @iter_stmts.last.ctrl_vars
|
14079
14076
|
if ctrlexpr_val && ctrlexpr_val.must_be_true? and
|
@@ -14095,16 +14092,15 @@ module CBuiltin #:nodoc:
|
|
14095
14092
|
|
14096
14093
|
def initialize(phase_ctxt)
|
14097
14094
|
super
|
14098
|
-
interp = phase_ctxt[:cc1_interpreter]
|
14099
|
-
interp.on_if_ctrlexpr_evaled += T(:check)
|
14100
|
-
interp.on_if_else_ctrlexpr_evaled += T(:check)
|
14101
|
-
@enum_tbl = interp.environment.enumerator_table
|
14095
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
14096
|
+
@interp.on_if_ctrlexpr_evaled += T(:check)
|
14097
|
+
@interp.on_if_else_ctrlexpr_evaled += T(:check)
|
14102
14098
|
end
|
14103
14099
|
|
14104
14100
|
private
|
14105
14101
|
def check(selection_stmt, ctrlexpr_val)
|
14106
14102
|
if ctrlexpr = selection_stmt.expression
|
14107
|
-
unless
|
14103
|
+
unless @interp.constant_expression?(ctrlexpr)
|
14108
14104
|
W(ctrlexpr.location) if ctrlexpr_val.must_be_true?
|
14109
14105
|
end
|
14110
14106
|
end
|
@@ -14173,14 +14169,13 @@ module CBuiltin #:nodoc:
|
|
14173
14169
|
|
14174
14170
|
def initialize(phase_ctxt)
|
14175
14171
|
super
|
14176
|
-
interp = phase_ctxt[:cc1_interpreter]
|
14177
|
-
interp.on_do_ctrlexpr_evaled += T(:check)
|
14178
|
-
@enum_tbl = interp.environment.enumerator_table
|
14172
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
14173
|
+
@interp.on_do_ctrlexpr_evaled += T(:check)
|
14179
14174
|
end
|
14180
14175
|
|
14181
14176
|
private
|
14182
14177
|
def check(do_stmt, ctrlexpr_val)
|
14183
|
-
unless do_stmt.expression
|
14178
|
+
unless @interp.constant_expression?(do_stmt.expression)
|
14184
14179
|
if ctrlexpr_val.must_be_false?
|
14185
14180
|
W(do_stmt.expression.location)
|
14186
14181
|
end
|
@@ -14263,11 +14258,11 @@ module CBuiltin #:nodoc:
|
|
14263
14258
|
|
14264
14259
|
def initialize(phase_ctxt)
|
14265
14260
|
super
|
14266
|
-
|
14267
|
-
|
14268
|
-
|
14269
|
-
@dires = collect_define_lines(phase_ctxt[:
|
14270
|
-
collect_undef_lines(phase_ctxt[:
|
14261
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
14262
|
+
traversal.enter_ansi_function_definition += T(:check)
|
14263
|
+
traversal.enter_kandr_function_definition += T(:check)
|
14264
|
+
@dires = collect_define_lines(phase_ctxt[:cpp_ast]) +
|
14265
|
+
collect_undef_lines(phase_ctxt[:cpp_ast])
|
14271
14266
|
end
|
14272
14267
|
|
14273
14268
|
private
|
@@ -14343,9 +14338,9 @@ module CBuiltin #:nodoc:
|
|
14343
14338
|
|
14344
14339
|
def initialize(phase_ctxt)
|
14345
14340
|
super
|
14346
|
-
|
14347
|
-
|
14348
|
-
|
14341
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
14342
|
+
traversal.enter_constant_specifier += T(:check_constant)
|
14343
|
+
traversal.enter_string_literal_specifier += T(:check_string_literal)
|
14349
14344
|
end
|
14350
14345
|
|
14351
14346
|
private
|
@@ -14367,21 +14362,21 @@ module CBuiltin #:nodoc:
|
|
14367
14362
|
|
14368
14363
|
def initialize(phase_ctxt)
|
14369
14364
|
super
|
14370
|
-
|
14371
|
-
|
14372
|
-
|
14373
|
-
|
14374
|
-
|
14375
|
-
|
14376
|
-
|
14377
|
-
|
14378
|
-
|
14379
|
-
|
14380
|
-
|
14381
|
-
|
14382
|
-
|
14383
|
-
|
14384
|
-
|
14365
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
14366
|
+
traversal.enter_compound_statement += T(:enter_block)
|
14367
|
+
traversal.leave_compound_statement += T(:leave_block)
|
14368
|
+
traversal.enter_expression_statement += T(:enter_expression_statement)
|
14369
|
+
traversal.enter_if_statement += T(:update_last_statement)
|
14370
|
+
traversal.enter_if_else_statement += T(:update_last_statement)
|
14371
|
+
traversal.enter_switch_statement += T(:update_last_statement)
|
14372
|
+
traversal.enter_while_statement += T(:update_last_statement)
|
14373
|
+
traversal.enter_do_statement += T(:update_last_statement)
|
14374
|
+
traversal.enter_for_statement += T(:enter_for_statement)
|
14375
|
+
traversal.enter_c99_for_statement += T(:enter_for_statement)
|
14376
|
+
traversal.enter_goto_statement += T(:update_last_statement)
|
14377
|
+
traversal.enter_continue_statement += T(:update_last_statement)
|
14378
|
+
traversal.enter_break_statement += T(:update_last_statement)
|
14379
|
+
traversal.enter_return_statement += T(:update_last_statement)
|
14385
14380
|
@last_stmts = []
|
14386
14381
|
@expected_stmts = Set.new
|
14387
14382
|
end
|
@@ -14776,18 +14771,13 @@ module CBuiltin #:nodoc:
|
|
14776
14771
|
def initialize(phase_ctxt)
|
14777
14772
|
super
|
14778
14773
|
interp = phase_ctxt[:cc1_interpreter]
|
14779
|
-
interp.
|
14780
|
-
interp.on_implicit_conv_performed += T(:check_conversion)
|
14774
|
+
interp.on_address_derivation_performed += T(:check)
|
14781
14775
|
end
|
14782
14776
|
|
14783
14777
|
private
|
14784
|
-
def
|
14778
|
+
def check(expr, obj, *)
|
14785
14779
|
W(expr.location) if obj.declared_as_register?
|
14786
14780
|
end
|
14787
|
-
|
14788
|
-
def check_conversion(expr, org_var, *)
|
14789
|
-
W(expr.location) if org_var.declared_as_register?
|
14790
|
-
end
|
14791
14781
|
end
|
14792
14782
|
|
14793
14783
|
class W0644 < PassiveCodeCheck
|
@@ -14845,12 +14835,11 @@ module CBuiltin #:nodoc:
|
|
14845
14835
|
super
|
14846
14836
|
@interp = phase_ctxt[:cc1_interpreter]
|
14847
14837
|
@interp.on_shift_expr_evaled += T(:check)
|
14848
|
-
@enum_tbl = @interp.environment.enumerator_table
|
14849
14838
|
end
|
14850
14839
|
|
14851
14840
|
private
|
14852
14841
|
def check(expr, lhs_var, rhs_var, *)
|
14853
|
-
if expr.rhs_operand
|
14842
|
+
if @interp.constant_expression?(expr.rhs_operand)
|
14854
14843
|
if rhs_var.value.must_be_less_than?(@interp.scalar_value_of(0))
|
14855
14844
|
W(expr.location)
|
14856
14845
|
end
|
@@ -14869,12 +14858,11 @@ module CBuiltin #:nodoc:
|
|
14869
14858
|
super
|
14870
14859
|
@interp = phase_ctxt[:cc1_interpreter]
|
14871
14860
|
@interp.on_shift_expr_evaled += T(:check)
|
14872
|
-
@enum_tbl = @interp.environment.enumerator_table
|
14873
14861
|
end
|
14874
14862
|
|
14875
14863
|
private
|
14876
14864
|
def check(expr, lhs_var, rhs_var, *)
|
14877
|
-
if expr.rhs_operand
|
14865
|
+
if @interp.constant_expression?(expr.rhs_operand)
|
14878
14866
|
promoted_type = lhs_var.type.integer_promoted_type
|
14879
14867
|
promoted_bit_size = @interp.scalar_value_of(promoted_type.bit_size)
|
14880
14868
|
if rhs_var.value.must_be_equal_to?(promoted_bit_size) ||
|
@@ -15872,14 +15860,13 @@ module CBuiltin #:nodoc:
|
|
15872
15860
|
@interp = phase_ctxt[:cc1_interpreter]
|
15873
15861
|
@interp.on_array_subscript_expr_evaled += T(:check_array_subscript)
|
15874
15862
|
@interp.on_indirection_expr_evaled += T(:check_indirection)
|
15875
|
-
@enum_tbl = @interp.environment.enumerator_table
|
15876
15863
|
end
|
15877
15864
|
|
15878
15865
|
private
|
15879
15866
|
def check_array_subscript(expr, ary_or_ptr, subs, ary, *)
|
15880
15867
|
return unless ary
|
15881
15868
|
|
15882
|
-
unless expr.array_subscript
|
15869
|
+
unless @interp.constant_expression?(expr.array_subscript)
|
15883
15870
|
warn_array_oob_access(expr.array_subscript, ary, subs)
|
15884
15871
|
end
|
15885
15872
|
end
|
@@ -15888,7 +15875,7 @@ module CBuiltin #:nodoc:
|
|
15888
15875
|
ary, subs_expr = extract_array_and_subscript(expr.operand)
|
15889
15876
|
return unless ary
|
15890
15877
|
|
15891
|
-
unless
|
15878
|
+
unless @interp.constant_expression?(subs_expr)
|
15892
15879
|
subs = @interp.interpret(subs_expr, QUIET_WITHOUT_SIDE_EFFECT)
|
15893
15880
|
warn_array_oob_access(expr.operand, ary, subs)
|
15894
15881
|
end
|
@@ -16191,14 +16178,13 @@ module CBuiltin #:nodoc:
|
|
16191
16178
|
@interp = phase_ctxt[:cc1_interpreter]
|
16192
16179
|
@interp.on_array_subscript_expr_evaled += T(:check_array_subscript)
|
16193
16180
|
@interp.on_indirection_expr_evaled += T(:check_indirection)
|
16194
|
-
@enum_tbl = @interp.environment.enumerator_table
|
16195
16181
|
end
|
16196
16182
|
|
16197
16183
|
private
|
16198
16184
|
def check_array_subscript(expr, ary_or_ptr, subs, ary, *)
|
16199
16185
|
return unless ary
|
16200
16186
|
|
16201
|
-
if expr.array_subscript
|
16187
|
+
if @interp.constant_expression?(expr.array_subscript)
|
16202
16188
|
warn_array_oob_access(expr.array_subscript, ary, subs)
|
16203
16189
|
end
|
16204
16190
|
end
|
@@ -16207,7 +16193,7 @@ module CBuiltin #:nodoc:
|
|
16207
16193
|
ary, subs_expr = extract_array_and_subscript(expr.operand)
|
16208
16194
|
return unless ary
|
16209
16195
|
|
16210
|
-
if
|
16196
|
+
if @interp.constant_expression?(subs_expr)
|
16211
16197
|
# NOTE: A constant-expression has no side-effects.
|
16212
16198
|
subs = @interp.interpret(subs_expr, QUIET)
|
16213
16199
|
warn_array_oob_access(expr.operand, ary, subs)
|
@@ -16636,12 +16622,11 @@ module CBuiltin #:nodoc:
|
|
16636
16622
|
super
|
16637
16623
|
@interp = phase_ctxt[:cc1_interpreter]
|
16638
16624
|
@interp.on_shift_expr_evaled += T(:check)
|
16639
|
-
@enum_tbl = @interp.environment.enumerator_table
|
16640
16625
|
end
|
16641
16626
|
|
16642
16627
|
private
|
16643
16628
|
def check(expr, lhs_var, rhs_var, *)
|
16644
|
-
if expr.rhs_operand
|
16629
|
+
if @interp.constant_expression?(expr.rhs_operand)
|
16645
16630
|
underlying_type = lhs_var.type
|
16646
16631
|
underlying_bit_size = @interp.scalar_value_of(underlying_type.bit_size)
|
16647
16632
|
promoted_type = lhs_var.type.integer_promoted_type
|
@@ -16836,9 +16821,8 @@ module CBuiltin #:nodoc:
|
|
16836
16821
|
|
16837
16822
|
def initialize(phase_ctxt)
|
16838
16823
|
super
|
16839
|
-
interp = phase_ctxt[:cc1_interpreter]
|
16840
|
-
interp.on_function_call_expr_evaled += T(:check)
|
16841
|
-
@enum_tbl = interp.environment.enumerator_table
|
16824
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
16825
|
+
@interp.on_function_call_expr_evaled += T(:check)
|
16842
16826
|
end
|
16843
16827
|
|
16844
16828
|
private
|
@@ -16848,10 +16832,10 @@ module CBuiltin #:nodoc:
|
|
16848
16832
|
next unless param_type && param_type.enum?
|
16849
16833
|
|
16850
16834
|
arg_expr = expr.argument_expressions[idx]
|
16851
|
-
|
16852
|
-
|
16853
|
-
|
16854
|
-
|
16835
|
+
if @interp.constant_expression?(arg_expr)
|
16836
|
+
if arg_var.type.enum?
|
16837
|
+
W(arg_expr.location) unless arg_var.type.same_as?(param_type)
|
16838
|
+
end
|
16855
16839
|
end
|
16856
16840
|
end
|
16857
16841
|
end
|
@@ -16866,18 +16850,17 @@ module CBuiltin #:nodoc:
|
|
16866
16850
|
|
16867
16851
|
def initialize(phase_ctxt)
|
16868
16852
|
super
|
16869
|
-
interp = phase_ctxt[:cc1_interpreter]
|
16870
|
-
interp.on_assignment_expr_evaled += T(:check)
|
16871
|
-
@enum_tbl = interp.environment.enumerator_table
|
16853
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
16854
|
+
@interp.on_assignment_expr_evaled += T(:check)
|
16872
16855
|
end
|
16873
16856
|
|
16874
16857
|
private
|
16875
16858
|
def check(expr, lhs_var, rhs_var)
|
16876
16859
|
return unless lhs_var.type.enum?
|
16877
|
-
|
16878
|
-
|
16879
|
-
|
16880
|
-
|
16860
|
+
if @interp.constant_expression?(expr.rhs_operand)
|
16861
|
+
if rhs_var.type.enum? && !lhs_var.type.same_as?(rhs_var.type)
|
16862
|
+
W(expr.location)
|
16863
|
+
end
|
16881
16864
|
end
|
16882
16865
|
end
|
16883
16866
|
end
|
@@ -16891,11 +16874,10 @@ module CBuiltin #:nodoc:
|
|
16891
16874
|
|
16892
16875
|
def initialize(phase_ctxt)
|
16893
16876
|
super
|
16894
|
-
interp = phase_ctxt[:cc1_interpreter]
|
16895
|
-
interp.on_function_started += T(:start_function)
|
16896
|
-
interp.on_function_ended += T(:end_function)
|
16897
|
-
interp.on_return_stmt_evaled += T(:check)
|
16898
|
-
@enum_tbl = interp.environment.enumerator_table
|
16877
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
16878
|
+
@interp.on_function_started += T(:start_function)
|
16879
|
+
@interp.on_function_ended += T(:end_function)
|
16880
|
+
@interp.on_return_stmt_evaled += T(:check)
|
16899
16881
|
@cur_fun = nil
|
16900
16882
|
end
|
16901
16883
|
|
@@ -16910,13 +16892,13 @@ module CBuiltin #:nodoc:
|
|
16910
16892
|
|
16911
16893
|
def check(retn_stmt, retn_var)
|
16912
16894
|
return unless @cur_fun && retn_var
|
16913
|
-
|
16914
16895
|
return unless retn_type = @cur_fun.type.return_type
|
16915
16896
|
return unless retn_type.enum?
|
16916
|
-
return unless retn_stmt.expression.constant?(@enum_tbl)
|
16917
16897
|
|
16918
|
-
if
|
16919
|
-
|
16898
|
+
if @interp.constant_expression?(retn_stmt.expression)
|
16899
|
+
if retn_var.type.enum? && !retn_type.same_as?(retn_var.type)
|
16900
|
+
W(retn_stmt.expression.location)
|
16901
|
+
end
|
16920
16902
|
end
|
16921
16903
|
end
|
16922
16904
|
end
|
@@ -17041,7 +17023,6 @@ module CBuiltin #:nodoc:
|
|
17041
17023
|
super
|
17042
17024
|
@interp = phase_ctxt[:cc1_interpreter]
|
17043
17025
|
@interp.on_implicit_conv_performed += T(:check)
|
17044
|
-
@enum_tbl = @interp.environment.enumerator_table
|
17045
17026
|
end
|
17046
17027
|
|
17047
17028
|
private
|
@@ -17055,7 +17036,7 @@ module CBuiltin #:nodoc:
|
|
17055
17036
|
expr = init_or_expr
|
17056
17037
|
end
|
17057
17038
|
|
17058
|
-
return unless
|
17039
|
+
return unless @interp.constant_expression?(expr)
|
17059
17040
|
|
17060
17041
|
org_type = org_var.type
|
17061
17042
|
res_type = res_var.type
|
@@ -17085,15 +17066,14 @@ module CBuiltin #:nodoc:
|
|
17085
17066
|
super
|
17086
17067
|
@interp = phase_ctxt[:cc1_interpreter]
|
17087
17068
|
@interp.on_additive_expr_evaled += T(:check)
|
17088
|
-
@enum_tbl = @interp.environment.enumerator_table
|
17089
17069
|
end
|
17090
17070
|
|
17091
17071
|
private
|
17092
17072
|
def check(expr, lhs_var, rhs_var, res_var)
|
17093
17073
|
return unless expr.operator.type == "-"
|
17094
17074
|
|
17095
|
-
return unless expr.lhs_operand
|
17096
|
-
return unless expr.rhs_operand
|
17075
|
+
return unless @interp.constant_expression?(expr.lhs_operand)
|
17076
|
+
return unless @interp.constant_expression?(expr.rhs_operand)
|
17097
17077
|
|
17098
17078
|
return unless lhs_var.type.scalar? && lhs_var.type.unsigned?
|
17099
17079
|
return unless rhs_var.type.scalar? && rhs_var.type.unsigned?
|
@@ -17118,15 +17098,14 @@ module CBuiltin #:nodoc:
|
|
17118
17098
|
super
|
17119
17099
|
@interp = phase_ctxt[:cc1_interpreter]
|
17120
17100
|
@interp.on_additive_expr_evaled += T(:check)
|
17121
|
-
@enum_tbl = @interp.environment.enumerator_table
|
17122
17101
|
end
|
17123
17102
|
|
17124
17103
|
private
|
17125
17104
|
def check(expr, lhs_var, rhs_var, res_var)
|
17126
17105
|
return unless expr.operator.type == "+"
|
17127
17106
|
|
17128
|
-
return unless expr.lhs_operand
|
17129
|
-
return unless expr.rhs_operand
|
17107
|
+
return unless @interp.constant_expression?(expr.lhs_operand)
|
17108
|
+
return unless @interp.constant_expression?(expr.rhs_operand)
|
17130
17109
|
|
17131
17110
|
return unless lhs_var.type.scalar? && lhs_var.type.unsigned?
|
17132
17111
|
return unless rhs_var.type.scalar? && rhs_var.type.unsigned?
|
@@ -17151,15 +17130,14 @@ module CBuiltin #:nodoc:
|
|
17151
17130
|
super
|
17152
17131
|
@interp = phase_ctxt[:cc1_interpreter]
|
17153
17132
|
@interp.on_multiplicative_expr_evaled += T(:check)
|
17154
|
-
@enum_tbl = @interp.environment.enumerator_table
|
17155
17133
|
end
|
17156
17134
|
|
17157
17135
|
private
|
17158
17136
|
def check(expr, lhs_var, rhs_var, res_var)
|
17159
17137
|
return unless expr.operator.type == "*"
|
17160
17138
|
|
17161
|
-
return unless expr.lhs_operand
|
17162
|
-
return unless expr.rhs_operand
|
17139
|
+
return unless @interp.constant_expression?(expr.lhs_operand)
|
17140
|
+
return unless @interp.constant_expression?(expr.rhs_operand)
|
17163
17141
|
|
17164
17142
|
return unless lhs_var.type.scalar? && lhs_var.type.unsigned?
|
17165
17143
|
return unless rhs_var.type.scalar? && rhs_var.type.unsigned?
|
@@ -17184,7 +17162,6 @@ module CBuiltin #:nodoc:
|
|
17184
17162
|
super
|
17185
17163
|
@interp = phase_ctxt[:cc1_interpreter]
|
17186
17164
|
@interp.on_implicit_conv_performed += T(:check)
|
17187
|
-
@enum_tbl = @interp.environment.enumerator_table
|
17188
17165
|
end
|
17189
17166
|
|
17190
17167
|
private
|
@@ -17200,7 +17177,7 @@ module CBuiltin #:nodoc:
|
|
17200
17177
|
expr = init_or_expr
|
17201
17178
|
end
|
17202
17179
|
|
17203
|
-
if expr &&
|
17180
|
+
if expr && @interp.constant_expression?(expr) &&
|
17204
17181
|
org_var.value.must_be_less_than?(@interp.scalar_value_of(0))
|
17205
17182
|
W(expr.location)
|
17206
17183
|
end
|
@@ -17218,7 +17195,6 @@ module CBuiltin #:nodoc:
|
|
17218
17195
|
super
|
17219
17196
|
@interp = phase_ctxt[:cc1_interpreter]
|
17220
17197
|
@interp.on_implicit_conv_performed += T(:check)
|
17221
|
-
@enum_tbl = @interp.environment.enumerator_table
|
17222
17198
|
end
|
17223
17199
|
|
17224
17200
|
private
|
@@ -17232,7 +17208,7 @@ module CBuiltin #:nodoc:
|
|
17232
17208
|
expr = init_or_expr
|
17233
17209
|
end
|
17234
17210
|
|
17235
|
-
return unless
|
17211
|
+
return unless @interp.constant_expression?(expr)
|
17236
17212
|
|
17237
17213
|
org_type = org_var.type
|
17238
17214
|
res_type = res_var.type
|
@@ -17263,47 +17239,46 @@ module CBuiltin #:nodoc:
|
|
17263
17239
|
|
17264
17240
|
def initialize(phase_ctxt)
|
17265
17241
|
super
|
17266
|
-
interp = phase_ctxt[:cc1_interpreter]
|
17267
|
-
interp.on_if_ctrlexpr_evaled += T(:check_if_statement)
|
17268
|
-
interp.on_if_else_ctrlexpr_evaled += T(:check_if_else_statement)
|
17269
|
-
interp.on_while_ctrlexpr_evaled += T(:check_while_statement)
|
17270
|
-
interp.on_for_ctrlexpr_evaled += T(:check_for_statement)
|
17271
|
-
interp.on_c99_for_ctrlexpr_evaled += T(:check_c99_for_statement)
|
17272
|
-
@enum_tbl = interp.environment.enumerator_table
|
17242
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
17243
|
+
@interp.on_if_ctrlexpr_evaled += T(:check_if_statement)
|
17244
|
+
@interp.on_if_else_ctrlexpr_evaled += T(:check_if_else_statement)
|
17245
|
+
@interp.on_while_ctrlexpr_evaled += T(:check_while_statement)
|
17246
|
+
@interp.on_for_ctrlexpr_evaled += T(:check_for_statement)
|
17247
|
+
@interp.on_c99_for_ctrlexpr_evaled += T(:check_c99_for_statement)
|
17273
17248
|
end
|
17274
17249
|
|
17275
17250
|
private
|
17276
17251
|
def check_if_statement(if_stmt, ctrlexpr_val)
|
17277
17252
|
ctrlexpr = if_stmt.expression
|
17278
|
-
if
|
17253
|
+
if @interp.constant_expression?(ctrlexpr) && ctrlexpr_val.must_be_false?
|
17279
17254
|
W(ctrlexpr.location)
|
17280
17255
|
end
|
17281
17256
|
end
|
17282
17257
|
|
17283
17258
|
def check_if_else_statement(if_else_stmt, ctrlexpr_val)
|
17284
17259
|
ctrlexpr = if_else_stmt.expression
|
17285
|
-
if
|
17260
|
+
if @interp.constant_expression?(ctrlexpr) && ctrlexpr_val.must_be_false?
|
17286
17261
|
W(ctrlexpr.location)
|
17287
17262
|
end
|
17288
17263
|
end
|
17289
17264
|
|
17290
17265
|
def check_while_statement(while_stmt, ctrlexpr_val)
|
17291
17266
|
ctrlexpr = while_stmt.expression
|
17292
|
-
if
|
17267
|
+
if @interp.constant_expression?(ctrlexpr) && ctrlexpr_val.must_be_false?
|
17293
17268
|
W(ctrlexpr.location)
|
17294
17269
|
end
|
17295
17270
|
end
|
17296
17271
|
|
17297
17272
|
def check_for_statement(for_stmt, ctrlexpr_val)
|
17298
17273
|
ctrlexpr = for_stmt.condition_statement.expression
|
17299
|
-
if
|
17274
|
+
if @interp.constant_expression?(ctrlexpr) && ctrlexpr_val.must_be_false?
|
17300
17275
|
W(ctrlexpr.location)
|
17301
17276
|
end
|
17302
17277
|
end
|
17303
17278
|
|
17304
17279
|
def check_c99_for_statement(c99_for_stmt, ctrlexpr_val)
|
17305
17280
|
ctrlexpr = c99_for_stmt.condition_statement.expression
|
17306
|
-
if
|
17281
|
+
if @interp.constant_expression?(ctrlexpr) && ctrlexpr_val.must_be_false?
|
17307
17282
|
W(ctrlexpr.location)
|
17308
17283
|
end
|
17309
17284
|
end
|
@@ -17324,14 +17299,13 @@ module CBuiltin #:nodoc:
|
|
17324
17299
|
@interp = phase_ctxt[:cc1_interpreter]
|
17325
17300
|
@interp.on_array_subscript_expr_evaled += T(:check_array_subscript)
|
17326
17301
|
@interp.on_indirection_expr_evaled += T(:check_indirection)
|
17327
|
-
@enum_tbl = @interp.environment.enumerator_table
|
17328
17302
|
end
|
17329
17303
|
|
17330
17304
|
private
|
17331
17305
|
def check_array_subscript(expr, ary_or_ptr, subs, ary, *)
|
17332
17306
|
return unless ary
|
17333
17307
|
|
17334
|
-
unless expr.array_subscript
|
17308
|
+
unless @interp.constant_expression?(expr.array_subscript)
|
17335
17309
|
warn_array_oob_access(expr.array_subscript, ary, subs)
|
17336
17310
|
end
|
17337
17311
|
end
|
@@ -17340,7 +17314,7 @@ module CBuiltin #:nodoc:
|
|
17340
17314
|
ary, subs_expr = extract_array_and_subscript(expr.operand)
|
17341
17315
|
return unless ary
|
17342
17316
|
|
17343
|
-
unless
|
17317
|
+
unless @interp.constant_expression?(subs_expr)
|
17344
17318
|
subs = @interp.interpret(subs_expr, QUIET_WITHOUT_SIDE_EFFECT)
|
17345
17319
|
warn_array_oob_access(expr.operand, ary, subs)
|
17346
17320
|
end
|
@@ -18211,7 +18185,6 @@ module CBuiltin #:nodoc:
|
|
18211
18185
|
super
|
18212
18186
|
@interp = phase_ctxt[:cc1_interpreter]
|
18213
18187
|
@interp.on_shift_expr_evaled += T(:check)
|
18214
|
-
@enum_tbl = @interp.environment.enumerator_table
|
18215
18188
|
end
|
18216
18189
|
|
18217
18190
|
private
|
@@ -18219,7 +18192,7 @@ module CBuiltin #:nodoc:
|
|
18219
18192
|
op = expr.operator.type
|
18220
18193
|
return unless op == "<<" || op == "<<="
|
18221
18194
|
|
18222
|
-
if lhs_var.type.unsigned? &&
|
18195
|
+
if lhs_var.type.unsigned? && @interp.constant_expression?(expr)
|
18223
18196
|
if must_overflow?(lhs_var, rhs_var)
|
18224
18197
|
W(expr.location)
|
18225
18198
|
end
|
@@ -18297,9 +18270,9 @@ module CBuiltin #:nodoc:
|
|
18297
18270
|
|
18298
18271
|
def initialize(phase_ctxt)
|
18299
18272
|
super
|
18300
|
-
|
18301
|
-
|
18302
|
-
|
18273
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
18274
|
+
traversal.enter_struct_type_declaration += T(:check)
|
18275
|
+
traversal.enter_union_type_declaration += T(:check)
|
18303
18276
|
@interp = phase_ctxt[:cc1_interpreter]
|
18304
18277
|
end
|
18305
18278
|
|
@@ -18310,10 +18283,9 @@ module CBuiltin #:nodoc:
|
|
18310
18283
|
type = memb_dcl.type
|
18311
18284
|
next unless type.scalar? && type.integer? && type.bitfield?
|
18312
18285
|
|
18313
|
-
|
18314
|
-
|
18315
|
-
|
18316
|
-
else
|
18286
|
+
unless type.base_type.same_as?(@interp.int_t) ||
|
18287
|
+
type.base_type.same_as?(@interp.unsigned_int_t) ||
|
18288
|
+
type.base_type.same_as?(@interp.signed_int_t)
|
18317
18289
|
W(node.location)
|
18318
18290
|
return
|
18319
18291
|
end
|
@@ -18719,16 +18691,15 @@ module CBuiltin #:nodoc:
|
|
18719
18691
|
|
18720
18692
|
def initialize(phase_ctxt)
|
18721
18693
|
super
|
18722
|
-
interp = phase_ctxt[:cc1_interpreter]
|
18723
|
-
interp.on_shift_expr_evaled += T(:check)
|
18724
|
-
@enum_tbl = interp.environment.enumerator_table
|
18694
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
18695
|
+
@interp.on_shift_expr_evaled += T(:check)
|
18725
18696
|
end
|
18726
18697
|
|
18727
18698
|
private
|
18728
18699
|
def check(expr, lhs_var, *)
|
18729
18700
|
case expr.operator.type
|
18730
18701
|
when "<<", "<<="
|
18731
|
-
unless expr.lhs_operand
|
18702
|
+
unless @interp.constant_expression?(expr.lhs_operand)
|
18732
18703
|
W(expr.location) if lhs_var.type.signed?
|
18733
18704
|
end
|
18734
18705
|
end
|
@@ -18958,10 +18929,10 @@ module CBuiltin #:nodoc:
|
|
18958
18929
|
|
18959
18930
|
def initialize(phase_ctxt)
|
18960
18931
|
super
|
18961
|
-
|
18962
|
-
|
18963
|
-
|
18964
|
-
|
18932
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
18933
|
+
traversal.enter_if_statement += T(:enter_outer_if_stmt)
|
18934
|
+
traversal.leave_if_statement += T(:leave_outer_if_stmt)
|
18935
|
+
traversal.enter_if_else_statement += T(:check_inner_if_else_stmt)
|
18965
18936
|
@if_stmt_stack = []
|
18966
18937
|
end
|
18967
18938
|
|
@@ -18991,8 +18962,8 @@ module CBuiltin #:nodoc:
|
|
18991
18962
|
|
18992
18963
|
def initialize(phase_ctxt)
|
18993
18964
|
super
|
18994
|
-
|
18995
|
-
|
18965
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
18966
|
+
traversal.enter_variable_definition += T(:enter_variable_definition)
|
18996
18967
|
end
|
18997
18968
|
|
18998
18969
|
private
|
@@ -19036,8 +19007,8 @@ module CBuiltin #:nodoc:
|
|
19036
19007
|
|
19037
19008
|
def initialize(phase_ctxt)
|
19038
19009
|
super
|
19039
|
-
|
19040
|
-
|
19010
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19011
|
+
traversal.enter_variable_definition += T(:enter_variable_definition)
|
19041
19012
|
end
|
19042
19013
|
|
19043
19014
|
private
|
@@ -19083,8 +19054,8 @@ module CBuiltin #:nodoc:
|
|
19083
19054
|
|
19084
19055
|
def initialize(phase_ctxt)
|
19085
19056
|
super
|
19086
|
-
|
19087
|
-
|
19057
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19058
|
+
traversal.enter_enum_specifier += T(:check)
|
19088
19059
|
end
|
19089
19060
|
|
19090
19061
|
private
|
@@ -19126,17 +19097,17 @@ module CBuiltin #:nodoc:
|
|
19126
19097
|
|
19127
19098
|
def initialize(phase_ctxt)
|
19128
19099
|
super
|
19129
|
-
|
19130
|
-
|
19131
|
-
|
19132
|
-
|
19133
|
-
|
19134
|
-
|
19135
|
-
|
19136
|
-
|
19137
|
-
|
19138
|
-
|
19139
|
-
|
19100
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19101
|
+
traversal.enter_member_declaration += T(:check_member_decl)
|
19102
|
+
traversal.enter_typedef_declaration += T(:check_declspec_holder)
|
19103
|
+
traversal.enter_function_declaration += T(:check_declspec_holder)
|
19104
|
+
traversal.enter_parameter_declaration += T(:check_declspec_holder)
|
19105
|
+
traversal.enter_variable_declaration += T(:check_declspec_holder)
|
19106
|
+
traversal.enter_variable_definition += T(:check_declspec_holder)
|
19107
|
+
traversal.enter_ansi_function_definition += T(:check_declspec_holder)
|
19108
|
+
traversal.enter_kandr_function_definition += T(:check_declspec_holder)
|
19109
|
+
traversal.enter_parameter_definition += T(:check_declspec_holder)
|
19110
|
+
traversal.enter_type_name += T(:check_type_name)
|
19140
19111
|
end
|
19141
19112
|
|
19142
19113
|
private
|
@@ -19228,8 +19199,8 @@ module CBuiltin #:nodoc:
|
|
19228
19199
|
|
19229
19200
|
def initialize(phase_ctxt)
|
19230
19201
|
super
|
19231
|
-
|
19232
|
-
|
19202
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19203
|
+
traversal.enter_string_literal_specifier += T(:check)
|
19233
19204
|
end
|
19234
19205
|
|
19235
19206
|
private
|
@@ -19247,8 +19218,8 @@ module CBuiltin #:nodoc:
|
|
19247
19218
|
|
19248
19219
|
def initialize(phase_ctxt)
|
19249
19220
|
super
|
19250
|
-
|
19251
|
-
|
19221
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19222
|
+
traversal.enter_constant_specifier += T(:check)
|
19252
19223
|
end
|
19253
19224
|
|
19254
19225
|
private
|
@@ -19270,8 +19241,8 @@ module CBuiltin #:nodoc:
|
|
19270
19241
|
|
19271
19242
|
def initialize(phase_ctxt)
|
19272
19243
|
super
|
19273
|
-
|
19274
|
-
|
19244
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19245
|
+
traversal.enter_struct_declarator += T(:check)
|
19275
19246
|
@interp = Cc1::Interpreter.new(phase_ctxt[:cc1_type_table])
|
19276
19247
|
end
|
19277
19248
|
|
@@ -19307,8 +19278,8 @@ module CBuiltin #:nodoc:
|
|
19307
19278
|
|
19308
19279
|
def initialize(phase_ctxt)
|
19309
19280
|
super
|
19310
|
-
|
19311
|
-
|
19281
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19282
|
+
traversal.enter_variable_definition += T(:check)
|
19312
19283
|
end
|
19313
19284
|
|
19314
19285
|
private
|
@@ -19541,10 +19512,10 @@ module CBuiltin #:nodoc:
|
|
19541
19512
|
|
19542
19513
|
def initialize(phase_ctxt)
|
19543
19514
|
super
|
19544
|
-
|
19545
|
-
|
19546
|
-
|
19547
|
-
|
19515
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
19516
|
+
traversal.enter_function_declaration += T(:check)
|
19517
|
+
traversal.enter_compound_statement += T(:enter_block)
|
19518
|
+
traversal.leave_compound_statement += T(:leave_block)
|
19548
19519
|
@block_level = 0
|
19549
19520
|
end
|
19550
19521
|
|
@@ -19650,19 +19621,22 @@ module CBuiltin #:nodoc:
|
|
19650
19621
|
|
19651
19622
|
def initialize(phase_ctxt)
|
19652
19623
|
super
|
19653
|
-
interp = phase_ctxt[:cc1_interpreter]
|
19654
|
-
interp.on_variable_initialized += T(:check)
|
19655
|
-
@enum_tbl = interp.environment.enumerator_table
|
19624
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
19625
|
+
@interp.on_variable_initialized += T(:check)
|
19656
19626
|
end
|
19657
19627
|
|
19658
19628
|
private
|
19659
19629
|
def check(var_def, *)
|
19660
19630
|
type = var_def.type
|
19661
|
-
|
19662
|
-
|
19663
|
-
|
19664
|
-
|
19631
|
+
return unless type.struct? || type.union? || type.array?
|
19632
|
+
|
19633
|
+
if init = var_def.initializer
|
19634
|
+
Cc1::ExpressionExtractor.new.tap { |extr|
|
19635
|
+
init.accept(extr)
|
19636
|
+
}.expressions.each do |expr|
|
19637
|
+
unless @interp.constant_expression?(expr)
|
19665
19638
|
W(var_def.location)
|
19639
|
+
break
|
19666
19640
|
end
|
19667
19641
|
end
|
19668
19642
|
end
|
@@ -19830,9 +19804,8 @@ module CBuiltin #:nodoc:
|
|
19830
19804
|
|
19831
19805
|
def initialize(phase_ctxt)
|
19832
19806
|
super
|
19833
|
-
interp = phase_ctxt[:cc1_interpreter]
|
19834
|
-
interp.on_function_call_expr_evaled += T(:check)
|
19835
|
-
@enum_tbl = interp.environment.enumerator_table
|
19807
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
19808
|
+
@interp.on_function_call_expr_evaled += T(:check)
|
19836
19809
|
end
|
19837
19810
|
|
19838
19811
|
private
|
@@ -19842,9 +19815,9 @@ module CBuiltin #:nodoc:
|
|
19842
19815
|
next unless param_type && param_type.enum?
|
19843
19816
|
|
19844
19817
|
arg_expr = expr.argument_expressions[idx]
|
19845
|
-
|
19846
|
-
|
19847
|
-
|
19818
|
+
if @interp.constant_expression?(arg_expr)
|
19819
|
+
W(arg_expr.location) unless arg_var.type.enum?
|
19820
|
+
end
|
19848
19821
|
end
|
19849
19822
|
end
|
19850
19823
|
end
|
@@ -19913,9 +19886,8 @@ module CBuiltin #:nodoc:
|
|
19913
19886
|
|
19914
19887
|
def initialize(phase_ctxt)
|
19915
19888
|
super
|
19916
|
-
interp = phase_ctxt[:cc1_interpreter]
|
19917
|
-
interp.on_function_call_expr_evaled += T(:check)
|
19918
|
-
@enum_tbl = interp.environment.enumerator_table
|
19889
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
19890
|
+
@interp.on_function_call_expr_evaled += T(:check)
|
19919
19891
|
end
|
19920
19892
|
|
19921
19893
|
private
|
@@ -19925,11 +19897,9 @@ module CBuiltin #:nodoc:
|
|
19925
19897
|
next unless param_type && param_type.enum?
|
19926
19898
|
|
19927
19899
|
arg_expr = expr.argument_expressions[idx]
|
19928
|
-
|
19929
|
-
|
19930
|
-
|
19931
|
-
unless arg_var.type.same_as?(param_type)
|
19932
|
-
W(arg_expr.location)
|
19900
|
+
unless @interp.constant_expression?(arg_expr)
|
19901
|
+
if arg_var.type.enum?
|
19902
|
+
W(arg_expr.location) unless arg_var.type.same_as?(param_type)
|
19933
19903
|
end
|
19934
19904
|
end
|
19935
19905
|
end
|
@@ -19945,16 +19915,15 @@ module CBuiltin #:nodoc:
|
|
19945
19915
|
|
19946
19916
|
def initialize(phase_ctxt)
|
19947
19917
|
super
|
19948
|
-
interp = phase_ctxt[:cc1_interpreter]
|
19949
|
-
interp.on_assignment_expr_evaled += T(:check)
|
19950
|
-
@enum_tbl = interp.environment.enumerator_table
|
19918
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
19919
|
+
@interp.on_assignment_expr_evaled += T(:check)
|
19951
19920
|
end
|
19952
19921
|
|
19953
19922
|
private
|
19954
19923
|
def check(expr, lhs_var, rhs_var)
|
19955
19924
|
return unless lhs_var.type.enum?
|
19956
19925
|
|
19957
|
-
if rhs_var.type.enum? &&
|
19926
|
+
if rhs_var.type.enum? && !@interp.constant_expression?(expr.rhs_operand)
|
19958
19927
|
unless lhs_var.type.same_as?(rhs_var.type)
|
19959
19928
|
W(expr.location)
|
19960
19929
|
end
|
@@ -19971,11 +19940,10 @@ module CBuiltin #:nodoc:
|
|
19971
19940
|
|
19972
19941
|
def initialize(phase_ctxt)
|
19973
19942
|
super
|
19974
|
-
interp = phase_ctxt[:cc1_interpreter]
|
19975
|
-
interp.on_function_started += T(:start_function)
|
19976
|
-
interp.on_function_ended += T(:end_function)
|
19977
|
-
interp.on_return_stmt_evaled += T(:check)
|
19978
|
-
@enum_tbl = interp.environment.enumerator_table
|
19943
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
19944
|
+
@interp.on_function_started += T(:start_function)
|
19945
|
+
@interp.on_function_ended += T(:end_function)
|
19946
|
+
@interp.on_return_stmt_evaled += T(:check)
|
19979
19947
|
@cur_fun = nil
|
19980
19948
|
end
|
19981
19949
|
|
@@ -19990,7 +19958,7 @@ module CBuiltin #:nodoc:
|
|
19990
19958
|
|
19991
19959
|
def check(retn_stmt, retn_var)
|
19992
19960
|
return unless @cur_fun && retn_var
|
19993
|
-
return if retn_stmt.expression
|
19961
|
+
return if @interp.constant_expression?(retn_stmt.expression)
|
19994
19962
|
|
19995
19963
|
if retn_type = @cur_fun.type.return_type and retn_type.enum?
|
19996
19964
|
if retn_var.type.enum? && !retn_type.same_as?(retn_var.type)
|
@@ -20011,7 +19979,6 @@ module CBuiltin #:nodoc:
|
|
20011
19979
|
super
|
20012
19980
|
interp = phase_ctxt[:cc1_interpreter]
|
20013
19981
|
interp.on_function_call_expr_evaled += T(:check)
|
20014
|
-
@enum_tbl = interp.environment.enumerator_table
|
20015
19982
|
end
|
20016
19983
|
|
20017
19984
|
private
|
@@ -20038,7 +20005,6 @@ module CBuiltin #:nodoc:
|
|
20038
20005
|
interp.on_function_started += T(:start_function)
|
20039
20006
|
interp.on_function_ended += T(:end_function)
|
20040
20007
|
interp.on_return_stmt_evaled += T(:check)
|
20041
|
-
@enum_tbl = interp.environment.enumerator_table
|
20042
20008
|
@cur_fun = nil
|
20043
20009
|
end
|
20044
20010
|
|
@@ -20069,9 +20035,8 @@ module CBuiltin #:nodoc:
|
|
20069
20035
|
|
20070
20036
|
def initialize(phase_ctxt)
|
20071
20037
|
super
|
20072
|
-
interp = phase_ctxt[:cc1_interpreter]
|
20073
|
-
interp.on_function_call_expr_evaled += T(:check)
|
20074
|
-
@enum_tbl = interp.environment.enumerator_table
|
20038
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
20039
|
+
@interp.on_function_call_expr_evaled += T(:check)
|
20075
20040
|
end
|
20076
20041
|
|
20077
20042
|
private
|
@@ -20081,7 +20046,7 @@ module CBuiltin #:nodoc:
|
|
20081
20046
|
next unless param_type && param_type.enum?
|
20082
20047
|
|
20083
20048
|
arg_expr = expr.argument_expressions[idx]
|
20084
|
-
unless
|
20049
|
+
unless @interp.constant_expression?(arg_expr)
|
20085
20050
|
unless arg_var.type.same_as?(param_type)
|
20086
20051
|
W(arg_expr.location)
|
20087
20052
|
end
|
@@ -20099,14 +20064,13 @@ module CBuiltin #:nodoc:
|
|
20099
20064
|
|
20100
20065
|
def initialize(phase_ctxt)
|
20101
20066
|
super
|
20102
|
-
interp = phase_ctxt[:cc1_interpreter]
|
20103
|
-
interp.on_assignment_expr_evaled += T(:check)
|
20104
|
-
@enum_tbl = interp.environment.enumerator_table
|
20067
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
20068
|
+
@interp.on_assignment_expr_evaled += T(:check)
|
20105
20069
|
end
|
20106
20070
|
|
20107
20071
|
private
|
20108
20072
|
def check(expr, lhs_var, rhs_var)
|
20109
|
-
if lhs_var.type.enum? &&
|
20073
|
+
if lhs_var.type.enum? && !@interp.constant_expression?(expr.rhs_operand)
|
20110
20074
|
unless lhs_var.type.same_as?(rhs_var.type)
|
20111
20075
|
W(expr.location)
|
20112
20076
|
end
|
@@ -20123,11 +20087,10 @@ module CBuiltin #:nodoc:
|
|
20123
20087
|
|
20124
20088
|
def initialize(phase_ctxt)
|
20125
20089
|
super
|
20126
|
-
interp = phase_ctxt[:cc1_interpreter]
|
20127
|
-
interp.on_function_started += T(:start_function)
|
20128
|
-
interp.on_function_ended += T(:end_function)
|
20129
|
-
interp.on_return_stmt_evaled += T(:check)
|
20130
|
-
@enum_tbl = interp.environment.enumerator_table
|
20090
|
+
@interp = phase_ctxt[:cc1_interpreter]
|
20091
|
+
@interp.on_function_started += T(:start_function)
|
20092
|
+
@interp.on_function_ended += T(:end_function)
|
20093
|
+
@interp.on_return_stmt_evaled += T(:check)
|
20131
20094
|
@cur_fun = nil
|
20132
20095
|
end
|
20133
20096
|
|
@@ -20144,7 +20107,7 @@ module CBuiltin #:nodoc:
|
|
20144
20107
|
return unless @cur_fun && retn_var
|
20145
20108
|
|
20146
20109
|
if retn_type = @cur_fun.type.return_type and retn_type.enum?
|
20147
|
-
unless retn_stmt.expression
|
20110
|
+
unless @interp.constant_expression?(retn_stmt.expression)
|
20148
20111
|
unless retn_var.type.same_as?(retn_type)
|
20149
20112
|
W(retn_stmt.expression.location)
|
20150
20113
|
end
|
@@ -20299,8 +20262,8 @@ module CBuiltin #:nodoc:
|
|
20299
20262
|
|
20300
20263
|
def initialize(phase_ctxt)
|
20301
20264
|
super
|
20302
|
-
|
20303
|
-
|
20265
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
20266
|
+
traversal.enter_sizeof_expression += T(:check)
|
20304
20267
|
end
|
20305
20268
|
|
20306
20269
|
private
|
@@ -20436,23 +20399,23 @@ module CBuiltin #:nodoc:
|
|
20436
20399
|
def initialize(phase_ctxt)
|
20437
20400
|
super
|
20438
20401
|
@fpath = phase_ctxt[:sources].first.fpath
|
20439
|
-
|
20440
|
-
|
20441
|
-
|
20442
|
-
|
20443
|
-
|
20444
|
-
|
20445
|
-
|
20446
|
-
|
20447
|
-
|
20448
|
-
|
20449
|
-
|
20450
|
-
|
20451
|
-
|
20452
|
-
|
20453
|
-
|
20454
|
-
|
20455
|
-
|
20402
|
+
traversal = phase_ctxt[:cc1_ast_traversal]
|
20403
|
+
traversal.enter_error_statement += T(:check)
|
20404
|
+
traversal.enter_generic_labeled_statement += T(:check)
|
20405
|
+
traversal.enter_case_labeled_statement += T(:check)
|
20406
|
+
traversal.enter_default_labeled_statement += T(:check)
|
20407
|
+
traversal.enter_expression_statement += T(:check)
|
20408
|
+
traversal.enter_if_statement += T(:check)
|
20409
|
+
traversal.enter_if_else_statement += T(:check)
|
20410
|
+
traversal.enter_switch_statement += T(:check)
|
20411
|
+
traversal.enter_while_statement += T(:check)
|
20412
|
+
traversal.enter_do_statement += T(:check)
|
20413
|
+
traversal.enter_for_statement += T(:check)
|
20414
|
+
traversal.enter_c99_for_statement += T(:check)
|
20415
|
+
traversal.enter_goto_statement += T(:check)
|
20416
|
+
traversal.enter_continue_statement += T(:check)
|
20417
|
+
traversal.enter_break_statement += T(:check)
|
20418
|
+
traversal.enter_return_statement += T(:check)
|
20456
20419
|
end
|
20457
20420
|
|
20458
20421
|
private
|
@@ -20477,7 +20440,6 @@ module CBuiltin #:nodoc:
|
|
20477
20440
|
super
|
20478
20441
|
@interp = phase_ctxt[:cc1_interpreter]
|
20479
20442
|
@interp.on_implicit_conv_performed += T(:check)
|
20480
|
-
@enum_tbl = @interp.environment.enumerator_table
|
20481
20443
|
end
|
20482
20444
|
|
20483
20445
|
private
|
@@ -20492,13 +20454,14 @@ module CBuiltin #:nodoc:
|
|
20492
20454
|
|
20493
20455
|
case init_or_expr
|
20494
20456
|
when Cc1::Initializer
|
20495
|
-
|
20457
|
+
expr = init_or_expr.expression
|
20458
|
+
if expr && @interp.constant_expression?(expr)
|
20496
20459
|
if untyped_pointer_conversion?(from_type, to_type, org_var.value)
|
20497
20460
|
return
|
20498
20461
|
end
|
20499
20462
|
end
|
20500
20463
|
when Cc1::Expression
|
20501
|
-
if
|
20464
|
+
if @interp.constant_expression?(init_or_expr)
|
20502
20465
|
if untyped_pointer_conversion?(from_type, to_type, org_var.value)
|
20503
20466
|
return
|
20504
20467
|
end
|