220 36638 <dc689be1-8ab4-4c06-86d9-4d9d9cc313b4@isocpp.org> article
Path: news.gmane.org!.POSTED!not-for-mail
From: Nicol Bolas <jmckesson@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Static analysis and the future of C++
Date: Mon, 15 Jan 2018 09:48:04 -0800 (PST)
Lines: 612
Approved: news@gmane.org
Message-ID: <dc689be1-8ab4-4c06-86d9-4d9d9cc313b4@isocpp.org>
References: <0087c1a4-0b36-40ca-8d43-5bfaf0af62ca@isocpp.org>
 <4270ffec-ccc7-4abd-836d-213db296be84@isocpp.org>
 <08cecc11-e902-4542-a827-53dc45a125d5@isocpp.org>
 <4e25f92e-bd17-42e4-9a33-68916ae380d6@isocpp.org>
 <c568fb1e-3e63-4471-9b4a-7d1e6313c4df@isocpp.org>
 <a4ce1aca-9445-4557-b2d9-478e027bf0a0@isocpp.org>
 <9ec7a895-af7b-43d3-b47a-b7c95ed8660b@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_5610_1263075780.1516038484340"
X-Trace: blaine.gmane.org 1516038375 5037 195.159.176.226 (15 Jan 2018 17:46:15 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Mon, 15 Jan 2018 17:46:15 +0000 (UTC)
Cc: mihailnajdenov@gmail.com
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBCEKFTV6ZUMBBVOS6PJAKGQE6BY56TI@isocpp.org Mon Jan 15 18:46:10 2018
Return-path: <std-proposals+bncBCEKFTV6ZUMBBVOS6PJAKGQE6BY56TI@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-ua0-f200.google.com ([209.85.217.200])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBCEKFTV6ZUMBBVOS6PJAKGQE6BY56TI@isocpp.org>)
	id 1eb8pf-0000Vo-D2
	for gclcip-std-proposals@m.gmane.org; Mon, 15 Jan 2018 18:46:03 +0100
Original-Received: by mail-ua0-f200.google.com with SMTP id g47sf5473632uad.14
        for <gclcip-std-proposals@m.gmane.org>; Mon, 15 Jan 2018 09:48:07 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=date:from:to:cc:message-id:in-reply-to:references:subject
         :mime-version:x-original-sender:reply-to:precedence:mailing-list
         :list-id:list-post:list-help:list-archive:list-subscribe
         :list-unsubscribe;
        bh=vVjDQyFPDqi/wNe5+OSzRFXty1qbY4WwUqmbqRbZpeU=;
        b=aVXZ5dexeLYK4hcxwYtRuFsgAfhJwudu0an6upHsi+g2FTH1Ge+n6NiBinJXnYMrM8
         B4gJYQPG3tnTZGlO5Mi/W29WrUy7ixOhsZ60wegUc07P5hUu21u5lLe5fW/wzZU2ONyw
         nnDMgxy0Dxn+phO59Lw0JuQVhvKQmSoaYdgBtzJEDw2QPs+Jpw3Q7J23S/ICZrGiOcRY
         mIWOEFiYz6t2LcOOvHEKQdZ4WxU/7RWgaJ9898GLmb54Pa20UgvWbzLvw9V7e56k/+eS
         KMhAQAbgIh2xV/lD3RGe/rjhP5tArjIgyJ29Y/NBUmZO3dnGqtFIz6HpzNSJU4sTB4GD
         zIVQ==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20161025;
        h=date:from:to:cc:message-id:in-reply-to:references:subject
         :mime-version:x-original-sender:reply-to:precedence:mailing-list
         :list-id:list-post:list-help:list-archive:list-subscribe
         :list-unsubscribe;
        bh=vVjDQyFPDqi/wNe5+OSzRFXty1qbY4WwUqmbqRbZpeU=;
        b=dEekya2Jp1ndfxFxqHmthSJW6zIcglidAyjhZLQi7FWcibO4r1VXw1ha0MM/I/ysso
         3bEp/OSsFyxga1swJjERoQzWn9tijtFblWHPktaLfY6kCOd9DF+ZcVHmkcCHFuFyTO5a
         +jTQ5XKICkQ4pOq3eUl+U9ZFx3pFClFA1sPln7rYs0INC+hBWyw9dCTd3IPTontkGLb7
         mPEaZmm+TQBVZMwXvFUMA4O0C/5WZGgXWkeUZwmOX9u/QTEyS17LXNPifZgbUiroUC4L
         AsltyLllOVl8eU64uEHeHVBqJM4lFXJxVYbNteZgS2wKeU1cx46NiLyxp/7u0f3CGLaT
         7FGQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:date:from:to:cc:message-id:in-reply-to
         :references:subject:mime-version:x-original-sender:reply-to
         :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post
         :list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=vVjDQyFPDqi/wNe5+OSzRFXty1qbY4WwUqmbqRbZpeU=;
        b=TyYdt9ZP/ex9cVblcWkCJd0zt3kW5lbMxXZ69aDNCY98cJhnmfBsW6C2TMQO31d7YV
         uTkG1beXSN/xHB5IqVnCoAh9fSPZPT/LpRPC8/hIAQr5Y0YYO4nq+CN6xw8g8uDIrFRv
         UsCf95HRbGJaFd6i3dnxsc6TuMe3R/eXNm/tSbydX5Ezw+/3Pe7+qG2uHKfPC9ygTUTP
         cpL3ngTFqABnYH5xeLGu57agibTJoNKRVjtHIxlCmsKo4fY4YgdPSvMK/iJ6Q+7BDUhm
         RBQ3t6V+o812pnJLegvnxeQISAr6Y5kOjtB7iFj5yxMM1YbxWKYaw9s1UsXcNhbahglg
         V2Ww==
X-Gm-Message-State: AKwxytc6tlVz1/MU6Fz4ClZeJO+gUoSvIZ/qIfBFaBm/PlHbbR9fqSHG
	37ooC0S2ggII/I5nfczJxF17DQ==
X-Google-Smtp-Source: ACJfBotfR5arlkUsRSmJRcLLcWUk7HMLJOCMit21FtyaQB5/69QxBpb4iuxqI/eVN2+7VCMOEagTGw==
X-Received: by 10.176.48.146 with SMTP id h18mr8347027ual.32.1516038486932;
        Mon, 15 Jan 2018 09:48:06 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.31.151.194 with SMTP id z185ls286784vkd.8.gmail; Mon, 15 Jan
 2018 09:48:05 -0800 (PST)
X-Received: by 10.31.164.82 with SMTP id n79mr3839220vke.12.1516038484981;
        Mon, 15 Jan 2018 09:48:04 -0800 (PST)
In-Reply-To: <9ec7a895-af7b-43d3-b47a-b7c95ed8660b@isocpp.org>
X-Original-Sender: jmckesson@gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:36638
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/36638>

------=_Part_5610_1263075780.1516038484340
Content-Type: multipart/alternative; 
	boundary="----=_Part_5611_925091296.1516038484341"

------=_Part_5611_925091296.1516038484341
Content-Type: text/plain; charset="UTF-8"

On Monday, January 15, 2018 at 4:27:27 AM UTC-5, mihailn...@gmail.com wrote:
>
> On Monday, January 15, 2018 at 1:54:32 AM UTC+2, Nicol Bolas wrote:
>>
>> On Sunday, January 14, 2018 at 3:44:10 PM UTC-5, mihailn...@gmail.com 
>> wrote:
>>>
>>> On Sunday, January 14, 2018 at 9:05:44 PM UTC+2, Nicol Bolas wrote:
>>>>
>>>> On Sunday, January 14, 2018 at 11:34:42 AM UTC-5, mihailn...@gmail.com 
>>>> wrote:
>>>>>
>>>>> On Sunday, January 14, 2018 at 6:03:45 PM UTC+2, Nicol Bolas wrote:
>>>>>>
>>>>>> ...
>>>>>> ...
>>>>>>
>>>>>
>>>> And it's that "difference" that I'm saying shouldn't happen. If you 
>>>> want a static analyzer to find bugs, that's great. But the standard should 
>>>> not require it, nor should the standard be getting in the way of that 
>>>> process.
>>>>
>>>
>>>> The standard should be about the actual language.
>>>>
>>>
>>> Yeah, but things like attributes are not about the language. And that is 
>>> OK. If there is an attribute which will help you enforce correct code, why 
>>> not have it? 
>>>
>>
>> If attributes aren't "about the language", then why are they defined* by 
>> the language*? And how do you explain P0840?
>>
>> ...
>>>>
>>>> You're thinking about it backwards. If people frequently keep writing 
>>>> code like that, then on some level, they want to write it that way. It's 
>>>> natural for them to. So you can either slap them in the face and make them 
>>>> stop, or you can just* make it legal* and make it do what they expect.
>>>>
>>>> Yes, making it legal properly is infinitely harder than just slapping 
>>>> an attribute on it and calling it a day. But why should C++ keep taking the 
>>>> easy path to "fixing" its problems?
>>>>
>>>
>>> I don't find the possibility of adding lifetime extensions realistic.  I 
>>> don't mind it, but I really, really doubt it will ever be added. Is there 
>>> any work on in that direction? Have ever been any work on that?
>>>
>>
>> Yes there has <http://wg21.link/P0066>. But apparently, EWG didn't 
>> consider the cost of consistent use of such annotations to be worth the 
>> fixing of this problem 
>> <https://botondballo.wordpress.com/2015/11/09/trip-report-c-standards-meeting-in-kona-october-2015/>
>> .
>>
>> Not that it is without problems - we break our own rules adding that. 
>>> Yea, const ref already breaks it, but still. Even semantically is not very 
>>> accurate - a view is 'slave' to the viewed, should not control it.
>>> Also, what will happen with heap allocated views? Will they fail to 
>>> compile and be illegal? 
>>>
>>> But as I said, I will not fight against lifetime extensions, I just 
>>> don't see them coming. Ever.
>>>
>> Where with said attribute we can *considerably* improve the quality of 
>>> the user code, making the foot gun very loud.
>>>
>>  
>> Except where it doesn't, of course:
>>
>> auto ptr = make_shared<A_view>(A{});
>>
>>
> You are not fair in your example. I was very specific - the attr will be 
> ignored for heap allocated views (which are not that widely used, if at 
> all). In any case an attribute can be ignored - it is just a hint - it is 
> whole different story if its an language extension.
>

The heap allocation is irrelevant; the problem is indirect initialization 
of the object. Consider this:

template<typename T, typename ...Args>
auto initialize(Args ...&&args)
{
  return T(std::forward<Args>(args)...);
}

auto var = initialize<A_view>(A{});

Or even simpler:

optional<A_view> ovar(in_place, A{});

*Any instance* where you initialize `A_view` via forwarding will not 
properly detect that you're using a temporary, since the forwarding 
function cannot tell the difference between an xvalue and a prvalue.

That's ultimately why I concluded that annotation-based solutions can't 
work, that you have to create a "third reference" that preserves the 
prvalue-ness of the argument. That is, if you want to correctly deal with 
lifetime issues, you need to be able to tell the difference, not between 
lvalues and rvalues, but between lvalues, xvalues, and prvalues.

And technically, you need a* sixth* value category too. One that represents 
the difference between `prvalue.member`, which is not technically a prvalue 
but can extend the temporary's lifetime, and a function call on a prvalue 
that returns an xvalue subobject of the prvalue, which doesn't extend its 
lifetime.

However, even for heap allocated views it will be *possible* to give a 
> warning if view is used after A is destroyed, where it is practically 
> impossible to extend the lifetime of A!
>  
>  
>
>> After a discussion about the "extend me" proposal idea, I investigated 
>> the issues with an annotation-based approach. I concluded that the only way 
>> to make it work would be to add the equivalent of a* third* reference 
>> type (whether you spell it with `&&&` or some keyword or attribute 
>> associated with a reference parameter, the effect is to have a thing which 
>> behaves much like a third kind of reference). Which means you'd have to 
>> make forwarding references work with such a tool... somehow.
>>
>> Your attribute-based annotation falls into the same trap: once you leave 
>> the immediate scope of the code creating the prvalue, it stops being a 
>> prvalue. So unless the immediate scope knows that the parameter is going to 
>> be used like this, it can't be annotated properly.
>>
>
> You have to give me an example, I am not sure I understand the issue. 
>
> My logic is very, very simple - as long as we have automatic variables 
> (aka predictable destruction) the compiler knows *everything* needed to 
> track improper use, given our specification of improper use.
>
 
See above. The compiler cannot just look at the prvalue argument and an 
attribute on the parameter to tell what's going on. `A_view` is not being 
fed a prvalue; it's being fed an xvalue. And by all rights, that ought to 
be fine.

Temporaries, prvalues these have semantic value to us, but in the end - it 
> is the compiler just rearranging the calls the dtors. All is visible to him 
> - he created it. 
>
> If we, in this predictable for the compiler world, want a variable marked 
> so we are informed it is used before another variable from this same 
> predictable world, I am pretty sure the compiler can do this for us.
>
> The point is, not want *can't* be done (the cases which will not be 
> possible), but what *can* be done. Covering the trivial cases alone is 
> not only better then nothing, but will actually amount to 95% of the cases 
> needed to be covered in the first place.
>

No, half-measures are actually worse than doing nothing. Why?

Because right now, we can teach people "be careful with view types and 
temporaries". We can teach people about lifetime issues and so forth. Maybe 
not enough programmers get this lesson, but the information is still out 
there.

But if you give people the illusion that the compiler can handle this 
issue, that they'll get a compile error or whatever if they improperly use 
views and temporaries, then people will use view types and temporaries with 
abandon. They won't realize that the compiler can't catch* all* of these 
kinds of problems. Without the training to avoid this problem, they're more 
likely to run into it in indirect initialization cases and so forth, 
because they have faith the compiler will tell them when they're doing it 
wrong.

If you can't solve this problem, better to do nothing at all. At least 
then, we'll always be on our toes. Better that than to become complacent.

Ultimately, I've come to believe that the only reasonable solution is 
>> something like `extend_me`: something which explicitly extends the lifetime 
>> of a temporary, which is the responsibility of the writer of the prvalue 
>> expression to properly use.
>>
>> Actually I will not be surprised if implementations start doing that by 
>>> themselves (warning in cases thy can verify). The question is, why the 
>>> initiative should always come from them?
>>>
>>
>> Because the interaction between two rules of the standard makes this 
>> legal code behave in a way that is unexpected but clearly explicitly 
>> specified.
>>
>
> Does not change the fact the standard not mandating warnings, it is the 
> implementation which must take the initiative - warning for assignment in 
> if statement, warning for no return, for fallthrough, for empty statements, 
> etc etc. These save lifes for pros and juniors alike. 
>
 

Ironically all the standard did is a way to turn these warnings off if they 
> do not match the intend. However, how about the standard turning warnings 
> on (in cases impl. agree are implementable).
>

The standard defines behavior. Warnings are not behavior. Thus, it has no 
right to mandate warnings.
 

> Granted [[deprecated]] is such an example but, that is way too little, 
> compared to what it is possible.
>
>
> Sure it is better to make this code illegal, but what if it is not 
> possible or too hard? As the saying (in my language) goes - [*It is] 
> better [to have a]sparrow in the hand, then an eagle in the sky.*
>
>

-- 
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/dc689be1-8ab4-4c06-86d9-4d9d9cc313b4%40isocpp.org.

------=_Part_5611_925091296.1516038484341
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Monday, January 15, 2018 at 4:27:27 AM UTC-5, mihailn..=
..@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"=
ltr">On Monday, January 15, 2018 at 1:54:32 AM UTC+2, Nicol Bolas wrote:<bl=
ockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-l=
eft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Sunday, January 14=
, 2018 at 3:44:10 PM UTC-5, <a>mihailn...@gmail.com</a> wrote:<blockquote c=
lass=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #c=
cc solid;padding-left:1ex"><div dir=3D"ltr">On Sunday, January 14, 2018 at =
9:05:44 PM UTC+2, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr">On Sunday, January 14, 2018 at 11:34:42 AM UTC-5, <a>miha=
iln...@gmail.com</a> wrote:<blockquote class=3D"gmail_quote" style=3D"margi=
n:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr">On Sunday, January 14, 2018 at 6:03:45 PM UTC+2, Nicol Bolas wrote=
:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">...<div></div><di=
v>...</div></div></blockquote></div></blockquote><div><br></div><div>And it=
&#39;s that &quot;difference&quot; that I&#39;m saying shouldn&#39;t happen=
.. If you want a static analyzer to find bugs, that&#39;s great. But the sta=
ndard should not require it, nor should the standard be getting in the way =
of that process.</div></div></blockquote><blockquote class=3D"gmail_quote" =
style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left=
:1ex"><div dir=3D"ltr"><div><br></div><div>The standard should be about the=
 actual language.</div></div></blockquote><div><br></div><div>Yeah, but thi=
ngs like attributes are not about the language. And that is OK. If there is=
 an attribute which will help you enforce correct code, why not have it?=C2=
=A0</div></div></blockquote><div><br></div><div>If attributes aren&#39;t &q=
uot;about the language&quot;, then why are they defined<i> by the language<=
/i>? And how do you explain P0840?</div><div><br></div><blockquote class=3D=
"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div dir=3D"ltr"><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div dir=3D"ltr"><div>...</div><div><br></div><div>You&#39;re thinking ab=
out it backwards. If people frequently keep writing code like that, then on=
 some level, they want to write it that way. It&#39;s natural for them to. =
So you can either slap them in the face and make them stop, or you can just=
<i> make it legal</i> and make it do what they expect.</div><div><br></div>=
<div>Yes, making it legal properly is infinitely harder than just slapping =
an attribute on it and calling it a day. But why should C++ keep taking the=
 easy path to &quot;fixing&quot; its problems?</div></div></blockquote><div=
><br></div><div>I don&#39;t find the possibility of adding lifetime extensi=
ons realistic.=C2=A0 I don&#39;t mind it, but I really, really doubt it wil=
l ever be added. Is there any work on in that direction? Have ever been any=
 work on that?</div></div></blockquote><div><br></div><div><a onmousedown=
=3D"this.href=3D&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Fwg21.link%=
2FP0066\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNESJlrJTTrXPaGVemQg-SPWTHIHz=
Q&#39;;return true;" onclick=3D"this.href=3D&#39;http://www.google.com/url?=
q\x3dhttp%3A%2F%2Fwg21.link%2FP0066\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjC=
NESJlrJTTrXPaGVemQg-SPWTHIHzQ&#39;;return true;" href=3D"http://wg21.link/P=
0066" target=3D"_blank" rel=3D"nofollow">Yes there has</a>. But apparently,=
 <a onmousedown=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%3=
A%2F%2Fbotondballo.wordpress.com%2F2015%2F11%2F09%2Ftrip-report-c-standards=
-meeting-in-kona-october-2015%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH0=
fDsHBDmgIXlDvga9RNUVFObifw&#39;;return true;" onclick=3D"this.href=3D&#39;h=
ttps://www.google.com/url?q\x3dhttps%3A%2F%2Fbotondballo.wordpress.com%2F20=
15%2F11%2F09%2Ftrip-report-c-standards-meeting-in-kona-october-2015%2F\x26s=
a\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH0fDsHBDmgIXlDvga9RNUVFObifw&#39;;retur=
n true;" href=3D"https://botondballo.wordpress.com/2015/11/09/trip-report-c=
-standards-meeting-in-kona-october-2015/" target=3D"_blank" rel=3D"nofollow=
">EWG didn&#39;t consider the cost of consistent use of such annotations to=
 be worth the fixing of this problem</a>.</div><div><br></div><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #c=
cc solid;padding-left:1ex"><div dir=3D"ltr"><div>Not that it is without pro=
blems - we break our own rules adding that. Yea, const ref already breaks i=
t, but still. Even semantically is not very accurate - a view is &#39;slave=
&#39; to the viewed, should not control it.</div><div>Also, what will happe=
n with heap allocated views? Will they fail to compile and be illegal?=C2=
=A0</div><div><br></div><div>But as I said, I will not fight against lifeti=
me extensions, I just don&#39;t see them coming. Ever.</div></div></blockqu=
ote><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;pad=
ding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;bord=
er-left-style:solid"></blockquote><blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr"><div>Where with said attribute we can <i>considerably</i>=
 improve the quality of the user code, making the foot gun very loud.</div>=
</div></blockquote><div>=C2=A0</div><div>Except where it doesn&#39;t, of co=
urse:</div><div><br></div><div style=3D"border:1px solid rgb(187,187,187);w=
ord-wrap:break-word;background-color:rgb(250,250,250)"><code><div><span sty=
le=3D"color:#008">auto</span><span style=3D"color:#000"> ptr </span><span s=
tyle=3D"color:#660">=3D</span><span style=3D"color:#000"> make_shared</span=
><span style=3D"color:#660">&lt;</span><span style=3D"color:#000">A_view</s=
pan><span style=3D"color:#660">&gt;(</span><span style=3D"color:#000">A</sp=
an><span style=3D"color:#660">{});</span><span style=3D"color:#000"><br></s=
pan></div></code></div><br></div></blockquote><div><br></div><div>You are n=
ot fair in your example. I was very specific - the attr will be ignored for=
 heap allocated views (which are not that widely used, if at all). In any c=
ase an attribute can be ignored - it is just a hint - it is whole different=
 story if its an language extension.</div></div></blockquote><div><br></div=
><div>The heap allocation is irrelevant; the problem is indirect initializa=
tion of the object. Consider this:</div><div><br></div><div class=3D"pretty=
print" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word=
; background-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div c=
lass=3D"subprettyprint"><span class=3D"styled-by-prettify" style=3D"color: =
#008;">template</span><span class=3D"styled-by-prettify" style=3D"color: #6=
60;">&lt;</span><span class=3D"styled-by-prettify" style=3D"color: #008;">t=
ypename</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> T<=
/span><span class=3D"styled-by-prettify" style=3D"color: #660;">,</span><sp=
an class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=
=3D"styled-by-prettify" style=3D"color: #008;">typename</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"style=
d-by-prettify" style=3D"color: #660;">...</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #606;">Args</span><span class=3D"styled-by-prettify=
" style=3D"color: #660;">&gt;</span><span class=3D"styled-by-prettify" styl=
e=3D"color: #000;"><br></span><span class=3D"styled-by-prettify" style=3D"c=
olor: #008;">auto</span><span class=3D"styled-by-prettify" style=3D"color: =
#000;"> initialize</span><span class=3D"styled-by-prettify" style=3D"color:=
 #660;">(</span><span class=3D"styled-by-prettify" style=3D"color: #606;">A=
rgs</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span=
><span class=3D"styled-by-prettify" style=3D"color: #660;">...&amp;&amp;</s=
pan><span class=3D"styled-by-prettify" style=3D"color: #000;">args</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #660;">)</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;"><br></span><span class=3D"st=
yled-by-prettify" style=3D"color: #660;">{</span><span class=3D"styled-by-p=
rettify" style=3D"color: #000;"><br>=C2=A0 </span><span class=3D"styled-by-=
prettify" style=3D"color: #008;">return</span><span class=3D"styled-by-pret=
tify" style=3D"color: #000;"> T</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=3D"co=
lor: #000;">std</span><span class=3D"styled-by-prettify" style=3D"color: #6=
60;">::</span><span class=3D"styled-by-prettify" style=3D"color: #000;">for=
ward</span><span class=3D"styled-by-prettify" style=3D"color: #660;">&lt;</=
span><span class=3D"styled-by-prettify" style=3D"color: #606;">Args</span><=
span class=3D"styled-by-prettify" style=3D"color: #660;">&gt;(</span><span =
class=3D"styled-by-prettify" style=3D"color: #000;">args</span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">)...);</span><span class=3D"=
styled-by-prettify" style=3D"color: #000;"><br></span><span class=3D"styled=
-by-prettify" style=3D"color: #660;">}</span><span class=3D"styled-by-prett=
ify" style=3D"color: #000;"><br><br></span><span class=3D"styled-by-prettif=
y" style=3D"color: #008;">auto</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"col=
or: #008;">var</span><span class=3D"styled-by-prettify" style=3D"color: #00=
0;"> </span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</=
span><span class=3D"styled-by-prettify" style=3D"color: #000;"> initialize<=
/span><span class=3D"styled-by-prettify" style=3D"color: #660;">&lt;</span>=
<span class=3D"styled-by-prettify" style=3D"color: #000;">A_view</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #660;">&gt;(</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #000;">A</span><span class=3D"sty=
led-by-prettify" style=3D"color: #660;">{});</span></div></code></div><div>=
<br></div><div>Or even simpler:</div><div><br></div><div class=3D"prettypri=
nt" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; b=
ackground-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div clas=
s=3D"subprettyprint"><span class=3D"styled-by-prettify" style=3D"color: #00=
0;">optional</span><span class=3D"styled-by-prettify" style=3D"color: #660;=
">&lt;</span><span class=3D"styled-by-prettify" style=3D"color: #000;">A_vi=
ew</span><span class=3D"styled-by-prettify" style=3D"color: #660;">&gt;</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #000;"> ovar</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #660;">(</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;">in_place</span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">,</span><span class=3D"style=
d-by-prettify" style=3D"color: #000;"> A</span><span class=3D"styled-by-pre=
ttify" style=3D"color: #660;">{});</span></div></code></div><div><br></div>=
<div><i>Any instance</i> where you initialize `A_view` via forwarding will =
not properly detect that you&#39;re using a temporary, since the forwarding=
 function cannot tell the difference between an xvalue and a prvalue.</div>=
<div><br></div><div>That&#39;s ultimately why I concluded that annotation-b=
ased solutions can&#39;t work, that you have to create a &quot;third refere=
nce&quot; that preserves the prvalue-ness of the argument. That is, if you =
want to correctly deal with lifetime issues, you need to be able to tell th=
e difference, not between lvalues and rvalues, but between lvalues, xvalues=
, and prvalues.</div><div><br></div><div>And technically, you need a<i> six=
th</i> value category too. One that represents the difference between `prva=
lue.member`, which is not technically a prvalue but can extend the temporar=
y&#39;s lifetime, and a function call on a prvalue that returns an xvalue s=
ubobject of the prvalue, which doesn&#39;t extend its lifetime.</div><div><=
i><br></i></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"lt=
r"><div>However, even for heap allocated views it will be <i>possible</i> t=
o give a warning if view is used after A is destroyed, where it is practica=
lly impossible to extend the lifetime of A!</div><div>=C2=A0</div><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.=
8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Afte=
r a discussion about the &quot;extend me&quot; proposal idea, I investigate=
d the issues with an annotation-based approach. I concluded that the only w=
ay to make it work would be to add the equivalent of a<i> third</i> referen=
ce type (whether you spell it with `&amp;&amp;&amp;` or some keyword or att=
ribute associated with a reference parameter, the effect is to have a thing=
 which behaves much like a third kind of reference). Which means you&#39;d =
have to make forwarding references work with such a tool... somehow.</div><=
div><br></div><div>Your attribute-based annotation falls into the same trap=
: once you leave the immediate scope of the code creating the prvalue, it s=
tops being a prvalue. So unless the immediate scope knows that the paramete=
r is going to be used like this, it can&#39;t be annotated properly.</div><=
/div></blockquote><div><br></div><div>You have to give me an example, I am =
not sure I understand the issue. </div><div><br></div><div>My logic is very=
, very simple - as long as we have automatic variables (aka predictable des=
truction) the compiler knows <i>everything</i> needed to track improper use=
, given our specification of improper use.</div></div></blockquote><div>=C2=
=A0</div><div>See above. The compiler cannot just look at the prvalue argum=
ent and an attribute on the parameter to tell what&#39;s going on. `A_view`=
 is not being fed a prvalue; it&#39;s being fed an xvalue. And by all right=
s, that ought to be fine.</div><div><br></div><blockquote class=3D"gmail_qu=
ote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padd=
ing-left: 1ex;"><div dir=3D"ltr"><div>Temporaries, prvalues these have sema=
ntic value to us, but in the end - it is the compiler just rearranging the =
calls the dtors. All is visible to him - he created it. </div><div><br></di=
v><div>If we, in this predictable for the compiler world, want a variable m=
arked so we are informed it is used before another variable from this same =
predictable world, I am pretty sure the compiler can do this for us.</div><=
div><br></div></div><div><div dir=3D"ltr">The point is, not want <i>can&#39=
;t</i> be done (the cases which will not be possible), but what <i>can</i> =
be done. Covering the trivial cases alone is not only better then nothing, =
but will actually amount to 95% of the cases needed to be covered in the fi=
rst place.</div></div></blockquote><div><br></div><div><div style=3D"backgr=
ound-color: transparent; border-bottom-color: rgb(34, 34, 34); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style:=
 none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 3=
4); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); =
font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-s=
erif; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decora=
tion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wid=
th: 0px; white-space: normal; word-spacing: 0px;">No, half-measures are act=
ually worse than doing nothing. Why?</div><div style=3D"background-color: t=
ransparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none=
; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: st=
retch; border-image-slice: 100%; border-image-source: none; border-image-wi=
dth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-to=
p-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: =
&amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-si=
ze: 13px; font-style: normal; font-variant: normal; font-weight: 400; lette=
r-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
 margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: normal; word-spacing: 0px;"><br></div><div style=3D"background-col=
or: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style:=
 none; border-bottom-width: 0px; border-image-outset: 0; border-image-repea=
t: stretch; border-image-slice: 100%; border-image-source: none; border-ima=
ge-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; b=
order-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-st=
yle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bord=
er-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fam=
ily: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; fo=
nt-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; =
letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right:=
 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px; text-align: left; text-decoration: no=
ne; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px;=
 white-space: normal; word-spacing: 0px;">Because right now, we can teach p=
eople &quot;be careful with view types and temporaries&quot;. We can teach =
people about lifetime issues and so forth. Maybe not enough programmers get=
 this lesson, but the information is still out there.</div><div style=3D"ba=
ckground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-b=
ottom-style: none; border-bottom-width: 0px; border-image-outset: 0; border=
-image-repeat: stretch; border-image-slice: 100%; border-image-source: none=
; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-st=
yle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bor=
der-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 3=
4, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 3=
4); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sa=
ns-serif; font-size: 13px; font-style: normal; font-variant: normal; font-w=
eight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-de=
coration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke=
-width: 0px; white-space: normal; word-spacing: 0px;"><br></div><div style=
=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; =
border-image-repeat: stretch; border-image-slice: 100%; border-image-source=
: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34,=
 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;quot;Helvetica&amp;qu=
ot;,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; =
font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; t=
ext-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-=
stroke-width: 0px; white-space: normal; word-spacing: 0px;">But if you give=
 people the illusion that the compiler can handle this issue, that they&#39=
;ll get a compile error or whatever if they improperly use views and tempor=
aries, then people will use view types and temporaries with abandon. They w=
on&#39;t realize that the compiler can&#39;t catch<i> all</i> of these kind=
s of problems. Without the training to avoid this problem, they&#39;re more=
 likely to run into it in indirect initialization cases and so forth, becau=
se they have faith the compiler will tell them when they&#39;re doing it wr=
ong.</div><div style=3D"background-color: transparent; border-bottom-color:=
 rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bord=
er-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%;=
 border-image-source: none; border-image-width: 1; border-left-color: rgb(3=
4, 34, 34); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width:=
 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&amp;q=
uot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: normal; fo=
nt-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; pa=
dding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;=
 text-align: left; text-decoration: none; text-indent: 0px; text-transform:=
 none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0=
px;"><br></div><div style=3D"background-color: transparent; border-bottom-c=
olor: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px;=
 border-image-outset: 0; border-image-repeat: stretch; border-image-slice: =
100%; border-image-source: none; border-image-width: 1; border-left-color: =
rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-ri=
ght-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0=
px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-w=
idth: 0px; color: rgb(34, 34, 34); font-family: &amp;quot;Arial&amp;quot;,&=
amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; font-style: norma=
l; font-variant: normal; font-weight: 400; letter-spacing: normal; margin-b=
ottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: =
2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top:=
 0px; text-align: left; text-decoration: none; text-indent: 0px; text-trans=
form: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spaci=
ng: 0px;">If you can&#39;t solve this problem, better to do nothing at all.=
 At least then, we&#39;ll always be on our toes. Better that than to become=
 complacent.</div></div><div><br></div><blockquote class=3D"gmail_quote" st=
yle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-lef=
t: 1ex;"><div dir=3D"ltr"><blockquote class=3D"gmail_quote" style=3D"margin=
:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div>Ultimately, I&#39;ve come to believe that the only reasonable=
 solution is something like `extend_me`: something which explicitly extends=
 the lifetime of a temporary, which is the responsibility of the writer of =
the prvalue expression to properly use.</div><div><br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc=
 solid;padding-left:1ex"><div dir=3D"ltr"><div>Actually I will not be surpr=
ised if implementations start doing that <span>by themselves</span> (warnin=
g in cases thy can verify). The question is, why the initiative should alwa=
ys come from them?</div></div></blockquote><div><br></div><div>Because the =
interaction between two rules of the standard makes this legal code behave =
in a way that is unexpected but clearly explicitly specified.</div></div></=
blockquote><div><br></div><div>Does not change the fact the standard not ma=
ndating warnings, it is the implementation which must take the initiative -=
 warning for assignment in if statement, warning for no return, for fallthr=
ough, for empty statements, etc etc. These save lifes for pros and juniors =
alike.=C2=A0</div></div></blockquote><blockquote class=3D"gmail_quote" styl=
e=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(2=
04, 204, 204); border-left-width: 1px; border-left-style: solid;">=C2=A0</b=
lockquote><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.=
8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-=
width: 1px; border-left-style: solid;"><i></i></blockquote><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #c=
cc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>Ironically all the stand=
ard did is a way to turn these warnings off if they do not match the intend=
.. However, how about the standard turning warnings on (in cases impl. agree=
 are implementable).</div></div></blockquote><div><br></div><div>The standa=
rd defines behavior. Warnings are not behavior. Thus, it has no right to ma=
ndate warnings.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div dir=3D"ltr"><div>Granted [[deprecated]] is such an example but=
, that is way too little, compared to what it is possible.</div><div><br></=
div><div><br></div><div>Sure it is better to make this code illegal, but wh=
at if it is not possible or too hard? As the saying (in my language) goes -=
 [<b>It is] better [to have a]<span style=3D"color:rgb(0,0,0);min-height:au=
to;margin-bottom:0px;margin-left:4px;margin-right:0px;margin-top:1px;vertic=
al-align:top;white-space:nowrap">sparrow in the hand, then an eagle in the =
sky.</span></b></div><div><br></div></div></blockquote></div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/dc689be1-8ab4-4c06-86d9-4d9d9cc313b4%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/dc689be1-8ab4-4c06-86d9-4d9d9cc313b4=
%40isocpp.org</a>.<br />

------=_Part_5611_925091296.1516038484341--

------=_Part_5610_1263075780.1516038484340--

.
