Skip to content
  • Richard Smith's avatar
    DR583, DR1512: Implement a rewrite to C++'s 'composite pointer type' rules. · 4b6ad142
    Richard Smith authored
    This has two significant effects:
    
    1) Direct relational comparisons between null pointer constants (0 and nullopt)
       and pointers are now ill-formed. This was always the case for C, and it
       appears that C++ only ever permitted by accident. For instance, cases like
         nullptr < &a
       are now rejected.
    
    2) Comparisons and conditional operators between differently-cv-qualified
       pointer types now work, and produce a composite type that both source
       pointer types can convert to (when possible). For instance, comparison
       between 'int **' and 'const int **' is now valid, and uses an intermediate
       type of 'const int *const *'.
    
    Clang previously supported #2 as an extension.
    
    We do not accept the cases in #1 as an extension. I've tested a fair amount of
    code to check that this doesn't break it, but if it turns out that someone is
    relying on this, we can easily add it back as an extension.
    
    This is a re-commit of r284800.
    
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284890 91177308-0d34-0410-b5e6-96231b3b80d8
    4b6ad142