On Mon, May 11, 2015 at 12:27 PM, Charlie Turner <[email protected]> wrote:
> In http://reviews.llvm.org/D9157#159383, @rsmith wrote: > > > What is the motivation for this? Every version of libstdc++ I can find > uses the keyword `bool` and not a typedef. > > > Sorry for the late reply Richard... I've also lost the previous thread I > had with. I originally suggested the motivation was for cases like, > > typedef bool BOOL; > > class Foo { > static const BOOL __is_signed; > }; > > #include <map> > > int main() {} > > But as you pointed out, this is ill-formed. I found a smaller example, > which I'm confident is well-formed yet rejected by Clang, > > typedef bool Bool; > #define bool Bool > > #include <algorithm> > > int main(void) {} > > I see the following errors > > In file included from blentest.c:4: > In file included from > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/algorithm:61: > In file included from > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:63: > > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/ext/numeric_traits.h:63:25: > error: expected member name or ';' after declaration specifiers > static const bool __is_signed = __glibcxx_signed(_Value); > ~~~~~~~~~~~~~~~~~ ^ > > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/ext/numeric_traits.h:74:50: > error: expected unqualified-id > const bool __numeric_traits_integer<_Value>::__is_signed; > ^ > > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/ext/numeric_traits.h:106:25: > error: expected member name or ';' after declaration specifiers > static const bool __is_signed = true; > ~~~~~~~~~~~~~~~~~ ^ > > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/ext/numeric_traits.h:115:51: > error: expected unqualified-id > const bool __numeric_traits_floating<_Value>::__is_signed; > ^ > In file included from blentest.c:4: > In file included from > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/algorithm:61: > > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:941:49: > error: expected unqualified-id > && !__gnu_cxx::__numeric_traits<_ValueType1>::__is_signed > ^ > > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:946:45: > error: non-type template argument of type 'Bool' (aka 'bool') is not an > integral constant expression > return std::__lexicographical_compare<__simple>::__lc(__first1, > __last1, > ^~~~~~~~ > 6 errors generated. > > The only restrictions I can see stated in the C++ standard (N4296, > 2014-11-19) are in section 17.6.4.3.1, and they only cover that you're not > allowed to `#define` or `#undef` names declared in a standard library > header, or `override`, `final` and some other bits about attributes. It also says "names lexically identical to keywords", which covers 'bool'. > `bool` is a fundamental type, so I think my example above should be > accepted. > > I think reopening PR9804 for this was incorrect, it looks quite similar, > but perhaps I should open a new PR for this issue. Do you agree? > > Thank you for your time. :) > > > REPOSITORY > rL LLVM > > http://reviews.llvm.org/D9157 > > EMAIL PREFERENCES > http://reviews.llvm.org/settings/panel/emailpreferences/ > > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
