[cfe-users] [cfe-dev] Warnings for implicit constructors and wrong usage of auto

Andrea Arteaga via cfe-users cfe-users at lists.llvm.org
Tue May 15 23:21:40 PDT 2018


Thanks for your reply, John.

I fully understand your points, I actually had the same concern that a
reference-to-rvalue warning would be issued for perfectly reasonable and
intended code. It's still one of those warnings I would like to see when
writing code in an IDE, not when compiling the full project (we would setup
builds with different warning options for these two cases).

For the default constructor warning, I did not mean to be warned when a
default copy constructor exists, just when one is used.

In any case, it does not seem like clang currently implements warnings like
those, right?

Thank you.
Andrea

On Wed, May 16, 2018 at 1:55 AM, John McCall <rjmccall at apple.com> wrote:

> On May 15, 2018, at 7:23 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On 15 May 2018 at 16:01, John McCall via cfe-dev <cfe-dev at lists.llvm.org>
> wrote:
>
>> On May 15, 2018, at 6:05 PM, George Karpenkov via cfe-dev <
>> cfe-dev at lists.llvm.org> wrote:
>>
>> +cfe-dev
>>
>> Hi Andrea,
>>
>> I think you might get more luck asking on the cfe-dev mailing list.
>>
>>
>> George
>>
>> On May 15, 2018, at 1:15 PM, Andrea Arteaga via cfe-users <
>> cfe-users at lists.llvm.org> wrote:
>>
>> Dear all,
>> Recently, my team suffered from a bug due to a double bad usage of C++.
>>
>> We have a function returning a reference to an object:
>>
>>     Object& GetObject();
>>
>> Sometimes we use this function like this:
>>
>>     auto obj = GetObject();
>>
>> This triggers a copy of the object, which we really don't mean. The two
>> problems are:
>> 1. Object does not delete the copy constructor, nor does it declare one.
>> We have a policy of never using implicitly-declared constructors, we either
>> use `=delete` or `=default`. Nevertheless we missed this class.
>>
>>
>> Implicitly-defined copy constructors are ubiquitous in idiomatic C++.
>> Maybe that's not true in your project, but still, this seems too
>> special-case for the compiler.  Maybe a linter that has a more
>> sophisticated model of what code is yours vs. the standard library.
>>
>> 2. A reference is demoted to a rvalue due to the usage of `auto` instead
>> of `auto&`.
>>
>>
>> This is a more reasonable thing to try to warn about.  I have two
>> concerns:
>>   - I don't know a reasonable way to suppress the warning if you really
>> do want to load from the l-value.
>>   - I have a non-specific worry that it'll disrupt some important idiom
>> that I'm just not thinking of.
>>
>
> How about:
>
>   vector<some_complex_type> v = get_vector();
>   auto x = v.front();
>
> or, worse:
>
>   auto y = get_vector().front();
>
>
> Yep, good example.
>
> John.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-users/attachments/20180516/4c1259ca/attachment.html>


More information about the cfe-users mailing list