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

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] Request for dangling reference check for (ranges) min, max, minmax
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          olologin
      </td>
    </tr>
</table>

<pre>
    Hi, is it possible to implement dangling reference clang-tidy check that identifies bad code, for example on inputs like this:
[https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:38,endLineNumber:18,positionColumn:38,positionLineNumber:18,selectionStartColumn:38,selectionStartLineNumber:18,startColumn:38,startLineNumber:18),source:'template%3Cclass+T%3E%0Aconst+T%26+min(const+T%26+a,+const+T%26+b)%0A%7B%0A++++return+(b+%3C+a)+%3F+b+:+a%3B%0A%7D%0A%0Aint+normal()%0A%7B%0A++++int+a+%3D+0%3B%0A++++int+b+%3D+0%3B%0A++++const+auto+c+%3D+min(a,+b)%3B%0A%7D%0A%0Aint+dangling()%0A%7B%0A++++const+auto%26+c+%3D+min(1,+2)%3B%0A++++int+a+%3D+2%3B%0A++++const+auto%26+d+%3D+min(a,+normal())%3B%0A++++const+auto%26+e+%3D+min(1,+a*2)%3B%0A%7D'),l:'5',n:'1',o:'C%2B%2B+source+%231',t:'0')),k:35.81213307240704,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((g:!((h:compiler,i:(compiler:clang_trunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'1',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-Xclang+-ast-dump+-std%3Dc%2B%2B20',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+clang+(trunk)+(Editor+%231)',t:'0')),k:50.82493349378958,l:'4',m:25.357710651828295,n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compilerName:'x86-64+clang+18.1.0',editorid:1,fontScale:14,fontUsePx:'0',j:1,wrap:'0'),l:'5',n:'0',o:'Output+of+x86-64+clang+(trunk)+(Compiler+%231)',t:'0')),header:(),l:'4',m:74.6422893481717,n:'0',o:'',s:0,t:'0')),k:64.18786692759295,l:'3',n:'0',o:'',t:'0')),l:'2',n:'0',o:'',t:'0')),version:4](godbolt with ast-dump)

Code from godbolt:
```
template<class T>
const T& min(const T& a, const T& b)
{
    return (b < a) ? b : a;
}

int normal()
{
    int a = 0;
    int b = 0;
 const auto c = min(a, b);
}

int dangling()
{
    const auto& c = min(1, 2);
    int a = 2;
    const auto& d = min(a, normal());
 const auto& e = min(1, a*2);
}
```

I guess we need to match for function min, max, minmax calls that have `MaterializeTemporaryExpr` child nodes?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysF9mO46j2a8gLqsjG-0MeYqeie6V7u0bTNaN5G2H7JKELgwdwLfP1I8BZHKeqa1otRTEczs7ZoFqzvQBYoaREyWZBB3OQaiW55HLPxKKW7dvqPwyRCjONmcG91JrVHLCRmHU9hw6EwS0Ve87EHivYgQLRAG44Ffs7w9o33BygecLmQA1mLQjDdgw0rmmLG9mC5b2TCsMrtfywFJiJfjAac_YE2ByYRtEaBRsUrFFSHozpHYBsEdnuZVtLbpZS7R0g2rujEJEckfz9zQFFayv8vmVGKkQq5k7zHeMgaAdul4WIZIhUOynM14ZyCw3jEfCbhl9ePVrg0b7ZY0Qqa7hlj0hCyvGv0sChMUwKLwdEW0k-dHYb5YhUINr_MQFfhq4GZRlZYC81szRT1CN0jn8S8tVQZaZU07MbtDdIbmIW9kQOqhmdZKDrOTWASBJVDadaI1I-2t09IkmwbqTQZgSRFJGyYwKRfAamiFSIlDN47UQmwRqRJCvHVXn6KTCDEm6d1-6TRJVnV4zbredSOn3tQRKVJ46b4ypYM2EFC6k6yl2YfCTXI9NRxAaRMrhkfI1Yfx_xaDkdjLTbCwrvstFDo0M-suGYj9-1YirTO3wuOPSCyZXgj5xBPmOjl9e-Z-j0Jt4RfYsjvGcBRWR9bYVzX-bjmvuQTnxCi0kVkH5XXaZ1OSaCB0QjprksC17z6skmVbLMQxJGUZCROMiC-CwxnkgMJhL9xta84Abz6hN1rusZh4sqd4JEa1em_zRqEE-2sDFuQPnymtcTZWomqHqbeMSDHupv0JjJQSM72xYeBH-b8GihHvYV5VxP0FvobLzCFJcpW6-eQU_A8ArNYKb1mQkDfALhrFZUvVW2vVxSG8W6CeIzqFpq2HgNmNhfe3fH6V7_zuDloQfx07sCZ7W-uC4rUPa2SI9G3_3h7geR8o5qc9cOXW_X2rQuvC-YkWPMPINSrIVrth_0n_BW-7nVfcJ3m8_7vWd-NKecE9zCm_Sd8IN8vc6e8jVP79LY1orRmYjkY8T7FpEfx4BTGhcfZ3ISLHMSF1EUF1GWF0k-y2QbZiRZRkmWhUGahDnJSZH8pBS3WS0H0w9mntNfTtPLzOwwX4bLYx45i1k7evxfBvOLov21kp-4i4dR51LuPnUt1alyfeZiDkBbFyynoJ9fSRYv05iQvIjiPMzCH6y5xzBI42WYZ3maFiRLCn-_o8zouwX9FtORmPwQ8TMo7RM8RsnGxowfjvELMwd8rh_FOEu7f1si8U7JDo_Y51k7Dcaf257GvHHIw48ouvdHrgXjR0RSfDHbeYBt5fhiX5_lZ6VfYIyxn-Kw7ToYRZUlKzCKtthu15iiqDxSbS7VZ8LgyZgwZ21RKEbRBgcnLkd4fQ33mtpZAjfu7DyQeNU_0ONq6JprcmZuPXHJ3-YUJpf8p5qTCXzKp73W83psumGcpYNr-afhaG7jNBT8_3_xfgCt8QtgAdDaB2FHTXNwj7ndIFzF9_wr3NFX92Gio6-4sSOAfxAe6DNglAb_pwYUo5z9DY_Q9dK27_vXXqE0wM2B8RYL6bradtGuoraICrqAVZiRJE1JGueLw2pHIK13bRzEkJCU0IiktR212iTPC5rsFmxFAhIHRZASEsdBvgzzpk2iMGspkKKoKYoD6CjjS86fO_umXDCtB1iFQZYm0YLTGrg-PpXVymLd1cNeozjgTBt9pjPMcPeoPj-DUbLBv8JfA2jjXHTrzeweyvYQkVxRsQdt8-CWDxeD4qurtzAzh6FeNrJDZGs1GT93vZJuRCNbZ45GZDta9Lwi_wQAAP__Db9XlA">