[PATCH] make isScopedEnumerationType look through typedefs

Richard Smith richard at metafoo.co.uk
Wed Dec 17 11:40:13 PST 2014


The right way to write this is:

-  if (const EnumType *ET = dyn_cast<EnumType>(T))
+  if (const EnumType *ET = T->getAs<EnumType>())

On Tue, Dec 16, 2014 at 5:51 AM, Rafael EspĂ­ndola <
rafael.espindola at gmail.com> wrote:

> LGTM.
>
> Clang is not my expertise, but the patch looks clearly correct, fixes
> a bug and has a testcase.
>
>
> On 16 December 2014 at 04:49, Stephan Bergmann <sbergman at redhat.com>
> wrote:
> > ping
> >
> >
> > On 11/25/2014 03:04 PM, Rafael EspĂ­ndola wrote:
> >>
> >> ccing Richard.
> >> On 25 November 2014 at 03:38, Stephan Bergmann <sbergman at redhat.com>
> >> wrote:
> >>>
> >>> ping
> >>>
> >>>
> >>> On 11/10/2014 06:18 PM, Stephan Bergmann wrote:
> >>>>
> >>>>
> >>>> On 10/23/2014 10:41 AM, David Majnemer wrote:
> >>>>>
> >>>>>
> >>>>> Per the developer policy [1], please add a test case to accompany
> your
> >>>>> change.
> >>>>>
> >>>>> [1] http://llvm.org/docs/DeveloperPolicy.html#test-cases
> >>>>>
> >>>>> Looks good otherwise.
> >>>>
> >>>>
> >>>>
> >>>> Attached updated patch including test case.
> >>>>
> >>>>> On Thu, Oct 23, 2014 at 12:43 AM, Stephan Bergmann <
> sbergman at redhat.com
> >>>>> <mailto:sbergman at redhat.com>> wrote:
> >>>>>
> >>>>>      [ping]
> >>>>>
> >>>>>
> >>>>>      On 10/14/2014 04:12 PM, Stephan Bergmann wrote:
> >>>>>
> >>>>>              $ clang++ --version
> >>>>>              clang version 3.6.0 (trunk 219190)
> >>>>>              Target: x86_64-unknown-linux-gnu
> >>>>>              Thread model: posix
> >>>>>
> >>>>>              $ cat test.cc
> >>>>>              enum class E { e };
> >>>>>              typedef E E2;
> >>>>>              E2 f1() { return E::e; }
> >>>>>              E f2() { return E::e; }
> >>>>>              bool g1() { return !f1(); }
> >>>>>              bool g2() { return !f2(); }
> >>>>>
> >>>>>              $ clang++ -std=c++11 -c test.cc
> >>>>>              test.cc:6:20: error: invalid argument type 'E' to unary
> >>>>>              expression
> >>>>>              bool g2() { return !f2(); }
> >>>>>                                  ^~~~~
> >>>>>              1 error generated.
> >>>>>
> >>>>>
> >>>>>          rightly complains about the invalid contextual conversion to
> >>>>>          bool in g2
> >>>>>          but erroneously not also about the one in g1.
> >>>>>
> >>>>>              Index: lib/Sema/SemaExpr.cpp
> >>>>>
> >>>>>
> ==============================__==============================__=======
> >>>>>              --- lib/Sema/SemaExpr.cpp    (revision 219190)
> >>>>>              +++ lib/Sema/SemaExpr.cpp    (working copy)
> >>>>>              @@ -7414,7 +7414,7 @@
> >>>>>                }
> >>>>>
> >>>>>                static bool isScopedEnumerationType(__QualType T) {
> >>>>>              -  if (const EnumType *ET = dyn_cast<EnumType>(T))
> >>>>>              +  if (const EnumType *ET =
> >>>>>              dyn_cast<EnumType>(T.__getCanonicalType()))
> >>>>>
> >>>>>                    return ET->getDecl()->isScoped();
> >>>>>                  return false;
> >>>>>                }
> >>>>>
> >>>>>
> >>>>>          would fix that for me.
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141217/21651404/attachment.html>


More information about the cfe-commits mailing list