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. `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

Reply via email to