From fabbd04a7b6e51adf2c1be896dd3a921bd3807aa Mon Sep 17 00:00:00 2001 From: Owen Jones Date: Thu, 24 May 2018 17:08:06 +0100 Subject: [PATCH] Give up parsing generic method signature with bound Bounds on generic type variables are not currently parsed. Previously we were assuming a bound of java.lang.Object. This caused inconsistent types in goto programs. When we find a bounded type variable in a function signature we now give up on trying to parse the generic types and fall back to using the descriptor, which knows about the bounds and gives us type consistency. The problem still occurs when the bounded type variable is defined in a class signature. --- jbmc/src/java_bytecode/java_types.cpp | 12 + ...ndedGenericInnerClasses$BoundedInner.class | Bin 725 -> 871 bytes ...nericInnerClasses$DoubleBoundedInner.class | Bin 755 -> 755 bytes ...dGenericInnerClasses$TwoElementInner.class | Bin 777 -> 777 bytes .../BoundedGenericInnerClasses.java | 3 + .../GenericFunctions.class | Bin 4746 -> 4937 bytes .../GenericFunctions.java | 5 + .../parse_bounded_generic_inner_classes.cpp | 18 + .../parse_generic_functions.cpp | 442 ++++-------------- 9 files changed, 134 insertions(+), 346 deletions(-) diff --git a/jbmc/src/java_bytecode/java_types.cpp b/jbmc/src/java_bytecode/java_types.cpp index 4a3a47ab063..e83254e6962 100644 --- a/jbmc/src/java_bytecode/java_types.cpp +++ b/jbmc/src/java_bytecode/java_types.cpp @@ -462,6 +462,18 @@ typet java_type_from_string( throw unsupported_java_class_signature_exceptiont( "Failed to find generic signature closing delimiter"); } + + // If there are any bounds between '<' and '>' then we cannot currently + // parse them, so we give up. This only happens when parsing the + // signature, so we'll fall back to the result of parsing the + // descriptor, which will respect the bounds correctly. + const size_t colon_pos = src.find(':'); + if(colon_pos != std::string::npos && colon_pos < closing_generic) + { + throw unsupported_java_class_signature_exceptiont( + "Cannot currently parse bounds on generic types"); + } + const typet &method_type=java_type_from_string( src.substr(closing_generic+1, std::string::npos), class_name_prefix); diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$BoundedInner.class b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$BoundedInner.class index 99180b2bfd4dfde6132bb783f5a39419c5fa104b..f70a1cf042ad0f0cfe1d9a11c2dd4f8d16fc3565 100644 GIT binary patch delta 234 zcmcc0`kYPb)W2Q(7#J8#7*seJm>Fcb7+4tO*clYq85B241u$wdrZF;zYWQR&mL=-v zB<7{-`<3PDFw7+4sj*coKl8Duv~1u#yY%9zY9$Ic+n$e=#4 wL25D|BkyE2rbtG{$qh{Lip&h`K&?y+VhrM7T7p3cNOLhT0!@-;5M*Eg0Je?}NdN!< diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$DoubleBoundedInner.class b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$DoubleBoundedInner.class index 9e145a08faa05922afdb392be7c53d9163663232..9c54760a9713fd146981a9ceb9f19cde7a2ee4e2 100644 GIT binary patch delta 13 Ucmey&`k8gZA|^(m$%~l+04I6`-~a#s delta 13 Ucmey&`k8gZA|^)u$%~l+04Hk%-2eap diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$TwoElementInner.class b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$TwoElementInner.class index 2f4e90df2eccd1405055fa7fac8346a1ff4e551d..23fdf91d867b5f743421708443d6f7dc1865b4d0 100644 GIT binary patch delta 13 UcmeBV>tx%ogNadm@=m4z03NFZKL7v# delta 13 UcmeBV>tx%ogNadO@=m4z03MtKJOBUy diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.java b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.java index c6f53609c4d..d843d26ad70 100644 --- a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.java +++ b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.java @@ -8,6 +8,9 @@ class Inner class BoundedInner { NUM elem; + + public void f(NUM x) { + } } BoundedInner belem; diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class index 15323c85953d2b8fc780371e602b2983f2bff107..7d50700457c62d332fc94b8396f1433cb6691718 100644 GIT binary patch delta 944 zcmcJNPfrt36vfY-ras!zw15Ip#I{=KI1|et@~@>JD4;+A9dY48t06=pm>6N98{N8a z^EQ40*P8BJu-8xFw_ry+^JXd%R>rvK>pQ=D-?=9@^P%{Cpz!19+W~+PJWS#Y))nq0 zVPQSN{N%JsdSr<<=T_J*MIG#12szar?X z`je-twUX~QwVZE@6|teeB<7{Jd6=k(T+lz0Ij;vP#%hP~6lBrI|IQQSBGp;`Ec7FR zOWI2n^yict&r#(AC3!6=M-`|q*5h51|d7{*?BltX0~Lk5Z56@wB6c*yTlCRnjSTIck{n zdPHYQ=L{Voy%Etx(mRHZl8!~RPP%I7IOzl?buF`^D!fwK z^dst<)U%NIqumrCrW=`NwXOX1gG@xYd(;4r+tka#-v7z31EXn~(fn zv%2?>ehc(lihpNqt3aj%wS>d7eP~SyZ`_I delta 807 zcmcJNyHdhX5QaBFJdy~4cqv3kP|%pnc*DEk{lZnSv9zGlMjL7532e`kI5dtk>ex7= zPotHc`sXBETF0?TcE5kmzdJkon!HKG-@fi2i6}+K3UyO~QBfh83O;;FjE)$UZ{szo z(IpS|cr>c;h_WvYH>%2-#6MJ>KdC`pS0mmL@==7pt0gvyC`vK@-K!nwq{4d$UPKaU z6vE$*bVL&MBW`QqmKKLLfJ~+_c#S(={H`~!@_UB_9FjD_jey}bsfR3n5-`~$s6kWw z#cz3MLFf3V-()7J<<>5NF59*I$=@wG@6%uz@qQYWGj8P$=&qo%pmQ$Gg60IB2Tjoe zuLO0e%ws{5ErKjLgunG!Y#I5An@58dTSdMm@*-PDoOZPrXc^=i$e%+-{tP|NJ2tF{ zy%MM_cHOyQTZ?0-juvihcoTkGuHOaJ%Rl;U!*2)sc<47yui#e`ej0huyE&g7?THI$ pPAZFAXjj>jI#v6av^lfvUc~`=96CL!*HG*K&?Ae!Im{qa{s%--R%ZYJ diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java index 5140ed8705f..6f8bd0935ad 100644 --- a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java +++ b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java @@ -17,6 +17,11 @@ public static void processUpperBoundClass(G } + public static void processUpperBoundClass2(T x) + { + + } + public static void processDoubleUpperBoundClass(Generic x) { diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp index f8d740b82e6..5c3fe280632 100644 --- a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp +++ b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp @@ -68,6 +68,24 @@ SCENARIO( to_struct_type(class_symbol.type), "elem"); require_type::require_java_generic_parameter( elem.type(), boundedinner_name + "::NUM"); + + std::string method_name = + boundedinner_name + ".f:(Ljava/lang/Number;)V"; + REQUIRE(new_symbol_table.has_symbol(method_name)); + THEN("The method parameter type should respect its bound") + { + const symbolt &method_symbol = + new_symbol_table.lookup_ref(method_name); + const code_typet &method_type = + require_type::require_code(method_symbol.type); + const code_typet::parametert ¶m = + require_type::require_parameter(method_type, "x"); + require_type::require_java_generic_parameter( + param.type(), boundedinner_name + "::NUM"); + + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 + } } } } diff --git a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp index 22a8d1f6b26..41faa1bae19 100644 --- a/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp +++ b/jbmc/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp @@ -41,12 +41,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -72,18 +68,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend tests when fixed - - // issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -109,18 +95,35 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 + } + } + } + + WHEN("Parsing processUpperBoundClass2") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processUpperBoundClass2"; + const std::string func_descriptor = ":(Ljava/lang/Number;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); + THEN("It contains parameter x pointing to java.lang.Number") + { + const code_typet::parametert ¶m_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::java.lang.Number")); - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend tests when fixed - - // issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -146,18 +149,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -183,18 +176,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -221,12 +204,8 @@ SCENARIO( require_type::require_pointer( param_t.type(), symbol_typet("java::Generic")); - THEN("t is generic with type variable T") - { - require_type::require_java_generic_type( - param_t.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It contains parameter u pointing to Generic") { @@ -235,12 +214,8 @@ SCENARIO( require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); - THEN("u is generic with type variable U") - { - require_type::require_java_generic_type( - param_u.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::U"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -267,18 +242,8 @@ SCENARIO( require_type::require_pointer( param_t.type(), symbol_typet("java::Generic")); - THEN("t is generic with type variable T") - { - require_type::require_java_generic_type( - param_t.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It contains parameter u pointing to Generic") { @@ -287,18 +252,8 @@ SCENARIO( require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); - THEN("u is generic with type variable U") - { - require_type::require_java_generic_type( - param_u.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::U"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -323,12 +278,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -353,11 +304,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::java.lang.Object")); - THEN("It is the generic parameter T") - { - require_type::require_java_generic_parameter( - func_code.return_type(), class_prefix + "::T"); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -380,18 +328,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -415,18 +353,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -450,18 +378,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -485,18 +403,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -524,12 +432,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -537,12 +441,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -569,18 +469,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -588,18 +478,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -626,18 +506,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -645,18 +515,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -683,18 +543,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -702,18 +552,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -741,18 +581,8 @@ SCENARIO( require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); - THEN("x is generic with type variable T") - { - require_type::require_java_generic_type( - param_x.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; extend the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -760,18 +590,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -798,12 +618,8 @@ SCENARIO( require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); - THEN("u is generic with type variable U") - { - require_type::require_java_generic_type( - param_u.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::U"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -811,12 +627,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -843,18 +655,8 @@ SCENARIO( require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); - THEN("u is generic with type variable U") - { - require_type::require_java_generic_type( - param_u.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::U"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -862,18 +664,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -900,12 +692,8 @@ SCENARIO( require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); - THEN("u is generic with type variable U") - { - require_type::require_java_generic_type( - param_u.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::U"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It contains parameter v pointing to Generic") @@ -915,12 +703,8 @@ SCENARIO( require_type::require_pointer( param_v.type(), symbol_typet("java::Generic")); - THEN("v is generic with type variable V") - { - require_type::require_java_generic_type( - param_v.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::V"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -928,12 +712,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } } @@ -960,18 +740,8 @@ SCENARIO( require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); - THEN("u is generic with type variable U") - { - require_type::require_java_generic_type( - param_u.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::U"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It contains parameter v pointing to Generic") @@ -981,18 +751,8 @@ SCENARIO( require_type::require_pointer( param_v.type(), symbol_typet("java::Generic")); - THEN("v is generic with type variable V") - { - require_type::require_java_generic_type( - param_v.type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::V"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } THEN("It has return type pointing to Generic") @@ -1000,18 +760,8 @@ SCENARIO( require_type::require_pointer( func_code.return_type(), symbol_typet("java::Generic")); - THEN("It is generic with type variable T") - { - require_type::require_java_generic_type( - func_code.return_type(), - {{require_type::type_argument_kindt::Var, class_prefix + "::T"}}); - - THEN("The bounds are set correctly") - { - // TODO: the bounds are not parsed yet; enable the tests when - // fixed - issue TG-1286 - } - } + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 } } }