(root)/
gcc-13.2.0/
gcc/
testsuite/
jit.dg/
test-error-gcc_jit_rvalue_dereference_field-wrong-struct.c
       1  #include <stdlib.h>
       2  #include <stdio.h>
       3  
       4  #include "libgccjit.h"
       5  
       6  #include "harness.h"
       7  
       8  struct foo
       9  {
      10    int x;
      11    int y;
      12  };
      13  
      14  struct bar
      15  {
      16    int p;
      17    int q;
      18  };
      19  
      20  void
      21  create_code (gcc_jit_context *ctxt, void *user_data)
      22  {
      23    /* Let's try to inject the equivalent of:
      24       void
      25       test_bogus_access (struct foo *f)
      26       {
      27          f->p = f->q;
      28       }
      29       i.e. using the wrong struct.
      30    */
      31    gcc_jit_type *void_type =
      32      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
      33    gcc_jit_type *int_type =
      34      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
      35  
      36    /* Map "struct foo".  */
      37    gcc_jit_field *x =
      38      gcc_jit_context_new_field (ctxt,
      39                                 NULL,
      40                                 int_type,
      41                                 "x");
      42    gcc_jit_field *y =
      43      gcc_jit_context_new_field (ctxt,
      44                                 NULL,
      45                                 int_type,
      46                                 "y");
      47    gcc_jit_field *foo_fields[] = {x, y};
      48    gcc_jit_struct *struct_foo =
      49      gcc_jit_context_new_struct_type (ctxt, NULL, "foo", 2, foo_fields);
      50  
      51    /* Map "struct bar".  */
      52    gcc_jit_field *p =
      53      gcc_jit_context_new_field (ctxt,
      54                                 NULL,
      55                                 int_type,
      56                                 "p");
      57    gcc_jit_field *q =
      58      gcc_jit_context_new_field (ctxt,
      59                                 NULL,
      60                                 int_type,
      61                                 "q");
      62    /* We don't actually need a gcc_jit_type for "struct bar" for the test.  */
      63    gcc_jit_field *bar_fields[] = {p, q};
      64    (void)gcc_jit_context_new_struct_type (ctxt, NULL, "foo", 2, bar_fields);
      65  
      66    gcc_jit_type *foo_ptr =
      67      gcc_jit_type_get_pointer (gcc_jit_struct_as_type (struct_foo));
      68  
      69    /* Build the test function.  */
      70    gcc_jit_param *param_f =
      71      gcc_jit_context_new_param (ctxt, NULL, foo_ptr, "f");
      72    gcc_jit_function *test_fn =
      73      gcc_jit_context_new_function (ctxt, NULL,
      74                                    GCC_JIT_FUNCTION_EXPORTED,
      75                                    void_type,
      76                                    "test_bogus_access",
      77                                    1, &param_f,
      78                                    0);
      79  
      80    /* Erroneous: f->p = ... */
      81    gcc_jit_lvalue *lvalue =
      82      gcc_jit_rvalue_dereference_field (
      83        gcc_jit_param_as_rvalue (param_f),
      84        NULL,
      85        p);
      86  
      87    /* Erroneous: ... = f->q; */
      88    gcc_jit_rvalue *rvalue =
      89      gcc_jit_lvalue_as_rvalue (
      90        gcc_jit_rvalue_dereference_field (
      91  	gcc_jit_param_as_rvalue (param_f),
      92  	NULL,
      93  	q));
      94  
      95    gcc_jit_block *block =
      96      gcc_jit_function_new_block (test_fn, NULL);
      97    gcc_jit_block_add_assignment (
      98      block,
      99      NULL,
     100      lvalue, rvalue);
     101    gcc_jit_block_end_with_void_return (block, NULL);
     102  }
     103  
     104  void
     105  verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
     106  {
     107    CHECK_VALUE (result, NULL);
     108  
     109    /* Verify that the correct error message was emitted.  */
     110    CHECK_STRING_VALUE (gcc_jit_context_get_first_error (ctxt),
     111  		      "gcc_jit_rvalue_dereference_field:"
     112  		      " p is not a field of struct foo");
     113  }
     114