<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=http://email.email.llvm.org/c/eJylVcuSqzYQ_Rq86TIFwvixYOEZ31vJJllkfkBIjdEtgbiS8Izz9WmBMdhxUqmKi7KFpD46ffqoXRp5LaJtcn9E10XJKUqOztteeDhGu7dxAuhzjNg-Yocwtzs9Th_hYjT3SmPEtrc99w3h47yMsiM9wvQ-yt7Dw5gw3TXK31saRtki4o4fBtOCaj00XLV3FjAFTGfDEfgCZx7PeItkbzP5G351Nham9fjlo_wEHbstZd_g1xacaRBuyy5i78BbCCHonDItmFZfgXcdcuugMhaUd-CURMCqQuFdDH_0on6KUg4E1xolcJDKCW4lyvWF6x4X22L4qBG4tfy69mbdGdIALUFJqPpWeNqynHeeVggpsL2gDQiOohFa4wNFrVDGEDGq2DEA6-G8gGDHk-e4QPAWAaoaThwSpbGv8SkTDucRCkx1L8b6Z8-1qgKAv3Y4QCgftpt22BhwKqO1-VTteSQVLDJJH9RfA5UnjmOqytO8kusFh2CJWx07q5pYyRBBJmHvy7iXcHOpR0qE1RmCLSnbUQ-PkrD-lnM3ihYcMbIP0R6bzlhur2RVKokiCf7koU6vtR0DY4AXfIjrb8YjZKTKRO6JQwuz7kJz5wapAyNSuumdh5pfSPr5hoQbF6iMF5zc6g2oVvmBKMJjCqb8QQamST7ULSzS6b3208qtiv_iI7LbNxbtk-iwASQHkBNxln_5nb-FqDhgDZcwm5X4WBw8nvgopkSSulFtuE1CGCvJUCGxB4eB7TW6_-6w3ynafio3ylnBB2kZyv6o8xOZsZ5B5PWs6ivlKmuaYfp2c25GWCryC7ZiPoOaRUie-tbLfrtNwNWm1xJKckPpkCpRanwAXMkik4fswFe897WxxVdTJ3marnqri9r7blCHfafnrHzdl9QUG3rR-jL9rDtrAn96Vc71pCf7nrPD4bCqC77Zp1LkZcLlluEm3e0zlpUHIcQ2TTcbvtK8RO0KEpz6fYufMECE3p-fVv-fgSpYwliSJnnCNts8jXdSbGSyK9OcH-RelNEmQfoD0XHAiY09r2wxQJb92dGiVo669X2RyqzOLeJAmBh65TUWp6lZw3Oz_ofmN_tlqtDcGcLVfL5uqyGtYsjpLzafbFA>52999</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Discarded value expression of volatile-qualified class type should materialize a temporary object
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
xmh0511
</td>
</tr>
</table>
<pre>
````cpp
struct A{
A(){}
A(A volatile&){
std::cout<<"copy\n";
}
};
int main(){
volatile A a;
a;
}
````
[expr.context] p2
> In some contexts, an expression only appears for its side effects. Such an expression is called a discarded-value expression. The array-to-pointer and function-to-pointer standard conversions are not applied. **The lvalue-to-rvalue conversion is applied if and only if the expression is a glvalue of volatile-qualified type and it is one of the following**:
>> - [...]
>> - id-expression ([expr.prim.id]),
>>- [...]
>
> If the (possibly converted) expression is a prvalue, **the temporary materialization conversion is applied**.
>
> [Note 3: If the expression is an lvalue of class type, it must have a volatile copy constructor to initialize the temporary object that is the result object of the lvalue-to-rvalue conversion. — end note]
[conv.lval] p3
> The result of the conversion is determined according to the following rules:
>> - [...]
>> - Otherwise, if T has a class type, the conversion **copy-initializes the result object from the glvalue**.
Hence, the call of `A(A volatile&)` should be observable.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNVcGSmzgQ_Rp86TIFwtjjAwfPOKnkkj1kfkBIjdGWQEQSnvF-fVpgDHa8W0tRNkjq169fP4nSyEsRbZPbLbouSo5RcnDe9sLDIdq9jgNA1yFiLxHbh7Hd8X74AGejuVcaI7a9rrktCJfzMsoOdAvT-yh7CzdjwnSXKH9r6THKFhE3_PAwTajWQ8NVe2MBU8CUGw7AFzjz84y3KPY6kr_iZ2djYVqPnz7Kj9Cx61T2Bb634EyDcJ12EXsD3kIIQeeUacG0-gK865BbB5WxoLwDpyQCVhUK72L42Yv6IUo5EFxrlMBBKie4lSjXZ657XCyL4b1G4Nbyy9qbdWdIA7QEJaHqW-FpyXLceZohpMD2jDYgOIpGaI0PFLVCGUPEqGOHAKyHfAHBjpnnuEDwGgGqGjIOhdKzr_GhEg6nEQpMdWvG-lfPtaoCgL90OEAoH5abdlgYcCqjtflQ7WkkFSwySR_UXwO1J45j6srDuJLrBYdgiWsfO6uaWMkQQSZhb8u4p3Bzq0dKhNUZgi2p2lEPj5Kw_qi5G0ULjhjZh2iPTWcstxeyKrVEkQT_8NCn59qOgTHAEz7E9YfxCBmpMpF74NDCrLvQ3LlB6sCIlG5656HmZ5J-3iFhxwUq4wYnt3oDqlV-IIpwX4Ip_yYD0yAf-hYmKXuv_TRz7eJ_-Ijs9oVFL0m03wCSA8iJOMu__M1fQ1QcsIZNmM1KvC8SjxnvxZRIUjeqDbtJCGMlGSoUducwsL1G9_8d9hdF2w_lRjkreCctQ9vvdX4gM_YziLyeVX2mXGVNMwxfd87VCEtFvmEr5hx0WITi6dx6et5uE3C16bWEktxQOqROlBrvAFeyyOQ-2_OVV15jcZzOHXg8d_5lH8-lT8lmkweXPTpn1Vtd1N53g-zsK90n5eu-pNO2oRetz9PfurMmhNCrcq6nRrGvOdvv96u62MqXfLeRmczyjWBitxe42aVplqR5ymQmVpqXqF1BnaQPSYsfMECEj0p-XKmCJYwlaZInbLPN03gnxUYmuzLN-V6-iDLaJEjfFR0HHrGxp5UtBkplf3I0qZWjQ_w2SRKoU4s4pCN83vva2OKzqZM8TVdD6mKg_hvc6VZM">