if (!leave_in_map)
                clear_fields(skel->maps.bss_A);
 
+       ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.global_list_push_pop_nested), &opts);
+       ASSERT_OK(ret, "global_list_push_pop_nested");
+       ASSERT_OK(opts.retval, "global_list_push_pop_nested retval");
+       if (!leave_in_map)
+               clear_fields(skel->maps.bss_A);
+
+       ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.global_list_array_push_pop), &opts);
+       ASSERT_OK(ret, "global_list_array_push_pop");
+       ASSERT_OK(opts.retval, "global_list_array_push_pop retval");
+       if (!leave_in_map)
+               clear_fields(skel->maps.bss_A);
+
        if (mode == PUSH_POP)
                goto end;
 
 
 
 #include "linked_list.h"
 
+struct head_nested_inner {
+       struct bpf_spin_lock lock;
+       struct bpf_list_head head __contains(foo, node2);
+};
+
+struct head_nested {
+       int dummy;
+       struct head_nested_inner inner;
+};
+
+private(C) struct bpf_spin_lock glock_c;
+private(C) struct bpf_list_head ghead_array[2] __contains(foo, node2);
+private(C) struct bpf_list_head ghead_array_one[1] __contains(foo, node2);
+
+private(D) struct head_nested ghead_nested;
+
 static __always_inline
 int list_push_pop(struct bpf_spin_lock *lock, struct bpf_list_head *head, bool leave_in_map)
 {
        return test_list_push_pop(&glock, &ghead);
 }
 
+SEC("tc")
+int global_list_push_pop_nested(void *ctx)
+{
+       return test_list_push_pop(&ghead_nested.inner.lock, &ghead_nested.inner.head);
+}
+
+SEC("tc")
+int global_list_array_push_pop(void *ctx)
+{
+       int r;
+
+       r = test_list_push_pop(&glock_c, &ghead_array[0]);
+       if (r)
+               return r;
+
+       r = test_list_push_pop(&glock_c, &ghead_array[1]);
+       if (r)
+               return r;
+
+       /* Arrays with only one element is a special case, being treated
+        * just like a bpf_list_head variable by the verifier, not an
+        * array.
+        */
+       return test_list_push_pop(&glock_c, &ghead_array_one[0]);
+}
+
 SEC("tc")
 int map_list_push_pop_multiple(void *ctx)
 {