@@ -470,3 +470,163 @@ SCENARIO(
470470 }
471471 });
472472}
473+
474+ void validate_static_member_variable_lambda_assignment (
475+ const symbol_tablet &symbol_table,
476+ const std::vector<codet> &instructions,
477+ const lambda_assignment_test_datat &test_data,
478+ const std::string static_field_name)
479+ {
480+ const auto lambda_assignment =
481+ require_goto_statements::find_pointer_assignments (
482+ static_field_name, instructions);
483+
484+ REQUIRE (lambda_assignment.non_null_assignments .size () == 1 );
485+ REQUIRE_FALSE (lambda_assignment.null_assignment .has_value ());
486+
487+ validate_lamdba_assignement (
488+ symbol_table, instructions, test_data, lambda_assignment);
489+ }
490+
491+ SCENARIO (
492+ " Converting invokedynamic with a static member lambda" ,
493+ " [core]"
494+ " [lamdba][java_bytecode][java_bytecode_convert_method][!mayfail]" )
495+ {
496+ // NOLINTNEXTLINE(whitespace/braces)
497+ run_test_with_compilers ([](const std::string &compiler) {
498+ GIVEN (
499+ " A class with a static lambda variables from " + compiler + " compiler." )
500+ {
501+ symbol_tablet symbol_table = load_java_class (
502+ " StaticLambdas" ,
503+ " ./java_bytecode/java_bytecode_parser/lambda_examples/" + compiler +
504+ " _classes/" ,
505+ " StaticLambdas.<clinit>" );
506+
507+ WHEN (" Inspecting the assignments of the entry function" )
508+ {
509+ const std::vector<codet> &instructions =
510+ require_goto_statements::get_all_statements (
511+ symbol_table.lookup_ref (" java::StaticLambdas.<clinit>:()V" ).value );
512+
513+ const std::string function_prefix_regex_str = " java::StaticLambdas" ;
514+
515+ THEN (
516+ " The local variable should be assigned a temp object implementing "
517+ " SimpleLambda" )
518+ {
519+ lambda_assignment_test_datat test_data;
520+ test_data.lambda_interface = " java::SimpleLambda" ;
521+ test_data.lambda_interface_method_descriptor = " .Execute:()V" ;
522+ test_data.lambda_function_id =
523+ " java::StaticLambdas.lambda$static$0:()V" ;
524+ test_data.expected_params = {};
525+ test_data.should_return_value = false ;
526+ validate_static_member_variable_lambda_assignment (
527+ symbol_table,
528+ instructions,
529+ test_data,
530+ function_prefix_regex_str + " .simpleLambda" );
531+ }
532+ THEN (
533+ " The local variable should be assigned a temp object implementing "
534+ " ParameterLambda" )
535+ {
536+ lambda_assignment_test_datat test_data;
537+ test_data.lambda_interface = " java::ParameterLambda" ;
538+ test_data.lambda_interface_method_descriptor =
539+ " .Execute:(ILjava/lang/Object;LDummyGeneric;)V" ;
540+ test_data.lambda_function_id =
541+ " java::StaticLambdas.lambda$static$1:"
542+ " (ILjava/lang/Object;LDummyGeneric;)V" ;
543+
544+ symbol_exprt integer_param{" primitive" , java_int_type ()};
545+ symbol_exprt ref_param{" reference" ,
546+ java_type_from_string (" Ljava/lang/Object;" )};
547+ symbol_exprt generic_param{
548+ " specalisedGeneric" ,
549+ java_type_from_string (" LDummyGeneric<Ljava/lang/Interger;>;" )};
550+ test_data.expected_params = {integer_param, ref_param, generic_param};
551+
552+ test_data.should_return_value = false ;
553+ validate_member_variable_lambda_assignment (
554+ symbol_table, instructions, test_data, " paramLambda" );
555+ }
556+ THEN (
557+ " The local variable should be assigned a non-null pointer to a "
558+ " array parameter interface implementor" )
559+ {
560+ lambda_assignment_test_datat test_data;
561+ test_data.lambda_interface = " java::ArrayParameterLambda" ;
562+ test_data.lambda_interface_method_descriptor =
563+ " .Execute:([I[Ljava/lang/Object;[LDummyGeneric;)V" ;
564+ test_data.lambda_function_id =
565+ " java::StaticLambdas.lambda$static$2:"
566+ " ([I[Ljava/lang/Object;[LDummyGeneric;)V" ;
567+
568+ symbol_exprt integer_param{" primitive" , java_type_from_string (" [I" )};
569+ symbol_exprt ref_param{" reference" ,
570+ java_type_from_string (" [Ljava/lang/Object;" )};
571+ symbol_exprt generic_param{
572+ " specalisedGeneric" ,
573+ java_type_from_string (" [LDummyGeneric<Ljava/lang/Interger;>;" )};
574+ test_data.expected_params = {integer_param, ref_param, generic_param};
575+ test_data.should_return_value = false ;
576+
577+ validate_member_variable_lambda_assignment (
578+ symbol_table, instructions, test_data, " arrayParamLambda" );
579+ }
580+ THEN (
581+ " The local variable should be assigned a temp object implementing "
582+ " ReturningLambdaPrimitive" )
583+ {
584+ lambda_assignment_test_datat test_data;
585+ test_data.lambda_interface = " java::ReturningLambdaPrimitive" ;
586+ test_data.lambda_interface_method_descriptor = " .Execute:()I" ;
587+ test_data.lambda_function_id =
588+ " java::StaticLambdas.lambda$static$3:()I" ;
589+ test_data.expected_params = {};
590+ test_data.should_return_value = true ;
591+ validate_member_variable_lambda_assignment (
592+ symbol_table, instructions, test_data, " returnPrimitiveLambda" );
593+ }
594+ THEN (
595+ " The local variable should be assigned a temp object implementing "
596+ " ReturningLambdaReference" )
597+ {
598+ lambda_assignment_test_datat test_data;
599+ test_data.lambda_interface = " java::ReturningLambdaReference" ;
600+ test_data.lambda_interface_method_descriptor =
601+ " .Execute:()Ljava/lang/Object;" ;
602+ test_data.lambda_function_id =
603+ " java::StaticLambdas.lambda$static$4:()Ljava/lang/Object;" ;
604+ test_data.expected_params = {};
605+ test_data.should_return_value = true ;
606+ validate_member_variable_lambda_assignment (
607+ symbol_table, instructions, test_data, " returnReferenceLambda" );
608+ }
609+ THEN (
610+ " The local variable should be assigned a temp object implementing "
611+ " ReturningLambdaSpecalisedGeneric" )
612+ {
613+ lambda_assignment_test_datat test_data;
614+ test_data.lambda_interface = " java::ReturningLambdaSpecalisedGeneric" ;
615+ test_data.lambda_interface_method_descriptor =
616+ " .Execute:()LDummyGeneric;" ;
617+ test_data.lambda_function_id =
618+ " java::StaticLambdas.lambda$static$5:()LDummyGeneric;" ;
619+ test_data.expected_params = {};
620+ test_data.should_return_value = true ;
621+ validate_member_variable_lambda_assignment (
622+ symbol_table,
623+ instructions,
624+ test_data,
625+ " returningSpecalisedGenericLambda" );
626+ }
627+
628+ // TODO[TG-2486]: Tests for member lambdas that capture member variables
629+ }
630+ }
631+ });
632+ }
0 commit comments