adlint 1.2.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +1 -1
- data/ChangeLog +272 -0
- data/MANIFEST +4 -0
- data/NEWS +39 -4
- data/etc/mesg.d/en_US/messages.yml +2 -2
- data/etc/mesg.d/ja_JP/messages.yml +2 -2
- data/lib/adlint/c.rb +1 -0
- data/lib/adlint/c/expr.rb +20 -26
- data/lib/adlint/c/interp.rb +137 -45
- data/lib/adlint/c/mediator.rb +4 -0
- data/lib/adlint/c/message.rb +479 -16
- data/lib/adlint/c/message_shima.rb +151 -0
- data/lib/adlint/c/phase.rb +23 -0
- data/lib/adlint/c/resolver.rb +1 -0
- data/lib/adlint/c/syntax.rb +93 -89
- data/lib/adlint/c/type.rb +70 -0
- data/lib/adlint/cpp/eval.rb +12 -1
- data/lib/adlint/cpp/message_shima.rb +51 -0
- data/lib/adlint/cpp/phase.rb +3 -0
- data/lib/adlint/version.rb +2 -2
- data/share/demo/Makefile +3 -0
- data/share/demo/bad_enum/bad_enum.c +27 -0
- data/share/demo/bad_macro/bad_macro.c +4 -0
- data/share/demo/bad_return/bad_return.c +83 -0
- data/share/demo/incomplete_type/incomplete_type.c +3 -0
- data/share/demo/overflow/overflow.c +59 -5
- data/share/demo/union_type/union_type.c +13 -0
- data/share/demo/unnamed_member/unnamed_member.c +13 -0
- data/share/demo/various_fundef/various_fundef.c +43 -0
- data/share/demo/wrap_around/wrap_around.c +95 -21
- data/share/doc/developers_guide_ja.html +3 -3
- data/share/doc/developers_guide_ja.texi +1 -1
- data/share/doc/users_guide_en.html +222 -149
- data/share/doc/users_guide_en.texi +194 -120
- data/share/doc/users_guide_ja.html +224 -167
- data/share/doc/users_guide_ja.texi +194 -137
- metadata +6 -2
@@ -0,0 +1,151 @@
|
|
1
|
+
# Message detection classes for C language.
|
2
|
+
#
|
3
|
+
# Author:: Rie Shima <mailto:rkakuuchi@users.sourceforge.net>
|
4
|
+
# Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
|
5
|
+
# License:: GPLv3+: GNU General Public License version 3 or later
|
6
|
+
#
|
7
|
+
# Owner:: Rie Shima <mailto:rkakuuchi@users.sourceforge.net>
|
8
|
+
|
9
|
+
#--
|
10
|
+
# ___ ____ __ ___ _________
|
11
|
+
# / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
|
12
|
+
# / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
|
13
|
+
# / __ |/ /_/ / /___/ / /| / / /
|
14
|
+
# /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
|
15
|
+
#
|
16
|
+
# This file is part of AdLint.
|
17
|
+
#
|
18
|
+
# AdLint is free software: you can redistribute it and/or modify it under the
|
19
|
+
# terms of the GNU General Public License as published by the Free Software
|
20
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
21
|
+
# version.
|
22
|
+
#
|
23
|
+
# AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
|
24
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
25
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
26
|
+
#
|
27
|
+
# You should have received a copy of the GNU General Public License along with
|
28
|
+
# AdLint. If not, see <http://www.gnu.org/licenses/>.
|
29
|
+
#
|
30
|
+
#++
|
31
|
+
|
32
|
+
require "adlint/report"
|
33
|
+
require "adlint/message"
|
34
|
+
|
35
|
+
module AdLint #:nodoc:
|
36
|
+
module C #:nodoc:
|
37
|
+
|
38
|
+
class W0606 < PassiveMessageDetection
|
39
|
+
def initialize(context)
|
40
|
+
super
|
41
|
+
visitor = context[:c_visitor]
|
42
|
+
visitor.enter_union_type_declaration += method(:check)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
def check(node)
|
47
|
+
node.struct_declarations.each do |struct_declaration|
|
48
|
+
struct_declaration.items.each do |member_decl|
|
49
|
+
if member_decl.type.scalar? && member_decl.type.floating?
|
50
|
+
W(:W0606, node.location)
|
51
|
+
return
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class W0698 < PassiveMessageDetection
|
59
|
+
def initialize(context)
|
60
|
+
super
|
61
|
+
visitor = context[:c_visitor]
|
62
|
+
visitor.enter_ansi_function_definition += method(:start_function)
|
63
|
+
visitor.enter_kandr_function_definition += method(:start_function)
|
64
|
+
visitor.leave_ansi_function_definition += method(:end_function)
|
65
|
+
visitor.leave_kandr_function_definition += method(:end_function)
|
66
|
+
visitor.enter_return_statement += method(:check)
|
67
|
+
@current_function = nil
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
def start_function(function_definition)
|
72
|
+
@current_function = function_definition
|
73
|
+
end
|
74
|
+
|
75
|
+
def end_function(function_definition)
|
76
|
+
@current_function = nil
|
77
|
+
end
|
78
|
+
|
79
|
+
def check(return_statement)
|
80
|
+
return unless @current_function.explicitly_typed?
|
81
|
+
|
82
|
+
if return_type = @current_function.type.return_type
|
83
|
+
if !return_type.void? && return_statement.expression.nil?
|
84
|
+
W(:W0698, return_statement.location,
|
85
|
+
@current_function.identifier.value)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class W0699 < W0698
|
92
|
+
private
|
93
|
+
def check(return_statement)
|
94
|
+
return unless @current_function.implicitly_typed?
|
95
|
+
|
96
|
+
if return_statement.expression.nil?
|
97
|
+
W(:W0699, return_statement.location,
|
98
|
+
@current_function.identifier.value)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class W0726 < W0698
|
104
|
+
private
|
105
|
+
def check(return_statement)
|
106
|
+
return unless return_statement.expression
|
107
|
+
|
108
|
+
if return_type = @current_function.type.return_type
|
109
|
+
if return_type.void? && (return_type.const? || return_type.volatile?)
|
110
|
+
W(:W0726, return_statement.location,
|
111
|
+
@current_function.identifier.value)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class W0801 < PassiveMessageDetection
|
118
|
+
def initialize(context)
|
119
|
+
super
|
120
|
+
visitor = context[:c_visitor]
|
121
|
+
visitor.enter_struct_type_declaration += method(:check)
|
122
|
+
visitor.enter_union_type_declaration += method(:check)
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
def check(node)
|
127
|
+
W(:W0801, node.location) if node.type.members.empty?
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class W1033 < PassiveMessageDetection
|
132
|
+
def initialize(context)
|
133
|
+
super
|
134
|
+
visitor = context[:c_visitor]
|
135
|
+
visitor.enter_ansi_function_definition += method(:check)
|
136
|
+
visitor.enter_kandr_function_definition += method(:check)
|
137
|
+
visitor.enter_function_declaration += method(:check)
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
def check(definition_or_declaration)
|
142
|
+
if return_type = definition_or_declaration.type.return_type
|
143
|
+
if return_type.const? || return_type.volatile?
|
144
|
+
W(:W1033, definition_or_declaration.location)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
data/lib/adlint/c/phase.rb
CHANGED
@@ -563,6 +563,7 @@ module C #:nodoc:
|
|
563
563
|
W0599.new(context),
|
564
564
|
W0600.new(context),
|
565
565
|
W0605.new(context),
|
566
|
+
W0606.new(context),
|
566
567
|
W0609.new(context),
|
567
568
|
W0610.new(context),
|
568
569
|
W0611.new(context),
|
@@ -613,12 +614,30 @@ module C #:nodoc:
|
|
613
614
|
W0682.new(context),
|
614
615
|
W0683.new(context),
|
615
616
|
W0684.new(context),
|
617
|
+
W0698.new(context),
|
618
|
+
W0699.new(context),
|
616
619
|
W0703.new(context),
|
617
620
|
W0704.new(context),
|
618
621
|
W0705.new(context),
|
619
622
|
W0708.new(context),
|
623
|
+
W0720.new(context),
|
624
|
+
W0721.new(context),
|
625
|
+
W0722.new(context),
|
626
|
+
W0723.new(context),
|
627
|
+
W0726.new(context),
|
628
|
+
W0727.new(context),
|
629
|
+
W0728.new(context),
|
630
|
+
W0729.new(context),
|
631
|
+
W0730.new(context),
|
632
|
+
W0731.new(context),
|
620
633
|
W0736.new(context),
|
634
|
+
W0737.new(context),
|
635
|
+
W0738.new(context),
|
636
|
+
W0739.new(context),
|
637
|
+
W0740.new(context),
|
638
|
+
W0741.new(context),
|
621
639
|
W0742.new(context),
|
640
|
+
W0743.new(context),
|
622
641
|
W0744.new(context),
|
623
642
|
W0745.new(context),
|
624
643
|
W0747.new(context),
|
@@ -660,6 +679,7 @@ module C #:nodoc:
|
|
660
679
|
W0798.new(context),
|
661
680
|
W0799.new(context),
|
662
681
|
W0800.new(context),
|
682
|
+
W0801.new(context),
|
663
683
|
W0810.new(context),
|
664
684
|
W0827.new(context),
|
665
685
|
W0828.new(context),
|
@@ -672,11 +692,14 @@ module C #:nodoc:
|
|
672
692
|
W1029.new(context),
|
673
693
|
W1031.new(context),
|
674
694
|
W1032.new(context),
|
695
|
+
W1033.new(context),
|
675
696
|
W1034.new(context),
|
676
697
|
W1049.new(context),
|
677
698
|
W1050.new(context),
|
678
699
|
W1051.new(context),
|
679
700
|
W1052.new(context),
|
701
|
+
W1064.new(context),
|
702
|
+
W1065.new(context),
|
680
703
|
W9001.new(context)
|
681
704
|
]
|
682
705
|
end
|
data/lib/adlint/c/resolver.rb
CHANGED
data/lib/adlint/c/syntax.rb
CHANGED
@@ -1107,7 +1107,38 @@ module C #:nodoc:
|
|
1107
1107
|
end
|
1108
1108
|
end
|
1109
1109
|
|
1110
|
+
module DeclarationSpecifiersHolder
|
1111
|
+
def storage_class_specifier
|
1112
|
+
@declaration_specifiers ?
|
1113
|
+
@declaration_specifiers.storage_class_specifier : nil
|
1114
|
+
end
|
1115
|
+
|
1116
|
+
def function_specifier
|
1117
|
+
# NOTE: A function-specifier should only be in function-definitions.
|
1118
|
+
@declaration_specifiers ?
|
1119
|
+
@declaration_specifiers.function_specifier : nil
|
1120
|
+
end
|
1121
|
+
|
1122
|
+
def type_qualifiers
|
1123
|
+
@declaration_specifiers ? @declaration_specifiers.type_qualifiers : []
|
1124
|
+
end
|
1125
|
+
|
1126
|
+
def type_specifiers
|
1127
|
+
@declaration_specifiers ? @declaration_specifiers.type_specifiers : []
|
1128
|
+
end
|
1129
|
+
|
1130
|
+
def explicitly_typed?
|
1131
|
+
@declaration_specifiers && @declaration_specifiers.explicitly_typed?
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
def implicitly_typed?
|
1135
|
+
!explicitly_typed?
|
1136
|
+
end
|
1137
|
+
end
|
1138
|
+
|
1110
1139
|
class Declaration < SyntaxNode
|
1140
|
+
include DeclarationSpecifiersHolder
|
1141
|
+
|
1111
1142
|
def initialize(declaration_specifiers, init_declarators, symbol_table)
|
1112
1143
|
super()
|
1113
1144
|
@declaration_specifiers = declaration_specifiers
|
@@ -1174,8 +1205,7 @@ module C #:nodoc:
|
|
1174
1205
|
return []
|
1175
1206
|
end
|
1176
1207
|
|
1177
|
-
|
1178
|
-
init_declarators.each do |init_declarator|
|
1208
|
+
init_declarators.each_with_object([]) do |init_declarator, result|
|
1179
1209
|
if init_declarator.declarator.function?
|
1180
1210
|
symbol = symbol_table.create_new_symbol(
|
1181
1211
|
ObjectName, init_declarator.declarator.identifier)
|
@@ -1183,51 +1213,51 @@ module C #:nodoc:
|
|
1183
1213
|
init_declarator, symbol))
|
1184
1214
|
end
|
1185
1215
|
end
|
1186
|
-
result
|
1187
1216
|
end
|
1188
1217
|
|
1189
1218
|
def build_variable_declaration(declaration_specifiers, init_declarators,
|
1190
1219
|
symbol_table)
|
1191
1220
|
return [] unless declaration_specifiers
|
1192
1221
|
|
1193
|
-
|
1194
|
-
if declaration_specifiers.storage_class_specifier &&
|
1222
|
+
unless declaration_specifiers.storage_class_specifier &&
|
1195
1223
|
declaration_specifiers.storage_class_specifier.type == :EXTERN
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1224
|
+
return []
|
1225
|
+
end
|
1226
|
+
|
1227
|
+
init_declarators.each_with_object([]) do |init_declarator, result|
|
1228
|
+
if init_declarator.declarator.variable?
|
1229
|
+
declarator = init_declarator.declarator
|
1230
|
+
symbol =
|
1231
|
+
symbol_table.create_new_symbol(ObjectName, declarator.identifier)
|
1232
|
+
result.push(VariableDeclaration.new(declaration_specifiers,
|
1233
|
+
declarator, symbol))
|
1204
1234
|
end
|
1205
1235
|
end
|
1206
|
-
result
|
1207
1236
|
end
|
1208
1237
|
|
1209
1238
|
def build_variable_definition(declaration_specifiers, init_declarators,
|
1210
1239
|
symbol_table)
|
1211
|
-
|
1212
|
-
unless declaration_specifiers &&
|
1240
|
+
if declaration_specifiers &&
|
1213
1241
|
declaration_specifiers.storage_class_specifier &&
|
1214
1242
|
(declaration_specifiers.storage_class_specifier.type == :EXTERN ||
|
1215
1243
|
declaration_specifiers.storage_class_specifier.type == :TYPEDEF)
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1244
|
+
return []
|
1245
|
+
end
|
1246
|
+
|
1247
|
+
init_declarators.each_with_object([]) do |init_declarator, result|
|
1248
|
+
if init_declarator.declarator.variable?
|
1249
|
+
symbol = symbol_table.create_new_symbol(
|
1250
|
+
ObjectName, init_declarator.declarator.identifier)
|
1251
|
+
result.push(VariableDefinition.new(declaration_specifiers,
|
1252
|
+
init_declarator, symbol))
|
1223
1253
|
end
|
1224
1254
|
end
|
1225
|
-
result
|
1226
1255
|
end
|
1227
1256
|
end
|
1228
1257
|
|
1229
1258
|
class FunctionDeclaration < SyntaxNode
|
1230
1259
|
include SymbolicElement
|
1260
|
+
include DeclarationSpecifiersHolder
|
1231
1261
|
include SyntaxNodeCollector
|
1232
1262
|
|
1233
1263
|
def initialize(declaration_specifiers, init_declarator, symbol)
|
@@ -1247,11 +1277,6 @@ module C #:nodoc:
|
|
1247
1277
|
@init_declarator.declarator.identifier
|
1248
1278
|
end
|
1249
1279
|
|
1250
|
-
def storage_class_specifier
|
1251
|
-
@declaration_specifiers ?
|
1252
|
-
@declaration_specifiers.storage_class_specifier : nil
|
1253
|
-
end
|
1254
|
-
|
1255
1280
|
def signature
|
1256
1281
|
FunctionSignature.new(identifier, @type)
|
1257
1282
|
end
|
@@ -1272,6 +1297,7 @@ module C #:nodoc:
|
|
1272
1297
|
|
1273
1298
|
class VariableDeclaration < SyntaxNode
|
1274
1299
|
include SymbolicElement
|
1300
|
+
include DeclarationSpecifiersHolder
|
1275
1301
|
|
1276
1302
|
def initialize(declaration_specifiers, declarator, symbol)
|
1277
1303
|
super()
|
@@ -1290,11 +1316,6 @@ module C #:nodoc:
|
|
1290
1316
|
@declarator.identifier
|
1291
1317
|
end
|
1292
1318
|
|
1293
|
-
def storage_class_specifier
|
1294
|
-
@declaration_specifiers ?
|
1295
|
-
@declaration_specifiers.storage_class_specifier : nil
|
1296
|
-
end
|
1297
|
-
|
1298
1319
|
def location
|
1299
1320
|
identifier.location
|
1300
1321
|
end
|
@@ -1305,33 +1326,35 @@ module C #:nodoc:
|
|
1305
1326
|
end
|
1306
1327
|
end
|
1307
1328
|
|
1308
|
-
class Definition < SyntaxNode
|
1329
|
+
class Definition < SyntaxNode
|
1330
|
+
include DeclarationSpecifiersHolder
|
1331
|
+
|
1332
|
+
def initialize(declaration_specifiers)
|
1333
|
+
@declaration_specifiers = declaration_specifiers
|
1334
|
+
@type = nil
|
1335
|
+
end
|
1336
|
+
|
1337
|
+
attr_reader :declaration_specifiers
|
1338
|
+
attr_accessor :type
|
1339
|
+
end
|
1309
1340
|
|
1310
1341
|
class VariableDefinition < Definition
|
1311
1342
|
include SymbolicElement
|
1312
1343
|
|
1313
1344
|
def initialize(declaration_specifiers, init_declarator, symbol)
|
1314
|
-
super()
|
1315
|
-
|
1345
|
+
super(declaration_specifiers)
|
1346
|
+
|
1316
1347
|
@init_declarator = init_declarator
|
1317
1348
|
@symbol = symbol
|
1318
|
-
@type = nil
|
1319
1349
|
end
|
1320
1350
|
|
1321
|
-
attr_reader :declaration_specifiers
|
1322
1351
|
attr_reader :init_declarator
|
1323
1352
|
attr_reader :symbol
|
1324
|
-
attr_accessor :type
|
1325
1353
|
|
1326
1354
|
def identifier
|
1327
1355
|
@init_declarator.declarator.identifier
|
1328
1356
|
end
|
1329
1357
|
|
1330
|
-
def storage_class_specifier
|
1331
|
-
@declaration_specifiers ?
|
1332
|
-
@declaration_specifiers.storage_class_specifier : nil
|
1333
|
-
end
|
1334
|
-
|
1335
1358
|
def initializer
|
1336
1359
|
@init_declarator.initializer
|
1337
1360
|
end
|
@@ -1358,6 +1381,8 @@ module C #:nodoc:
|
|
1358
1381
|
end
|
1359
1382
|
|
1360
1383
|
class TypedefDeclaration < TypeDeclaration
|
1384
|
+
include DeclarationSpecifiersHolder
|
1385
|
+
|
1361
1386
|
def initialize(declaration_specifiers, init_declarator, symbol)
|
1362
1387
|
super(symbol)
|
1363
1388
|
@declaration_specifiers = declaration_specifiers
|
@@ -1377,14 +1402,6 @@ module C #:nodoc:
|
|
1377
1402
|
@init_declarator.declarator
|
1378
1403
|
end
|
1379
1404
|
|
1380
|
-
def type_qualifiers
|
1381
|
-
@declaration_specifiers.type_qualifiers
|
1382
|
-
end
|
1383
|
-
|
1384
|
-
def type_specifiers
|
1385
|
-
@declaration_specifiers.type_specifiers
|
1386
|
-
end
|
1387
|
-
|
1388
1405
|
def location
|
1389
1406
|
identifier.location
|
1390
1407
|
end
|
@@ -1519,6 +1536,14 @@ module C #:nodoc:
|
|
1519
1536
|
head_location
|
1520
1537
|
end
|
1521
1538
|
|
1539
|
+
def explicitly_typed?
|
1540
|
+
!implicitly_typed?
|
1541
|
+
end
|
1542
|
+
|
1543
|
+
def implicitly_typed?
|
1544
|
+
@type_specifiers.empty?
|
1545
|
+
end
|
1546
|
+
|
1522
1547
|
def inspect(indent = 0)
|
1523
1548
|
" " * indent + short_class_name
|
1524
1549
|
end
|
@@ -1689,14 +1714,12 @@ module C #:nodoc:
|
|
1689
1714
|
|
1690
1715
|
private
|
1691
1716
|
def build_items(specifier_qualifier_list, struct_declarators)
|
1692
|
-
|
1693
|
-
struct_declarators.each do |struct_declarator|
|
1717
|
+
struct_declarators.each_with_object([]) do |struct_declarator, items|
|
1694
1718
|
# FIXME: Must support unnamed bit padding.
|
1695
1719
|
next unless struct_declarator.declarator
|
1696
|
-
|
1697
|
-
|
1720
|
+
items.push(MemberDeclaration.new(specifier_qualifier_list,
|
1721
|
+
struct_declarator))
|
1698
1722
|
end
|
1699
|
-
result
|
1700
1723
|
end
|
1701
1724
|
end
|
1702
1725
|
|
@@ -1818,6 +1841,7 @@ module C #:nodoc:
|
|
1818
1841
|
attr_reader :expression
|
1819
1842
|
attr_reader :symbol
|
1820
1843
|
attr_accessor :value
|
1844
|
+
attr_accessor :type
|
1821
1845
|
|
1822
1846
|
def location
|
1823
1847
|
@identifier.location
|
@@ -2114,6 +2138,8 @@ module C #:nodoc:
|
|
2114
2138
|
end
|
2115
2139
|
|
2116
2140
|
class ParameterDeclaration < SyntaxNode
|
2141
|
+
include DeclarationSpecifiersHolder
|
2142
|
+
|
2117
2143
|
def initialize(declaration_specifiers, declarator)
|
2118
2144
|
super()
|
2119
2145
|
@declaration_specifiers = declaration_specifiers
|
@@ -2749,36 +2775,23 @@ module C #:nodoc:
|
|
2749
2775
|
|
2750
2776
|
def initialize(declaration_specifiers, declarator, parameter_definitions,
|
2751
2777
|
compound_statement, symbol_table)
|
2752
|
-
super()
|
2753
|
-
|
2778
|
+
super(declaration_specifiers)
|
2779
|
+
|
2754
2780
|
@declarator = declarator
|
2755
2781
|
@parameter_definitions = parameter_definitions
|
2756
2782
|
@function_body = compound_statement
|
2757
2783
|
@symbol = symbol_table.create_new_symbol(ObjectName, identifier)
|
2758
|
-
@type = nil
|
2759
2784
|
@type_declaration = build_type_declaration(declaration_specifiers,
|
2760
2785
|
symbol_table)
|
2761
2786
|
build_label_references(compound_statement)
|
2762
2787
|
end
|
2763
2788
|
|
2764
|
-
attr_reader :declaration_specifiers
|
2765
2789
|
attr_reader :declarator
|
2766
2790
|
attr_reader :parameter_definitions
|
2767
2791
|
attr_reader :function_body
|
2768
2792
|
attr_reader :symbol
|
2769
|
-
attr_accessor :type
|
2770
2793
|
attr_reader :type_declaration
|
2771
2794
|
|
2772
|
-
def storage_class_specifier
|
2773
|
-
@declaration_specifiers ?
|
2774
|
-
@declaration_specifiers.storage_class_specifier : nil
|
2775
|
-
end
|
2776
|
-
|
2777
|
-
def function_specifier
|
2778
|
-
@declaration_specifiers ?
|
2779
|
-
@declaration_specifiers.function_specifier : nil
|
2780
|
-
end
|
2781
|
-
|
2782
2795
|
def identifier
|
2783
2796
|
@declarator.identifier
|
2784
2797
|
end
|
@@ -2856,14 +2869,12 @@ module C #:nodoc:
|
|
2856
2869
|
def create_parameters(parameter_names, declarations, symbol_table)
|
2857
2870
|
return [] unless parameter_names
|
2858
2871
|
|
2859
|
-
|
2860
|
-
parameter_names.each do |name|
|
2872
|
+
parameter_names.each_with_object([]) do |name, result|
|
2861
2873
|
variable_definition =
|
2862
2874
|
find_variable_definition(declarations, name, symbol_table)
|
2863
2875
|
result.push(
|
2864
2876
|
variable_definition_to_parameter_definition(variable_definition))
|
2865
2877
|
end
|
2866
|
-
result
|
2867
2878
|
end
|
2868
2879
|
|
2869
2880
|
def find_variable_definition(declarations, name, symbol_table)
|
@@ -2942,15 +2953,12 @@ module C #:nodoc:
|
|
2942
2953
|
|
2943
2954
|
class ParameterDefinition < Definition
|
2944
2955
|
def initialize(declaration_specifiers, declarator)
|
2945
|
-
super()
|
2946
|
-
|
2956
|
+
super(declaration_specifiers)
|
2957
|
+
|
2947
2958
|
@declarator = declarator
|
2948
|
-
@type = nil
|
2949
2959
|
end
|
2950
2960
|
|
2951
|
-
attr_reader :declaration_specifiers
|
2952
2961
|
attr_reader :declarator
|
2953
|
-
attr_accessor :type
|
2954
2962
|
|
2955
2963
|
def identifier
|
2956
2964
|
if @declarator
|
@@ -2964,19 +2972,14 @@ module C #:nodoc:
|
|
2964
2972
|
end
|
2965
2973
|
end
|
2966
2974
|
|
2967
|
-
def storage_class_specifier
|
2968
|
-
@declaration_specifiers ?
|
2969
|
-
@declaration_specifiers.storage_class_specifier : nil
|
2970
|
-
end
|
2971
|
-
|
2972
2975
|
def location
|
2973
2976
|
identifier ? identifier.location : nil
|
2974
2977
|
end
|
2975
2978
|
|
2976
2979
|
def to_variable_definition
|
2977
|
-
PseudoVariableDefinition.new(
|
2980
|
+
PseudoVariableDefinition.new(declaration_specifiers,
|
2978
2981
|
InitDeclarator.new(@declarator, nil),
|
2979
|
-
|
2982
|
+
type)
|
2980
2983
|
end
|
2981
2984
|
|
2982
2985
|
def inspect(indent = 0)
|
@@ -2989,7 +2992,8 @@ module C #:nodoc:
|
|
2989
2992
|
class PseudoVariableDefinition < VariableDefinition
|
2990
2993
|
def initialize(declaration_specifiers, init_declarator, type)
|
2991
2994
|
super(declaration_specifiers, init_declarator, nil)
|
2992
|
-
|
2995
|
+
|
2996
|
+
self.type = type
|
2993
2997
|
end
|
2994
2998
|
|
2995
2999
|
def mark_as_referred_by(token) end
|