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@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits