diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 1ac0cb2fac72a..28a6ec0acd409 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -216,6 +216,8 @@ Bug Fixes in This Version local structs. - Correctly parse non-ascii identifiers that appear immediately after a line splicing (`#65156 `_`) +- Clang no longer considers the loss of ``__unaligned`` qualifier from objects as + an invalid conversion during method function overload resolution. Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index d69b339306f00..3ba7266122e4c 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -5556,9 +5556,11 @@ TryObjectArgumentInitialization(Sema &S, SourceLocation Loc, QualType FromType, // First check the qualifiers. QualType FromTypeCanon = S.Context.getCanonicalType(FromType); - if (ImplicitParamType.getCVRQualifiers() - != FromTypeCanon.getLocalCVRQualifiers() && - !ImplicitParamType.isAtLeastAsQualifiedAs(FromTypeCanon)) { + // MSVC ignores __unaligned qualifier for overload candidates; do the same. + if (ImplicitParamType.getCVRQualifiers() != + FromTypeCanon.getLocalCVRQualifiers() && + !ImplicitParamType.isAtLeastAsQualifiedAs( + withoutUnaligned(S.Context, FromTypeCanon))) { ICS.setBad(BadConversionSequence::bad_qualifiers, FromType, ImplicitParamType); return ICS; diff --git a/clang/test/SemaCXX/MicrosoftExtensions.cpp b/clang/test/SemaCXX/MicrosoftExtensions.cpp index 960030d44f0c1..7286217b1644f 100644 --- a/clang/test/SemaCXX/MicrosoftExtensions.cpp +++ b/clang/test/SemaCXX/MicrosoftExtensions.cpp @@ -589,6 +589,18 @@ namespace PR42089 { __attribute__((nothrow)) void S::Bar(){} } +namespace UnalignedConv { +struct S { + bool operator==(int) const; +}; + +int func() { + S __unaligned s; + return s == 42; +} +} + + #elif TEST2 // Check that __unaligned is not recognized if MS extensions are not enabled