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

    <tr>
        <th>Summary</th>
        <td>
            Error diagnostic is expected for the constexpr
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:diagnostics
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          romanova-ekaterina
      </td>
    </tr>
</table>

<pre>
    I'm going through some C++ standard compliance related tests where a diagnostic is supposed to be reported (but not reported by clang compiler). 

It seems that the error should be reported for this lineĀ 
    constexpr int max = maximum( 2, 5 ); // Does error need to be reported here? 
but I'm not 100% convinced. The testcase is below. It will be nice to hear a final verdict from a C++ standard expert. 

https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf
 C++14 Standard (ISO/IEC 14882:2014), Section 5.20, Paragraph 2 says:

(2) A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:
...
     (2.7) an lvalue-to-rvalue conversion (4.1) unless it is applied to
      ....
          (2.7.3) a non-volatile glvalue that refers to a non-volatile object defined with constexpr, or that refers to a non-mutable sub-object of such an object


Consider the following test case:
```
template <class T> class Test_Class {
    public:
        mutable T value;
        constexpr void fmax( T a1, T a2 ) const { value = a1 > a2 ? a1 : a2; }
        constexpr Test_Class() : value(0) {}
};
constexpr int maximum( int a1, int a2 ){

    const Test_Class<int> foo;
    foo.fmax( a1, a2 );
    return foo.value; 
}
int main(){
    constexpr int max = maximum( 2, 5 ); // Does error need to be reported here? 
    //  See C++14 Standard (ISO/IEC 14882:2014), Section 5.20, Paragraph 2.
    return max;
}
```

Note: GCC (version 10.2.0) reports an error. 
```
test.cpp: In function 'int main()':
test.cpp:16:32:   in 'constexpr' expansion of 'maximum(2, 5)'
test.cpp:16:39: error: mutable 'Test_Class<int>::value' is not usable in a constant expression
   16 |     constexpr int max = maximum( 2, 5 ); // Does error need to be reported here?
      |                                       ^
```

Clang doesn't report an error. 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vk9v6zgO_zTKhYhh00mcHHJI02bRy-4C7X0h23Sst7JkSHLS9-0HlJ06ad_MXGamKBzJFn8kf_wjSu_V2RDtxfpJrJ8XcgitdXtnO2nsRS7p_zKQU0YuSlv_3L8KLDo4W2XOEFpnh3ML3nYER4FPAp_AB2lq6WqobNdrJU1F4EjLQDUE8sHDtSVHIKFW8mysD6oC5cEPfW89H7JQskhvHcsI3JZDAGPD_K78CZWW5hx1KE1O4C4BkT6L9DA-XwN4os5DaGWA0BKQc9aBb-2g6wcFjXUQWuVBK0PiiOKQjhgAAJU1PtBH70CZAJ38AJE_86_qhk7gFlDgEdYgcCfyJxB4EniCZ0t-Umjou0vsv8hPk8Hs3cgq-5ilqcA1670oU1GdwHtLkbhKemKiStL2msBrgKvSmoGNqoh1tCQdSGiUkRou5GpVBWic7UB-Dw999OTCI2ttCL0X-WF043q9JrYns_ShTqw7Czz9CFUm8OQrRD5wRt7VtvICT73syfEC02wl8GRWuNskfd1MbE4WZCt4u9kgcPv69h-Bp9eXI2Sr7RZFfhjFd8zrG1VBWQPrBFPe_1c6eXaybwHBy5_R1DvzBW5R4A4OTF-tWFTqJUePvGecyJ-EyjoaIytNgLvvg9Hk_ZguF6kHGbXbBoi1N1Zrex0Tn8ANmjx_440sfXCy4gypWmWIPcuS3eTGNebchEhgDd3kZsjZitmrJEnmTGRITAr2TxrQDEbLYJcurmLCkIteCNyukowPTv6oEP3ue61iMt6BQvKo5E5TkkddYKxZXqyWQWmC86h4LCtHDTnPmffllC1_UBWgpkYZquGqQjtXEjMSS-4XCN0QZKkJ_FAuJxDbgB-qlp0e3zxEPD6P1nhVk_tCKRcNcNXMabJJp_-4DdT13JhA5MdKS-_hXeQvMC3Jh_8d41IUTzNF_VBqVX1C3ji7Wf4OkSCRPz1-nxvJxaoamk5-cPt4B5kxIe8gkZvIeI41jjix3cgM2C4-kZ_G3QEkxoZTPP-entkBgVuGZqnRONym8UXx9CnPi5vN35rerdnxdrQ3rqLFn-R8aZr3-vOjMoFdaKx9YKaxNrlRMQJPoPeHHIXBmXj2xi3MRsfFaKcyo6cP8foHOvhYM1EO3oj-4k6XfGOCCbsRNAfwMbfH579t4OyHfx2PbMKtQ2RpgklMgdEjz9UVvf28D75Wig9J1feM9WqgGcxorsDiC_VYfJbGnVC2EfkhZ58BQEW5u35QcPeTxk_Nlu_Cz_CM0ZmQfw27Y9hoPS9uhSiw-EUGsnH5YaqCgtsiX7qDjyLKxMvh273wGYBsA6I4wt-dVvcVfdP3539i_fIHmXCM81JtyRuBxW2Wuov7ot7n9S7fyQXtsyIrig2muFq0-6bcrou82uxohWvKd2tM5Zqy9W7bbHJcbRZqzyfTTVpkmBYpJuv1Bqu03qTNqih3q0qsUuqk0onWl44niYXyfqD9blWsNgstS9I-jp-IcawT-WGeDb1A5LnU7Vl6WQ5nL1apVj74GS-ooGn_Eol9HCt5zKnmMY_mwC0Gp_ePE89ZhXYok8p2Ak8MPv0se2fj1YOnaDlPOaPxlz3-FgAA__8C2mQ9">