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]>> 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 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;
 }
Index: test/SemaCXX/enum-scoped.cpp
===================================================================
--- test/SemaCXX/enum-scoped.cpp	(revision 219190)
+++ 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