On 12/17/2014 08:40 PM, Richard Smith wrote:
The right way to write this is:

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

updated patch attached

On Tue, Dec 16, 2014 at 5:51 AM, Rafael Espíndola
<[email protected] <mailto:[email protected]>> 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 <[email protected]
    <mailto:[email protected]>> wrote:
     > ping
     >
     >
     > On 11/25/2014 03:04 PM, Rafael Espíndola wrote:
     >>
     >> ccing Richard.
     >> On 25 November 2014 at 03:38, Stephan Bergmann
    <[email protected] <mailto:[email protected]>>
     >> 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
    <[email protected] <mailto:[email protected]>
     >>>>> <mailto:[email protected] <mailto:[email protected]>>> 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.

Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp	(revision 224504)
+++ lib/Sema/SemaExpr.cpp	(working copy)
@@ -7546,7 +7546,7 @@
 }
 
 static bool isScopedEnumerationType(QualType T) {
-  if (const EnumType *ET = dyn_cast<EnumType>(T))
+  if (const EnumType *ET = T->getAs<EnumType>())
     return ET->getDecl()->isScoped();
   return false;
 }
Index: test/SemaCXX/enum-scoped.cpp
===================================================================
--- test/SemaCXX/enum-scoped.cpp	(revision 224504)
+++ test/SemaCXX/enum-scoped.cpp	(working copy)
@@ -301,3 +301,11 @@
   using E::a; // ok!
   E b = a;
 }
+
+namespace test11 {
+  enum class E { a };
+  typedef E E2;
+  E2 f1() { return E::a; }
+
+  bool f() { return !f1(); } // expected-error {{invalid argument type 'E2' (aka 'test11::E') to unary expression}}
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to