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