r315951 - Make __builtin_types_compatible_p more like GCC's

George Burgess IV via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 16 16:02:20 PDT 2017


Yuck, sorry for the typos in the commit message. It should read:

GCC ignores qualifiers on array types. Since we seem to have this
function primarily for GCC compatibility, we should try to match that
behavior.

This also adds a few more test-cases for __builtin_types_compatible_p,
which were inspired by GCC's documentation on the builtin.

On Mon, Oct 16, 2017 at 3:58 PM, George Burgess IV via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: gbiv
> Date: Mon Oct 16 15:58:37 2017
> New Revision: 315951
>
> URL: http://llvm.org/viewvc/llvm-project?rev=315951&view=rev
> Log:
> Make __builtin_types_compatible_p more like GCC's
>
> GCC ignore qualifiers on array types. Since we seem to have this
> function primarily for GCC compatibility, we should try to match that
> behavior.
>
> This also adds a few more test-cases __builtin_types_compatible_p,
> which were inspired by GCC's documentation on the builtin.
>
> Modified:
>     cfe/trunk/lib/Sema/SemaExprCXX.cpp
>     cfe/trunk/test/Parser/builtin_types_compatible.c
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=315951&r1=315950&r2=315951&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Mon Oct 16 15:58:37 2017
> @@ -4824,9 +4824,13 @@ static bool EvaluateBinaryTypeTrait(Sema
>    }
>    case BTT_IsSame:
>      return Self.Context.hasSameType(LhsT, RhsT);
> -  case BTT_TypeCompatible:
> -    return Self.Context.typesAreCompatible(LhsT.getUnqualifiedType(),
> -                                           RhsT.getUnqualifiedType());
> +  case BTT_TypeCompatible: {
> +    // GCC ignores cv-qualifiers on arrays for this builtin.
> +    Qualifiers LhsQuals, RhsQuals;
> +    QualType Lhs = Self.getASTContext().getUnqualifiedArrayType(LhsT, LhsQuals);
> +    QualType Rhs = Self.getASTContext().getUnqualifiedArrayType(RhsT, RhsQuals);
> +    return Self.Context.typesAreCompatible(Lhs, Rhs);
> +  }
>    case BTT_IsConvertible:
>    case BTT_IsConvertibleTo: {
>      // C++0x [meta.rel]p4:
>
> Modified: cfe/trunk/test/Parser/builtin_types_compatible.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/builtin_types_compatible.c?rev=315951&r1=315950&r2=315951&view=diff
> ==============================================================================
> --- cfe/trunk/test/Parser/builtin_types_compatible.c (original)
> +++ cfe/trunk/test/Parser/builtin_types_compatible.c Mon Oct 16 15:58:37 2017
> @@ -41,3 +41,20 @@ static void test()
>
>  }
>
> +enum E1 { E1Foo };
> +enum E2 { E2Foo };
> +
> +static void testGccCompatibility() {
> +  _Static_assert(__builtin_types_compatible_p(const volatile int, int), "");
> +  _Static_assert(__builtin_types_compatible_p(int[5], int[]), "");
> +  _Static_assert(!__builtin_types_compatible_p(int[5], int[4]), "");
> +  _Static_assert(!__builtin_types_compatible_p(int *, int **), "");
> +  _Static_assert(!__builtin_types_compatible_p(const int *, int *), "");
> +  _Static_assert(!__builtin_types_compatible_p(enum E1, enum E2), "");
> +
> +  // GCC's __builtin_types_compatible_p ignores qualifiers on arrays.
> +  _Static_assert(__builtin_types_compatible_p(const int[4], int[4]), "");
> +  _Static_assert(__builtin_types_compatible_p(int[4], const int[4]), "");
> +  _Static_assert(__builtin_types_compatible_p(const int[5][4], int[][4]), "");
> +  _Static_assert(!__builtin_types_compatible_p(const int(*)[], int(*)[]), "");
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list