adlint 1.10.0 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +197 -4
- data/MANIFEST +17 -0
- data/NEWS +23 -4
- data/etc/mesg.d/en_US/messages.yml +14 -1
- data/etc/mesg.d/ja_JP/messages.yml +14 -1
- data/features/message_detection/W0093.feature +87 -0
- data/features/message_detection/W0687.feature +25 -0
- data/features/message_detection/W0688.feature +63 -0
- data/features/message_detection/W0689.feature +46 -0
- data/features/message_detection/W0690.feature +35 -0
- data/features/message_detection/W0698.feature +3 -2
- data/features/message_detection/W0703.feature +1 -0
- data/features/message_detection/W0723.feature +34 -0
- data/features/message_detection/W0732.feature +158 -0
- data/features/message_detection/W0733.feature +158 -0
- data/features/message_detection/W0734.feature +322 -0
- data/features/message_detection/W0735.feature +322 -0
- data/features/message_detection/W1052.feature +66 -0
- data/features/message_detection/W9001.feature +33 -0
- data/features/message_detection/W9003.feature +131 -0
- data/lib/adlint/c/ctrlexpr.rb +51 -50
- data/lib/adlint/c/domain.rb +237 -223
- data/lib/adlint/c/expr.rb +6 -8
- data/lib/adlint/c/interp.rb +8 -11
- data/lib/adlint/c/message.rb +20 -0
- data/lib/adlint/c/message_shima.rb +63 -0
- data/lib/adlint/c/object.rb +5 -4
- data/lib/adlint/c/operator.rb +99 -0
- data/lib/adlint/c/parser.rb +2 -2
- data/lib/adlint/c/parser.y +2 -2
- data/lib/adlint/c/phase.rb +6 -1
- data/lib/adlint/c/syntax.rb +442 -30
- data/lib/adlint/c/type.rb +449 -363
- data/lib/adlint/c/value.rb +96 -25
- data/lib/adlint/c.rb +1 -0
- data/lib/adlint/prelude.rb +16 -18
- data/lib/adlint/version.rb +2 -2
- data/share/doc/developers_guide_ja.html +11 -5
- data/share/doc/developers_guide_ja.texi +9 -3
- data/share/doc/users_guide_en.html +697 -131
- data/share/doc/users_guide_en.texi +491 -41
- data/share/doc/users_guide_ja.html +709 -139
- data/share/doc/users_guide_ja.texi +499 -45
- data/spec/adlint/c/ctrlexpr_spec.rb +168 -0
- data/spec/adlint/c/domain_spec.rb +835 -0
- data/spec/adlint/c/operator_spec.rb +406 -0
- data/spec/adlint/c/syntax_spec.rb +717 -0
- data/spec/adlint/c/type_spec.rb +55 -30
- metadata +19 -2
data/lib/adlint/c/type.rb
CHANGED
@@ -36,6 +36,7 @@ require "adlint/c/scope"
|
|
36
36
|
require "adlint/c/object"
|
37
37
|
require "adlint/c/conv"
|
38
38
|
require "adlint/c/option"
|
39
|
+
require "adlint/c/operator"
|
39
40
|
|
40
41
|
module AdLint #:nodoc:
|
41
42
|
module C #:nodoc:
|
@@ -123,9 +124,10 @@ module C #:nodoc:
|
|
123
124
|
# <--- EnumType ------------------- Scopeable <<module>>
|
124
125
|
# <--- PointerType |
|
125
126
|
# <--- FloatingType |
|
126
|
-
# <---
|
127
|
-
#
|
128
|
-
#
|
127
|
+
# <--- StandardFloatingType |
|
128
|
+
# <--- FloatType |
|
129
|
+
# <--- DoubleType |
|
130
|
+
# <--- LongDoubleType |
|
129
131
|
# <--- ArrayType |
|
130
132
|
# <--- CompositeDataType -----------------------------+
|
131
133
|
# <--- StructType |
|
@@ -277,6 +279,10 @@ module C #:nodoc:
|
|
277
279
|
subclass_responsibility
|
278
280
|
end
|
279
281
|
|
282
|
+
def standard?
|
283
|
+
subclass_responsibility
|
284
|
+
end
|
285
|
+
|
280
286
|
def undeclared?
|
281
287
|
subclass_responsibility
|
282
288
|
end
|
@@ -740,6 +746,10 @@ module C #:nodoc:
|
|
740
746
|
false
|
741
747
|
end
|
742
748
|
|
749
|
+
def standard?
|
750
|
+
false
|
751
|
+
end
|
752
|
+
|
743
753
|
def undeclared?
|
744
754
|
true
|
745
755
|
end
|
@@ -1264,6 +1274,10 @@ module C #:nodoc:
|
|
1264
1274
|
false
|
1265
1275
|
end
|
1266
1276
|
|
1277
|
+
def standard?
|
1278
|
+
false
|
1279
|
+
end
|
1280
|
+
|
1267
1281
|
def undeclared?
|
1268
1282
|
false
|
1269
1283
|
end
|
@@ -1804,6 +1818,10 @@ module C #:nodoc:
|
|
1804
1818
|
@base_type.void?
|
1805
1819
|
end
|
1806
1820
|
|
1821
|
+
def standard?
|
1822
|
+
@base_type.standard?
|
1823
|
+
end
|
1824
|
+
|
1807
1825
|
def undeclared?
|
1808
1826
|
@base_type.undeclared?
|
1809
1827
|
end
|
@@ -2117,6 +2135,10 @@ module C #:nodoc:
|
|
2117
2135
|
true
|
2118
2136
|
end
|
2119
2137
|
|
2138
|
+
def standard?
|
2139
|
+
true
|
2140
|
+
end
|
2141
|
+
|
2120
2142
|
def undeclared?
|
2121
2143
|
false
|
2122
2144
|
end
|
@@ -2645,6 +2667,10 @@ module C #:nodoc:
|
|
2645
2667
|
false
|
2646
2668
|
end
|
2647
2669
|
|
2670
|
+
def standard?
|
2671
|
+
false
|
2672
|
+
end
|
2673
|
+
|
2648
2674
|
def undeclared?
|
2649
2675
|
false
|
2650
2676
|
end
|
@@ -3186,6 +3212,10 @@ module C #:nodoc:
|
|
3186
3212
|
false
|
3187
3213
|
end
|
3188
3214
|
|
3215
|
+
def standard?
|
3216
|
+
subclass_responsibility
|
3217
|
+
end
|
3218
|
+
|
3189
3219
|
def undeclared?
|
3190
3220
|
false
|
3191
3221
|
end
|
@@ -3284,7 +3314,7 @@ module C #:nodoc:
|
|
3284
3314
|
|
3285
3315
|
def coerce_scalar_value(value)
|
3286
3316
|
value.dup.tap do |val|
|
3287
|
-
val.narrow_domain!(
|
3317
|
+
val.narrow_domain!(Operator::EQ, ScalarValue.of(min_value..max_value))
|
3288
3318
|
end
|
3289
3319
|
end
|
3290
3320
|
|
@@ -3548,6 +3578,10 @@ module C #:nodoc:
|
|
3548
3578
|
subclass_responsibility
|
3549
3579
|
end
|
3550
3580
|
|
3581
|
+
def standard?
|
3582
|
+
subclass_responsibility
|
3583
|
+
end
|
3584
|
+
|
3551
3585
|
def bitfield?
|
3552
3586
|
subclass_responsibility
|
3553
3587
|
end
|
@@ -3666,6 +3700,10 @@ module C #:nodoc:
|
|
3666
3700
|
false
|
3667
3701
|
end
|
3668
3702
|
|
3703
|
+
def standard?
|
3704
|
+
true
|
3705
|
+
end
|
3706
|
+
|
3669
3707
|
def bitfield?
|
3670
3708
|
false
|
3671
3709
|
end
|
@@ -4896,43 +4934,24 @@ module C #:nodoc:
|
|
4896
4934
|
end
|
4897
4935
|
end
|
4898
4936
|
|
4899
|
-
class
|
4900
|
-
def initialize(type_table,
|
4901
|
-
super(type_table,
|
4902
|
-
|
4903
|
-
|
4904
|
-
|
4905
|
-
subclass_responsibility
|
4906
|
-
end
|
4937
|
+
class BitfieldType < IntegerType
|
4938
|
+
def initialize(type_table, base_type, field_width)
|
4939
|
+
super(type_table,
|
4940
|
+
"#{base_type.real_type.name}:#{field_width}",
|
4941
|
+
field_width, base_type.bit_alignment,
|
4942
|
+
base_type.signed?, base_type.explicitly_signed?)
|
4907
4943
|
|
4908
|
-
|
4909
|
-
name
|
4944
|
+
@base_type = base_type
|
4910
4945
|
end
|
4911
4946
|
|
4912
|
-
|
4913
|
-
name
|
4914
|
-
end
|
4947
|
+
attr_reader :base_type
|
4915
4948
|
|
4916
|
-
def
|
4917
|
-
|
4949
|
+
def id
|
4950
|
+
@id ||= BitfieldTypeId.new(@base_type, bit_size)
|
4918
4951
|
end
|
4919
4952
|
|
4920
4953
|
def incomplete?
|
4921
|
-
|
4922
|
-
end
|
4923
|
-
|
4924
|
-
def compatible?(to_type)
|
4925
|
-
type.floating? &&
|
4926
|
-
to_type.min_value <= self.min_value &&
|
4927
|
-
self.max_value <= to_type.max_value
|
4928
|
-
end
|
4929
|
-
|
4930
|
-
def integer?
|
4931
|
-
false
|
4932
|
-
end
|
4933
|
-
|
4934
|
-
def floating?
|
4935
|
-
true
|
4954
|
+
@base_type.incomplete?
|
4936
4955
|
end
|
4937
4956
|
|
4938
4957
|
def pointer?
|
@@ -4943,44 +4962,63 @@ module C #:nodoc:
|
|
4943
4962
|
false
|
4944
4963
|
end
|
4945
4964
|
|
4946
|
-
def
|
4965
|
+
def standard?
|
4947
4966
|
false
|
4948
4967
|
end
|
4949
4968
|
|
4950
|
-
def
|
4951
|
-
true
|
4952
|
-
end
|
4953
|
-
|
4954
|
-
def explicitly_signed?
|
4969
|
+
def bitfield?
|
4955
4970
|
true
|
4956
4971
|
end
|
4957
4972
|
|
4958
|
-
def
|
4959
|
-
|
4973
|
+
def undeclared?
|
4974
|
+
@base_type.undeclared?
|
4960
4975
|
end
|
4961
4976
|
|
4962
|
-
def
|
4963
|
-
|
4977
|
+
def unresolved?
|
4978
|
+
@base_type.unresolved?
|
4964
4979
|
end
|
4965
4980
|
|
4966
|
-
def
|
4967
|
-
|
4981
|
+
def enumerators
|
4982
|
+
[]
|
4968
4983
|
end
|
4969
4984
|
|
4970
4985
|
def integer_conversion_rank
|
4971
|
-
|
4986
|
+
-1
|
4972
4987
|
end
|
4973
4988
|
|
4974
4989
|
def integer_promoted_type
|
4975
|
-
|
4976
|
-
|
4977
|
-
|
4978
|
-
|
4979
|
-
|
4990
|
+
# TODO: Should support the C99 _Bool type.
|
4991
|
+
# NOTE: The ISO C99 standard saids;
|
4992
|
+
#
|
4993
|
+
# 6.3.1 Arithmetic operands
|
4994
|
+
# 6.3.1.1 Boolean, characters, and integers
|
4995
|
+
#
|
4996
|
+
# 2 The following may be used in an expression wherever an int or
|
4997
|
+
# unsigned int may be used:
|
4998
|
+
#
|
4999
|
+
# -- An object or expression with an integer type whose integer
|
5000
|
+
# conversion rank is less than or equal to the rank of int and
|
5001
|
+
# unsigned int.
|
5002
|
+
# -- A bit-field of type _Bool, int, signed int, or unsigned int.
|
5003
|
+
#
|
5004
|
+
# If an int can represent all values of the original type, the value is
|
5005
|
+
# converted to an int; otherwise, it is converted to an unsigned int.
|
5006
|
+
# These are called the integer promotions. All other types are
|
5007
|
+
# unchanged by the integer promotions.
|
5008
|
+
if self.undeclared? || self.unresolved?
|
5009
|
+
self
|
5010
|
+
else
|
5011
|
+
if @base_type.same_as?(int_type) ||
|
5012
|
+
@base_type.same_as?(unsigned_int_type)
|
5013
|
+
self.compatible?(int_type) ? int_type : unsigned_int_type
|
5014
|
+
else
|
5015
|
+
self
|
5016
|
+
end
|
5017
|
+
end
|
4980
5018
|
end
|
4981
5019
|
|
4982
5020
|
def arithmetic_type_with(type)
|
4983
|
-
|
5021
|
+
type._arithmetic_type_with_bitfield(self)
|
4984
5022
|
end
|
4985
5023
|
|
4986
5024
|
def corresponding_signed_type
|
@@ -4990,348 +5028,127 @@ module C #:nodoc:
|
|
4990
5028
|
def corresponding_unsigned_type
|
4991
5029
|
self # NOTREACHED
|
4992
5030
|
end
|
5031
|
+
end
|
4993
5032
|
|
4994
|
-
|
4995
|
-
def
|
4996
|
-
|
5033
|
+
class BitfieldTypeId < TypeId
|
5034
|
+
def initialize(base_type, field_width)
|
5035
|
+
super(create_value(base_type, field_width))
|
4997
5036
|
end
|
4998
5037
|
|
4999
|
-
|
5000
|
-
|
5038
|
+
private
|
5039
|
+
def create_value(base_type, field_width)
|
5040
|
+
"#{base_type.real_type.name.split(" ").sort.join(" ")}:#{field_width}"
|
5001
5041
|
end
|
5002
5042
|
end
|
5003
5043
|
|
5004
|
-
|
5044
|
+
module Scopeable
|
5045
|
+
attr_accessor :scope
|
5046
|
+
end
|
5047
|
+
|
5048
|
+
class EnumType < IntegerType
|
5049
|
+
include Scopeable
|
5005
5050
|
include StandardTypeAccessor
|
5006
5051
|
|
5007
|
-
def initialize(type_table)
|
5008
|
-
super(type_table,
|
5052
|
+
def initialize(type_table, enum_type_declaration)
|
5053
|
+
super(type_table, enum_type_declaration.identifier.value,
|
5054
|
+
int_size, int_alignment, true, true, [enum_type_declaration])
|
5055
|
+
|
5056
|
+
@image = enum_type_declaration.enum_specifier.to_s
|
5057
|
+
@location = enum_type_declaration.location
|
5009
5058
|
end
|
5010
5059
|
|
5060
|
+
attr_accessor :image
|
5061
|
+
attr_accessor :location
|
5062
|
+
|
5011
5063
|
def id
|
5012
|
-
@id ||=
|
5064
|
+
@id ||= EnumTypeId.new(name)
|
5013
5065
|
end
|
5014
5066
|
|
5015
|
-
def
|
5016
|
-
|
5017
|
-
#
|
5018
|
-
# 6.5.2.2 Function calls
|
5019
|
-
#
|
5020
|
-
# 6 If the expression that denotes the called function has a type that
|
5021
|
-
# does not include a prototype, the integer promotions are performed on
|
5022
|
-
# each argument, and arguments that have type float are promoted to
|
5023
|
-
# double. These are called the default argument promotions. If the
|
5024
|
-
# number of arguments does not equal the number of parameters, the
|
5025
|
-
# behavior is undefined. If the function is defined with a type that
|
5026
|
-
# includes a prototype, and either the prototype ends with an ellipsis
|
5027
|
-
# (, ...) or the types of the arguments after promotion are not
|
5028
|
-
# compatible with the types of the parameters, the behavior is
|
5029
|
-
# undefined. If the function is defined with a type that does not
|
5030
|
-
# include a prototype, and the types of the arguments after promotion
|
5031
|
-
# are not compatible with those of the parameters after promotion, the
|
5032
|
-
# behavior is undefined, except for the following cases:
|
5033
|
-
#
|
5034
|
-
# -- one promoted type is a signed integer type, the other promoted
|
5035
|
-
# type is the corresponding unsigned integer type, and the value
|
5036
|
-
# is representable in both types;
|
5037
|
-
# -- both types are pointers to qualified or unqualified versions of
|
5038
|
-
# a character type or void.
|
5039
|
-
double_type
|
5067
|
+
def incomplete?
|
5068
|
+
declarations.all? { |decl| decl.enumerators.nil? }
|
5040
5069
|
end
|
5041
5070
|
|
5042
|
-
def
|
5043
|
-
|
5071
|
+
def pointer?
|
5072
|
+
false
|
5044
5073
|
end
|
5045
5074
|
|
5046
|
-
|
5047
|
-
|
5048
|
-
# TODO: Bit size of the fraction part of `float' should be configurable.
|
5049
|
-
23
|
5075
|
+
def enum?
|
5076
|
+
true
|
5050
5077
|
end
|
5051
5078
|
|
5052
|
-
def
|
5053
|
-
|
5054
|
-
8
|
5079
|
+
def standard?
|
5080
|
+
false
|
5055
5081
|
end
|
5056
|
-
end
|
5057
5082
|
|
5058
|
-
|
5059
|
-
|
5060
|
-
super("float")
|
5083
|
+
def bitfield?
|
5084
|
+
false
|
5061
5085
|
end
|
5062
|
-
end
|
5063
5086
|
|
5064
|
-
|
5065
|
-
|
5087
|
+
def brief_image
|
5088
|
+
"enum #{name}"
|
5089
|
+
end
|
5066
5090
|
|
5067
|
-
def
|
5068
|
-
|
5091
|
+
def enumerators
|
5092
|
+
declarations.map { |decl| decl.enumerators }.compact.flatten.uniq
|
5069
5093
|
end
|
5070
5094
|
|
5071
|
-
def
|
5072
|
-
|
5095
|
+
def integer_conversion_rank
|
5096
|
+
# NOTE: The ISO C99 standard saids;
|
5097
|
+
#
|
5098
|
+
# 6.3.1 Arithmetic operands
|
5099
|
+
# 6.3.1.1 Boolean, characters, and integers
|
5100
|
+
#
|
5101
|
+
# 1 Every integer type has an integer conversion rank defined as follows:
|
5102
|
+
#
|
5103
|
+
# -- No two signed integer types shall have the same rank, even if
|
5104
|
+
# they have the same representation.
|
5105
|
+
# -- The rank of a signed integer type shall be greater than the rank
|
5106
|
+
# of any signed integer type with less precision.
|
5107
|
+
# -- The rank of long long int shall be greater than the rank of long
|
5108
|
+
# int, which shall be greater than the rank of int, which shall be
|
5109
|
+
# greater than the rank of short int, which shall be greater than
|
5110
|
+
# the rank of signed char.
|
5111
|
+
# -- The rank of any unsigned integer type shall equal the rank of
|
5112
|
+
# the corresponding signed integer type, if any.
|
5113
|
+
# -- The rank of any standard integer type shall be greater than the
|
5114
|
+
# rank of any extended integer type with the same width.
|
5115
|
+
# -- The rank of char shall equal the rank of signed char and
|
5116
|
+
# unsigned char.
|
5117
|
+
# -- The rank of _Bool shall be less than the rank of all other
|
5118
|
+
# standard integer types.
|
5119
|
+
# -- The rank of any enumerated type shall equal the rank of the
|
5120
|
+
# compatible integer type.
|
5121
|
+
# -- The rank of any extended signed integer type relative to another
|
5122
|
+
# extended signed integer type with the same precision is
|
5123
|
+
# implementation-defined, but still subject to the other rules for
|
5124
|
+
# determining the integer conversion rank.
|
5125
|
+
# -- For all integer types T1, T2, and T3, if T1 has greater rank
|
5126
|
+
# than T2 and T2 has greater rank than T3, then T1 has greater
|
5127
|
+
# rank than T3.
|
5128
|
+
#
|
5129
|
+
# NOTE: The integer conversion rank of any enumerated type is equal to
|
5130
|
+
# the rank of int.
|
5131
|
+
int_type.integer_conversion_rank
|
5073
5132
|
end
|
5074
5133
|
|
5075
|
-
def
|
5134
|
+
def integer_promoted_type
|
5135
|
+
# NOTE: Any enumerated type should be treated as `int'.
|
5136
|
+
# But AdLint internally treats enumerated type as itself, and omits
|
5137
|
+
# integer-promotion of any enumerated type in order not to
|
5138
|
+
# over-warn about enum-enum expressions like below;
|
5139
|
+
#
|
5140
|
+
# static void foo(enum Color c)
|
5141
|
+
# {
|
5142
|
+
# if (c == RED) { /* No usual-arithmetic-conversion of
|
5143
|
+
# enumerated types and no W9003 warning */
|
5144
|
+
# ...
|
5145
|
+
# }
|
5146
|
+
# }
|
5076
5147
|
self
|
5077
5148
|
end
|
5078
5149
|
|
5079
5150
|
def arithmetic_type_with(type)
|
5080
|
-
type.
|
5081
|
-
end
|
5082
|
-
|
5083
|
-
private
|
5084
|
-
def fraction_bit_size
|
5085
|
-
# TODO: Bit size of the fraction part of `double' should be configurable.
|
5086
|
-
52
|
5087
|
-
end
|
5088
|
-
|
5089
|
-
def exponent_bit_size
|
5090
|
-
# TODO: Bit size of the exponent part of `double' should be configurable.
|
5091
|
-
11
|
5092
|
-
end
|
5093
|
-
end
|
5094
|
-
|
5095
|
-
class DoubleTypeId < StandardTypeId
|
5096
|
-
def initialize
|
5097
|
-
super("double")
|
5098
|
-
end
|
5099
|
-
end
|
5100
|
-
|
5101
|
-
class LongDoubleType < FloatingType
|
5102
|
-
include StandardTypeAccessor
|
5103
|
-
|
5104
|
-
def initialize(type_table)
|
5105
|
-
super(type_table, "long double", long_double_size, long_double_alignment)
|
5106
|
-
end
|
5107
|
-
|
5108
|
-
def id
|
5109
|
-
@id ||= LongDoubleTypeId.new
|
5110
|
-
end
|
5111
|
-
|
5112
|
-
def argument_promoted_type
|
5113
|
-
self
|
5114
|
-
end
|
5115
|
-
|
5116
|
-
def arithmetic_type_with(type)
|
5117
|
-
type._arithmetic_type_with_long_double(self)
|
5118
|
-
end
|
5119
|
-
|
5120
|
-
private
|
5121
|
-
def fraction_bit_size
|
5122
|
-
# TODO: Bit size of the fraction part of `long double' should be
|
5123
|
-
# configurable.
|
5124
|
-
52
|
5125
|
-
end
|
5126
|
-
|
5127
|
-
def exponent_bit_size
|
5128
|
-
# TODO: Bit size of the exponent part of `long double' should be
|
5129
|
-
# configurable.
|
5130
|
-
11
|
5131
|
-
end
|
5132
|
-
end
|
5133
|
-
|
5134
|
-
class LongDoubleTypeId < StandardTypeId
|
5135
|
-
def initialize
|
5136
|
-
super("long double")
|
5137
|
-
end
|
5138
|
-
end
|
5139
|
-
|
5140
|
-
class BitfieldType < IntegerType
|
5141
|
-
def initialize(type_table, base_type, field_width)
|
5142
|
-
super(type_table,
|
5143
|
-
"#{base_type.real_type.name}:#{field_width}",
|
5144
|
-
field_width, base_type.bit_alignment,
|
5145
|
-
base_type.signed?, base_type.explicitly_signed?)
|
5146
|
-
|
5147
|
-
@base_type = base_type
|
5148
|
-
end
|
5149
|
-
|
5150
|
-
attr_reader :base_type
|
5151
|
-
|
5152
|
-
def id
|
5153
|
-
@id ||= BitfieldTypeId.new(@base_type, bit_size)
|
5154
|
-
end
|
5155
|
-
|
5156
|
-
def incomplete?
|
5157
|
-
@base_type.incomplete?
|
5158
|
-
end
|
5159
|
-
|
5160
|
-
def pointer?
|
5161
|
-
false
|
5162
|
-
end
|
5163
|
-
|
5164
|
-
def enum?
|
5165
|
-
false
|
5166
|
-
end
|
5167
|
-
|
5168
|
-
def bitfield?
|
5169
|
-
true
|
5170
|
-
end
|
5171
|
-
|
5172
|
-
def undeclared?
|
5173
|
-
@base_type.undeclared?
|
5174
|
-
end
|
5175
|
-
|
5176
|
-
def unresolved?
|
5177
|
-
@base_type.unresolved?
|
5178
|
-
end
|
5179
|
-
|
5180
|
-
def enumerators
|
5181
|
-
[]
|
5182
|
-
end
|
5183
|
-
|
5184
|
-
def integer_conversion_rank
|
5185
|
-
-1
|
5186
|
-
end
|
5187
|
-
|
5188
|
-
def integer_promoted_type
|
5189
|
-
# TODO: Should support the C99 _Bool type.
|
5190
|
-
# NOTE: The ISO C99 standard saids;
|
5191
|
-
#
|
5192
|
-
# 6.3.1 Arithmetic operands
|
5193
|
-
# 6.3.1.1 Boolean, characters, and integers
|
5194
|
-
#
|
5195
|
-
# 2 The following may be used in an expression wherever an int or
|
5196
|
-
# unsigned int may be used:
|
5197
|
-
#
|
5198
|
-
# -- An object or expression with an integer type whose integer
|
5199
|
-
# conversion rank is less than or equal to the rank of int and
|
5200
|
-
# unsigned int.
|
5201
|
-
# -- A bit-field of type _Bool, int, signed int, or unsigned int.
|
5202
|
-
#
|
5203
|
-
# If an int can represent all values of the original type, the value is
|
5204
|
-
# converted to an int; otherwise, it is converted to an unsigned int.
|
5205
|
-
# These are called the integer promotions. All other types are
|
5206
|
-
# unchanged by the integer promotions.
|
5207
|
-
if self.undeclared? || self.unresolved?
|
5208
|
-
self
|
5209
|
-
else
|
5210
|
-
if @base_type.same_as?(int_type) ||
|
5211
|
-
@base_type.same_as?(unsigned_int_type)
|
5212
|
-
self.compatible?(int_type) ? int_type : unsigned_int_type
|
5213
|
-
else
|
5214
|
-
self
|
5215
|
-
end
|
5216
|
-
end
|
5217
|
-
end
|
5218
|
-
|
5219
|
-
def arithmetic_type_with(type)
|
5220
|
-
type._arithmetic_type_with_bitfield(self)
|
5221
|
-
end
|
5222
|
-
|
5223
|
-
def corresponding_signed_type
|
5224
|
-
self # NOTREACHED
|
5225
|
-
end
|
5226
|
-
|
5227
|
-
def corresponding_unsigned_type
|
5228
|
-
self # NOTREACHED
|
5229
|
-
end
|
5230
|
-
end
|
5231
|
-
|
5232
|
-
class BitfieldTypeId < TypeId
|
5233
|
-
def initialize(base_type, field_width)
|
5234
|
-
super(create_value(base_type, field_width))
|
5235
|
-
end
|
5236
|
-
|
5237
|
-
private
|
5238
|
-
def create_value(base_type, field_width)
|
5239
|
-
"#{base_type.real_type.name.split(" ").sort.join(" ")}:#{field_width}"
|
5240
|
-
end
|
5241
|
-
end
|
5242
|
-
|
5243
|
-
module Scopeable
|
5244
|
-
attr_accessor :scope
|
5245
|
-
end
|
5246
|
-
|
5247
|
-
class EnumType < IntegerType
|
5248
|
-
include Scopeable
|
5249
|
-
include StandardTypeAccessor
|
5250
|
-
|
5251
|
-
def initialize(type_table, enum_type_declaration)
|
5252
|
-
super(type_table, enum_type_declaration.identifier.value,
|
5253
|
-
int_size, int_alignment, true, true, [enum_type_declaration])
|
5254
|
-
|
5255
|
-
@image = enum_type_declaration.enum_specifier.to_s
|
5256
|
-
@location = enum_type_declaration.location
|
5257
|
-
end
|
5258
|
-
|
5259
|
-
attr_accessor :image
|
5260
|
-
attr_accessor :location
|
5261
|
-
|
5262
|
-
def id
|
5263
|
-
@id ||= EnumTypeId.new(name)
|
5264
|
-
end
|
5265
|
-
|
5266
|
-
def incomplete?
|
5267
|
-
declarations.all? { |decl| decl.enumerators.nil? }
|
5268
|
-
end
|
5269
|
-
|
5270
|
-
def pointer?
|
5271
|
-
false
|
5272
|
-
end
|
5273
|
-
|
5274
|
-
def enum?
|
5275
|
-
true
|
5276
|
-
end
|
5277
|
-
|
5278
|
-
def bitfield?
|
5279
|
-
false
|
5280
|
-
end
|
5281
|
-
|
5282
|
-
def brief_image
|
5283
|
-
"enum #{name}"
|
5284
|
-
end
|
5285
|
-
|
5286
|
-
def enumerators
|
5287
|
-
declarations.map { |decl| decl.enumerators }.compact.flatten.uniq
|
5288
|
-
end
|
5289
|
-
|
5290
|
-
def integer_conversion_rank
|
5291
|
-
# NOTE: The ISO C99 standard saids;
|
5292
|
-
#
|
5293
|
-
# 6.3.1 Arithmetic operands
|
5294
|
-
# 6.3.1.1 Boolean, characters, and integers
|
5295
|
-
#
|
5296
|
-
# 1 Every integer type has an integer conversion rank defined as follows:
|
5297
|
-
#
|
5298
|
-
# -- No two signed integer types shall have the same rank, even if
|
5299
|
-
# they have the same representation.
|
5300
|
-
# -- The rank of a signed integer type shall be greater than the rank
|
5301
|
-
# of any signed integer type with less precision.
|
5302
|
-
# -- The rank of long long int shall be greater than the rank of long
|
5303
|
-
# int, which shall be greater than the rank of int, which shall be
|
5304
|
-
# greater than the rank of short int, which shall be greater than
|
5305
|
-
# the rank of signed char.
|
5306
|
-
# -- The rank of any unsigned integer type shall equal the rank of
|
5307
|
-
# the corresponding signed integer type, if any.
|
5308
|
-
# -- The rank of any standard integer type shall be greater than the
|
5309
|
-
# rank of any extended integer type with the same width.
|
5310
|
-
# -- The rank of char shall equal the rank of signed char and
|
5311
|
-
# unsigned char.
|
5312
|
-
# -- The rank of _Bool shall be less than the rank of all other
|
5313
|
-
# standard integer types.
|
5314
|
-
# -- The rank of any enumerated type shall equal the rank of the
|
5315
|
-
# compatible integer type.
|
5316
|
-
# -- The rank of any extended signed integer type relative to another
|
5317
|
-
# extended signed integer type with the same precision is
|
5318
|
-
# implementation-defined, but still subject to the other rules for
|
5319
|
-
# determining the integer conversion rank.
|
5320
|
-
# -- For all integer types T1, T2, and T3, if T1 has greater rank
|
5321
|
-
# than T2 and T2 has greater rank than T3, then T1 has greater
|
5322
|
-
# rank than T3.
|
5323
|
-
#
|
5324
|
-
# NOTE: The integer conversion rank of any enumerated type is equal to
|
5325
|
-
# the rank of int.
|
5326
|
-
int_type.integer_conversion_rank
|
5327
|
-
end
|
5328
|
-
|
5329
|
-
def integer_promoted_type
|
5330
|
-
int_type
|
5331
|
-
end
|
5332
|
-
|
5333
|
-
def arithmetic_type_with(type)
|
5334
|
-
type._arithmetic_type_with_enum(self)
|
5151
|
+
type._arithmetic_type_with_enum(self)
|
5335
5152
|
end
|
5336
5153
|
|
5337
5154
|
def corresponding_signed_type
|
@@ -5409,6 +5226,10 @@ module C #:nodoc:
|
|
5409
5226
|
false
|
5410
5227
|
end
|
5411
5228
|
|
5229
|
+
def standard?
|
5230
|
+
false
|
5231
|
+
end
|
5232
|
+
|
5412
5233
|
def undeclared?
|
5413
5234
|
@base_type.undeclared?
|
5414
5235
|
end
|
@@ -5518,6 +5339,253 @@ module C #:nodoc:
|
|
5518
5339
|
end
|
5519
5340
|
end
|
5520
5341
|
|
5342
|
+
class FloatingType < ScalarDataType
|
5343
|
+
def initialize(type_table, name, bit_size, bit_alignment)
|
5344
|
+
super(type_table, name, bit_size, bit_alignment)
|
5345
|
+
end
|
5346
|
+
|
5347
|
+
def id
|
5348
|
+
subclass_responsibility
|
5349
|
+
end
|
5350
|
+
|
5351
|
+
def image
|
5352
|
+
name
|
5353
|
+
end
|
5354
|
+
|
5355
|
+
def brief_image
|
5356
|
+
name
|
5357
|
+
end
|
5358
|
+
|
5359
|
+
def location
|
5360
|
+
nil
|
5361
|
+
end
|
5362
|
+
|
5363
|
+
def incomplete?
|
5364
|
+
false
|
5365
|
+
end
|
5366
|
+
|
5367
|
+
def compatible?(to_type)
|
5368
|
+
type.floating? &&
|
5369
|
+
to_type.min_value <= self.min_value &&
|
5370
|
+
self.max_value <= to_type.max_value
|
5371
|
+
end
|
5372
|
+
|
5373
|
+
def integer?
|
5374
|
+
false
|
5375
|
+
end
|
5376
|
+
|
5377
|
+
def floating?
|
5378
|
+
true
|
5379
|
+
end
|
5380
|
+
|
5381
|
+
def pointer?
|
5382
|
+
false
|
5383
|
+
end
|
5384
|
+
|
5385
|
+
def enum?
|
5386
|
+
false
|
5387
|
+
end
|
5388
|
+
|
5389
|
+
def bitfield?
|
5390
|
+
false
|
5391
|
+
end
|
5392
|
+
|
5393
|
+
def signed?
|
5394
|
+
true
|
5395
|
+
end
|
5396
|
+
|
5397
|
+
def explicitly_signed?
|
5398
|
+
true
|
5399
|
+
end
|
5400
|
+
|
5401
|
+
def enumerators
|
5402
|
+
[]
|
5403
|
+
end
|
5404
|
+
|
5405
|
+
def min_value
|
5406
|
+
(-2**fraction_bit_size * 10**(exponent_bit_size - 1)).to_f
|
5407
|
+
end
|
5408
|
+
|
5409
|
+
def max_value
|
5410
|
+
(2**fraction_bit_size * 10**(exponent_bit_size - 1)).to_f
|
5411
|
+
end
|
5412
|
+
|
5413
|
+
def integer_conversion_rank
|
5414
|
+
0 # NOTREACHED
|
5415
|
+
end
|
5416
|
+
|
5417
|
+
def integer_promoted_type
|
5418
|
+
self # NOTREACHED
|
5419
|
+
end
|
5420
|
+
|
5421
|
+
def argument_promoted_type
|
5422
|
+
subclass_responsibility
|
5423
|
+
end
|
5424
|
+
|
5425
|
+
def arithmetic_type_with(type)
|
5426
|
+
subclass_responsibility
|
5427
|
+
end
|
5428
|
+
|
5429
|
+
def corresponding_signed_type
|
5430
|
+
self # NOTREACHED
|
5431
|
+
end
|
5432
|
+
|
5433
|
+
def corresponding_unsigned_type
|
5434
|
+
self # NOTREACHED
|
5435
|
+
end
|
5436
|
+
|
5437
|
+
private
|
5438
|
+
def fraction_bit_size
|
5439
|
+
subclass_responsibility
|
5440
|
+
end
|
5441
|
+
|
5442
|
+
def exponent_bit_size
|
5443
|
+
subclass_responsibility
|
5444
|
+
end
|
5445
|
+
end
|
5446
|
+
|
5447
|
+
class StandardFloatingType < FloatingType
|
5448
|
+
def standard?
|
5449
|
+
true
|
5450
|
+
end
|
5451
|
+
end
|
5452
|
+
|
5453
|
+
class FloatType < StandardFloatingType
|
5454
|
+
include StandardTypeAccessor
|
5455
|
+
|
5456
|
+
def initialize(type_table)
|
5457
|
+
super(type_table, "float", float_size, float_alignment)
|
5458
|
+
end
|
5459
|
+
|
5460
|
+
def id
|
5461
|
+
@id ||= FloatTypeId.new
|
5462
|
+
end
|
5463
|
+
|
5464
|
+
def argument_promoted_type
|
5465
|
+
# NOTE: The ISO C99 standard saids;
|
5466
|
+
#
|
5467
|
+
# 6.5.2.2 Function calls
|
5468
|
+
#
|
5469
|
+
# 6 If the expression that denotes the called function has a type that
|
5470
|
+
# does not include a prototype, the integer promotions are performed on
|
5471
|
+
# each argument, and arguments that have type float are promoted to
|
5472
|
+
# double. These are called the default argument promotions. If the
|
5473
|
+
# number of arguments does not equal the number of parameters, the
|
5474
|
+
# behavior is undefined. If the function is defined with a type that
|
5475
|
+
# includes a prototype, and either the prototype ends with an ellipsis
|
5476
|
+
# (, ...) or the types of the arguments after promotion are not
|
5477
|
+
# compatible with the types of the parameters, the behavior is
|
5478
|
+
# undefined. If the function is defined with a type that does not
|
5479
|
+
# include a prototype, and the types of the arguments after promotion
|
5480
|
+
# are not compatible with those of the parameters after promotion, the
|
5481
|
+
# behavior is undefined, except for the following cases:
|
5482
|
+
#
|
5483
|
+
# -- one promoted type is a signed integer type, the other promoted
|
5484
|
+
# type is the corresponding unsigned integer type, and the value
|
5485
|
+
# is representable in both types;
|
5486
|
+
# -- both types are pointers to qualified or unqualified versions of
|
5487
|
+
# a character type or void.
|
5488
|
+
double_type
|
5489
|
+
end
|
5490
|
+
|
5491
|
+
def arithmetic_type_with(type)
|
5492
|
+
type._arithmetic_type_with_float(self)
|
5493
|
+
end
|
5494
|
+
|
5495
|
+
private
|
5496
|
+
def fraction_bit_size
|
5497
|
+
# TODO: Bit size of the fraction part of `float' should be configurable.
|
5498
|
+
23
|
5499
|
+
end
|
5500
|
+
|
5501
|
+
def exponent_bit_size
|
5502
|
+
# TODO: Bit size of the exponent part of `float' should be configurable.
|
5503
|
+
8
|
5504
|
+
end
|
5505
|
+
end
|
5506
|
+
|
5507
|
+
class FloatTypeId < StandardTypeId
|
5508
|
+
def initialize
|
5509
|
+
super("float")
|
5510
|
+
end
|
5511
|
+
end
|
5512
|
+
|
5513
|
+
class DoubleType < StandardFloatingType
|
5514
|
+
include StandardTypeAccessor
|
5515
|
+
|
5516
|
+
def initialize(type_table)
|
5517
|
+
super(type_table, "double", double_size, double_alignment)
|
5518
|
+
end
|
5519
|
+
|
5520
|
+
def id
|
5521
|
+
@id ||= DoubleTypeId.new
|
5522
|
+
end
|
5523
|
+
|
5524
|
+
def argument_promoted_type
|
5525
|
+
self
|
5526
|
+
end
|
5527
|
+
|
5528
|
+
def arithmetic_type_with(type)
|
5529
|
+
type._arithmetic_type_with_double(self)
|
5530
|
+
end
|
5531
|
+
|
5532
|
+
private
|
5533
|
+
def fraction_bit_size
|
5534
|
+
# TODO: Bit size of the fraction part of `double' should be configurable.
|
5535
|
+
52
|
5536
|
+
end
|
5537
|
+
|
5538
|
+
def exponent_bit_size
|
5539
|
+
# TODO: Bit size of the exponent part of `double' should be configurable.
|
5540
|
+
11
|
5541
|
+
end
|
5542
|
+
end
|
5543
|
+
|
5544
|
+
class DoubleTypeId < StandardTypeId
|
5545
|
+
def initialize
|
5546
|
+
super("double")
|
5547
|
+
end
|
5548
|
+
end
|
5549
|
+
|
5550
|
+
class LongDoubleType < StandardFloatingType
|
5551
|
+
include StandardTypeAccessor
|
5552
|
+
|
5553
|
+
def initialize(type_table)
|
5554
|
+
super(type_table, "long double", long_double_size, long_double_alignment)
|
5555
|
+
end
|
5556
|
+
|
5557
|
+
def id
|
5558
|
+
@id ||= LongDoubleTypeId.new
|
5559
|
+
end
|
5560
|
+
|
5561
|
+
def argument_promoted_type
|
5562
|
+
self
|
5563
|
+
end
|
5564
|
+
|
5565
|
+
def arithmetic_type_with(type)
|
5566
|
+
type._arithmetic_type_with_long_double(self)
|
5567
|
+
end
|
5568
|
+
|
5569
|
+
private
|
5570
|
+
def fraction_bit_size
|
5571
|
+
# TODO: Bit size of the fraction part of `long double' should be
|
5572
|
+
# configurable.
|
5573
|
+
52
|
5574
|
+
end
|
5575
|
+
|
5576
|
+
def exponent_bit_size
|
5577
|
+
# TODO: Bit size of the exponent part of `long double' should be
|
5578
|
+
# configurable.
|
5579
|
+
11
|
5580
|
+
end
|
5581
|
+
end
|
5582
|
+
|
5583
|
+
class LongDoubleTypeId < StandardTypeId
|
5584
|
+
def initialize
|
5585
|
+
super("long double")
|
5586
|
+
end
|
5587
|
+
end
|
5588
|
+
|
5521
5589
|
class ArrayType < Type
|
5522
5590
|
# NOTE: To avoid huge array allocation in interpreting phase.
|
5523
5591
|
MAX_LENGTH = 256
|
@@ -5677,6 +5745,10 @@ module C #:nodoc:
|
|
5677
5745
|
false
|
5678
5746
|
end
|
5679
5747
|
|
5748
|
+
def standard?
|
5749
|
+
false
|
5750
|
+
end
|
5751
|
+
|
5680
5752
|
def undeclared?
|
5681
5753
|
@base_type.undeclared?
|
5682
5754
|
end
|
@@ -6237,6 +6309,10 @@ module C #:nodoc:
|
|
6237
6309
|
false
|
6238
6310
|
end
|
6239
6311
|
|
6312
|
+
def standard?
|
6313
|
+
false
|
6314
|
+
end
|
6315
|
+
|
6240
6316
|
def undeclared?
|
6241
6317
|
@members.any? { |member| member.type.undeclared? }
|
6242
6318
|
end
|
@@ -6807,6 +6883,11 @@ module C #:nodoc:
|
|
6807
6883
|
end
|
6808
6884
|
|
6809
6885
|
def_delegator :@base_type, :void?
|
6886
|
+
|
6887
|
+
def standard?
|
6888
|
+
false
|
6889
|
+
end
|
6890
|
+
|
6810
6891
|
def_delegator :@base_type, :undeclared?
|
6811
6892
|
def_delegator :@base_type, :unresolved?
|
6812
6893
|
def_delegator :@base_type, :const?
|
@@ -6954,6 +7035,7 @@ module C #:nodoc:
|
|
6954
7035
|
def_delegator :@type, :enum?
|
6955
7036
|
def_delegator :@type, :user?
|
6956
7037
|
def_delegator :@type, :void?
|
7038
|
+
def_delegator :@type, :standard?
|
6957
7039
|
def_delegator :@type, :undeclared?
|
6958
7040
|
def_delegator :@type, :unresolved?
|
6959
7041
|
def_delegator :@type, :const?
|
@@ -7052,6 +7134,10 @@ module C #:nodoc:
|
|
7052
7134
|
false
|
7053
7135
|
end
|
7054
7136
|
|
7137
|
+
def standard?
|
7138
|
+
false
|
7139
|
+
end
|
7140
|
+
|
7055
7141
|
def bitfield?
|
7056
7142
|
false
|
7057
7143
|
end
|