It would be better to have the warning and no-warning cases for typeid next to each other. Otherwise, LGTM, thanks!
Does this also fix the same issue for -Wunused-comparison? 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
