On Thu, Oct 16, 2014 at 4:05 PM, Richard Smith <[email protected]> wrote: > It would be better to have the warning and no-warning cases for typeid next > to each other. Otherwise, LGTM, thanks!
Fixed up and committed in r219954 > Does this also fix the same issue for -Wunused-comparison? It does, so I added another test for it. Thanks! ~Aaron > > On Thu, Oct 16, 2014 at 11:58 AM, Aaron Ballman <[email protected]> > wrote: >> >> Patch attached with more test cases; the typeid case you were >> concerned is also addressed in this patch. >> >> ~Aaron >> >> On Thu, Oct 16, 2014 at 2:27 PM, Aaron Ballman <[email protected]> >> wrote: >> > On Thu, Oct 16, 2014 at 11:28 AM, Aaron Ballman <[email protected]> >> > wrote: >> >> On Thu, Oct 16, 2014 at 10:23 AM, Aaron Ballman >> >> <[email protected]> wrote: >> >>> On Thu, Oct 16, 2014 at 9:05 AM, Aaron Ballman >> >>> <[email protected]> wrote: >> >>>> On Wed, Oct 15, 2014 at 10:33 PM, Richard Smith >> >>>> <[email protected]> wrote: >> >>>>> Does this still warn on cases like: >> >>>>> >> >>>>> typeid(f(), g()); >> >>>>> >> >>>>> where we don't know we've got an evaluated operand until after we've >> >>>>> finished parsing it? >> >>>>> >> >>>>> ... Hmm, we don't seem to get any warning on that case right now. =( >> >>>>> Might >> >>>>> be worth someone looking into that, maybe there are other cases >> >>>>> we're >> >>>>> missing. >> >>> >> >>> I'd like to make sure my understanding is correct. Given: >> >>> >> >>> #include <typeinfo> >> >>> >> >>> struct B { >> >>> virtual int f(); >> >>> }; >> >>> >> >>> struct D : B { >> >>> virtual int f(); >> >>> }; >> >>> >> >>> B *h() __attribute__((warn_unused_result)); >> >>> B *h() { return new D; } >> >>> >> >>> int f() __attribute__((warn_unused_result)); >> >>> int g(); >> >>> >> >>> int main() { >> >>> const auto &t1 = typeid(f(), g()); // Should not warn; unevaluated >> >>> context? >> >>> const auto &t2 = typeid(h(), g()); // Should warn; evaluated >> >>> context? >> >>> } >> >>> >> >>> Is that the test case we're looking at for the typeid portion of this? >> >> >> >> I don't think it is. The result of h(), g() is still int, which is not >> >> a glvalue of polymorphic type. I'm struggling to think of a way in >> >> which I should trigger the unused result warning in the potentially >> >> evaluated case that wouldn't count as a use. >> > >> > Okay, I just needed to eat lunch to figure this out. ;-) >> > >> > #include <typeinfo> >> > >> > struct B { >> > virtual void f(); >> > }; >> > >> > struct D : B { >> > void f() override; >> > }; >> > >> > struct C {}; >> > >> > int f() __attribute__((warn_unused_result)); >> > >> > int main() { >> > D d; >> > C c; >> > (void)typeid(f(), d); // Warn about unused result because d is a >> > glvalue of polymorphic type >> > (void)typeid(f(), c); // Do not warn about unused result, because c >> > is not a polymorphic type >> > } >> > >> > ~Aaron > > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
