definitions = ''' struct Foo10 { int arr[10]; }; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wzero-length-array" struct Foo0 { int arr[0]; }; using ZeroLengthIntArray = int[0]; #pragma clang diagnostic pop struct MultiDim { int arr[2][3]; }; ''' [cases] [cases.member_int10] param_types = ["const Foo10&"] setup = "return {};" expect_json = '''[{ "staticSize":40, "dynamicSize":0, "members":[{ "staticSize":40, "dynamicSize":0, "length":10, "capacity":10, "elementStaticSize":4 }]}]''' expect_json_v2 = '''[{ "staticSize":40, "exclusiveSize":0, "members":[{ "staticSize":40, "exclusiveSize":0, "length":10, "capacity":10 }]}]''' [cases.member_int0] oil_skip = 'zero length arrays fail codegen v2' # https://github.com/facebookexperimental/object-introspection/issues/295 # WARNING: zero-length arrays are handled differently to non-empty arrays. # They end up not being treated as containers. This should probably change # in the future. param_types = ["const Foo0&"] setup = "return {};" expect_json = '''[{ "staticSize":0, "dynamicSize":0, "members":[{ "staticSize":0, "dynamicSize":0 }]}]''' expect_json_v2 = '''[{ "staticSize":1, "exclusiveSize":1, "members":[{ "staticSize":0, "exclusiveSize":0 }]}]''' [cases.multidim_legacy] # Test for legacy behaviour. Remove with OICodeGen oil_disable = 'oil only runs on codegen v2' cli_options = ["-Ftype-graph", "-Ftyped-data-segment", "-Ftree-builder-type-checking", "-Ftree-builder-v2"] param_types = ["const MultiDim&"] setup = "return {};" expect_json = '''[{ "staticSize":24, "dynamicSize":0, "members":[{ "staticSize":24, "dynamicSize":0, "length":6, "capacity":6, "elementStaticSize":4 }]}]''' [cases.multidim] cli_options = ["-ftype-graph"] param_types = ["const MultiDim&"] setup = "return {};" expect_json = '''[ {"staticSize":24, "dynamicSize":0, "exclusiveSize":0, "members":[ {"staticSize":24, "dynamicSize":0, "exclusiveSize":0, "length":2, "capacity":2, "elementStaticSize":12, "members":[ {"staticSize":12, "dynamicSize":0, "exclusiveSize":12, "length":3, "capacity":3, "elementStaticSize":4}, {"staticSize":12, "dynamicSize":0, "exclusiveSize":12, "length":3, "capacity":3, "elementStaticSize":4}] }]}]''' expect_json_v2 = '''[ {"staticSize":24, "exclusiveSize":0, "members":[ {"staticSize":24, "exclusiveSize":0, "length":2, "capacity":2, "members":[ {"staticSize":12, "exclusiveSize":0, "length":3, "capacity":3}, {"staticSize":12, "exclusiveSize":0, "length":3, "capacity":3}] }]}]''' [cases.direct_int10] skip = "Direct array arguments don't work" param_types = ["int[10]"] setup = "return {};" expect_json = '[{"staticSize":40, "dynamicSize":0, "length":10, "capacity":10, "elementStaticSize":4}]' [cases.direct_int0] skip = "Direct array arguments don't work" # WARNING: zero-length arrays are handled differently to non-empty arrays. # They end up not being treated as containers. This should probably change # in the future. param_types = ["ZeroLengthIntArray"] setup = "return {};" expect_json = '[{"staticSize":0, "dynamicSize":0}]' [cases.ref_int10] skip = "CodeGen bug with array reference arguments" param_types = ["const int(&)[10]"] setup = "return {};" expect_json = '[{"staticSize":40, "dynamicSize":0, "length":10, "capacity":10, "elementStaticSize":4}]' [cases.ref_int0] skip = "CodeGen bug with array reference arguments" # WARNING: zero-length arrays are handled differently to non-empty arrays. # They end up not being treated as containers. This should probably change # in the future. param_types = ["const ZeroLengthIntArray&"] setup = "return {};" expect_json = '[{"staticSize":0, "dynamicSize":0}]'