<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57855>57855</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang assert in the call to generateInfoForComponentList
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            openmp
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          jyu2-git
      </td>
    </tr>
</table>

<pre>
    The problem is there is an extra indirection involved when requires shared memory is used.
It seems like there is a missing load from the reference here.

` if (const auto *VD =
              dyn_cast_or_null<VarDecl>(I->getAssociatedDeclaration())) {
        if (llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
                OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
          if ((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
              (*Res == OMPDeclareTargetDeclAttr::MT_To &&
               CGF.CGM.getOpenMPRuntime().hasRequiresUnifiedSharedMemory())) {
            RequiresReference = true;
            BP = CGF.CGM.getOpenMPRuntime().getAddrOfDeclareTargetVar(VD);
          }
        }`

` if (CGF.CGM.getOpenMPRuntime().hasRequiresUnifiedSharedMemory() ||
            !VD || VD->hasLocalStorage())
          BP = CGF.EmitLoadOfPointer(BP, Ty->castAs<PointerType>());
        else
          FirstPointerInComplexData = true;


Reproduce:
>clang -fopenmp -fopenmp-targets=x86_64 x.c
clang-15: /localdisk2/jyu2/git/xmain1/llvm/clang/lib/CodeGen/Address.h:103: clang::CodeGen::Address::Address(llvm::Value *, llvm::Type *, clang::CharUnits): Assertion `llvm::cast<llvm::PointerType>(Pointer->getType()) ->isOpaqueOrPointeeTypeMatches(ElementType) && "Incorrect pointer element type"' failed.
PLEASE append the compiler options "-save-temps -v", rebuild the application to to get the full command which is failing and submit a bug report to https://software.intel.com/en-us/support/priority-support which includes the failing command, input files for the command and the crash backtrace (if any).

There is the test case x.c:
`#include <stdio.h>
#include <malloc.h>

#pragma omp requires unified_shared_memory
struct NODE
{
  int a;
  int b;
};

struct NODE *Nodes_base;
#pragma omp declare target to(Nodes_base)
void foo()
{
   Nodes_base = malloc(8);
   Nodes_base[0].a = 1;
   Nodes_base[0].b = 2;
   printf("berfor a = %d %d\n", Nodes_base[0].a, Nodes_base[0].b);
   #pragma omp target map(tofrom:Nodes_base[0:2])
     {
       Nodes_base[0].a = 3;
       Nodes_base[0].b = 4;
       printf("a = %d %d\n", Nodes_base[0].a, Nodes_base[0].b);
     }
   printf("after a = %d %d\n", Nodes_base[0].a, Nodes_base[0].b);
}
int main() {
  foo();
  return 0;
}`



</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1V1tv4joQ_jXhxQKFhEt54IFCWVUqS9Xl9BU5yQS8Teys7XTLvz8zdiBAL6sj7UFWEtszn8fjmW9MorLDdLMHVmmVFFAyYZjdgwb64JLBm9WcCZkJDakVSuL3qypeIWO_9yCZhl81Thlm9lzjYAml0gdSrg1kvSBcBOHs3jIDUBpWiBc4g2elMEbIHSsUz1iuVUmTiJmjhEyBkWSD0TxHIRM5C6KbVEljGa-twt7secGCeOFl2MUvO8htyo3dKr2VdVEE8fyZ6wWk-HWHOPddfO_AzoxRqeAWMprjmtNmcT6IJr6xYHx7uYA3pCheyyCeYVtXpMNpifXq0cPAhmtEp87MWu0FV7zaHCrYHHBp9oTO-8R2xr7GEebdZGv48-Izu4-WuzY7rh8v_rDaarN9EPLFQ86pfWDyf8fc0AGOqH3kgfm3ZW_-bdVDzXUFcvX4VEsrSvAn09tz89RE4D9S5AKyHy4OVy4Mvz4--h2Vn04hRzZbXUMQfyB---jm_2AURVOW6XV-sXGMutOpvMcOxlcRQAOj8OPY_wtO-fQIg6hPyeRm2fOCsgPxHlTKix9Wab6D1qtXymfeuSuFfcCkXuePSkgLtPXbxyCas82BICkjZwYTpZmmdPD52EBfewgKA9frLYU2tgG4l3NVVgW8Lbjl7w-RfHfuyydAvsvqFCgM_TgaVXDkom6u0KdldfroWnd-aO3i7Wa0HQ3YWy_1Sk6j2x8iCjpuWZCXMmFeIuz8PNT02gmLz7eSC9knEWKLaOkUqSsSfM5VBt8Ak3ZJcQPG9PaI2A9jwvWiLluOcq7TiF52zunomRc1EDmS29thcvVx9BwbQwSjBbdJ3p8x5EPQjvDRd602HRweWzvw7gCbgYZW3fjxVBkNCrOu-K8a1tpLAomsuE33QPbfYREC2ehNGmrAV3QvU6WpCLHKr4Ax4USZdbLo7DHLuShOZefx4W72447xCo8xc5UlxRhBAc2Uo2pDuF3DX6FroawM6746nDmWoKQWhVdC_UKkjlYZVhtsuC83k2M9IcySSyqHIt1TWSMbqKjRoKkTzASsdEm9Q9BKaUsAe2srd3LREptRuf2NCdqjbRU9BMRBkN3a0GRdkRZ-VVooLeyh2wwdV5RpUWdgvEXN2o1RtBUhq9qyHLeNpil99IOzmR_9ornZs4SnL1jtiQSjG2QaLg9EJ-d5sznWbtKygBUYAwJcQsQtTQVR3FiFmTg3NhOKIvquEbiYLXmBaXM-fRSqkGxKzvDI2ltG7fls628bW3_b8BoGEx6D4_t6cQRqCR8dy_gZp1A_ackBqfb0fY1FqfId885sE9xpK3dhX-aJnnmmwBNGB54pHanyVQm85ijVJMS1laxVcQzmXYPCN1eMeAY9vA2D4aLnKa__tVDihKJzIYwpaXNnT5SApvjwUEE0zNwjGM5lkxQfLPvxcHJl76WzGieVvMJ1raJrHwbPFUo8ixDpsshcV_DP3BBfV4_PXDG4Fjx3x__gh8syf7FYToT2t5c8rUbxThXoVPtPNrXR2NqpwdZasvAC5-ou4p4dmPZHo3gcRjejqJNN42wST3jHClvAdO6qKXdlBBPO8wxGtCdQCXhRhXuZq6XSVLqVRCp_EMZ2al1MLwkSa-i-ThpibCoovbpYxH9iRcAu_pGoqX4sh-Ob4bCznybj4WCU55NxMkomN0M-GKeDkA_DER-PB1kUdwqe4KViio5DH_tKT84eLjpiGoVRFE6isD8Z9MOoN4aER2ma8iRJx6NkHAxCQHcWPTKip_Suo6fOHmR5g5MFbsO0k-gDsZMAbi3Exz8te6WndEHo4tY6zvapM_xfA-EC7A">