[PATCH] D120936: [Sema][Windows] Don't special-case void* in __unaligned conversions.
Eli Friedman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 3 12:43:09 PST 2022
efriedma created this revision.
efriedma added reviewers: rnk, mstorsjo, andreybokhanko, majnemer, aaron.ballman.
Herald added a project: All.
efriedma requested review of this revision.
Herald added a project: clang.
As far as I can tell, MSVC allows the relevant conversions for all pointer types. Found compiling a Windows SDK header.
I've verified that the updated errors in MicrosoftExtensions.cpp match the ones that MSVC actually emits, except for the one with a FIXME. (Not sure why this wasn't done for the patch that added the tests.)
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D120936
Files:
clang/lib/Sema/SemaOverload.cpp
clang/test/SemaCXX/MicrosoftExtensions.cpp
Index: clang/test/SemaCXX/MicrosoftExtensions.cpp
===================================================================
--- clang/test/SemaCXX/MicrosoftExtensions.cpp
+++ clang/test/SemaCXX/MicrosoftExtensions.cpp
@@ -85,18 +85,18 @@
foo_unaligned(p2);
__unaligned B_unaligned *p3 = 0;
- int p4 = foo_unaligned(p3);
+ int p4 = foo_unaligned(p3); // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'void *'}}
- B_unaligned *p5 = p3; // expected-error {{cannot initialize a variable of type 'B_unaligned *' with an lvalue of type '__unaligned B_unaligned *'}}
+ B_unaligned *p5 = p3;
__unaligned B_unaligned *p6 = p3;
p1_aligned_type4 = p2_aligned_type4;
- p2_aligned_type4 = p1_aligned_type4; // expected-error {{assigning to 'int aligned_type4::*' from incompatible type '__unaligned int aligned_type4::*'}}
+ p2_aligned_type4 = p1_aligned_type4;
p3_aligned_type4 = p1_aligned_type4;
__unaligned int a[10];
- int *b = a; // expected-error {{cannot initialize a variable of type 'int *' with an lvalue of type '__unaligned int[10]'}}
+ int *b = a;
}
// Test from PR27367
@@ -115,13 +115,15 @@
// We should accept type conversion of __unaligned to non-__unaligned references
typedef struct in_addr {
public:
- in_addr(in_addr &a) {} // expected-note {{candidate constructor not viable: no known conversion from '__unaligned IN_ADDR *' (aka '__unaligned in_addr *') to 'in_addr &' for 1st argument; dereference the argument with *}}
- in_addr(in_addr *a) {} // expected-note {{candidate constructor not viable: 1st argument ('__unaligned IN_ADDR *' (aka '__unaligned in_addr *')) would lose __unaligned qualifier}}
+ in_addr(in_addr &a) {} // expected-note {{candidate constructor not viable: expects an lvalue for 1st argument}}
+ in_addr(in_addr *a) {} // expected-note {{candidate constructor not viable: no known conversion from 'IN_ADDR' (aka 'in_addr') to 'in_addr *' for 1st argument}}
} IN_ADDR;
void f(IN_ADDR __unaligned *a) {
IN_ADDR local_addr = *a;
- IN_ADDR local_addr2 = a; // expected-error {{no viable conversion from '__unaligned IN_ADDR *' (aka '__unaligned in_addr *') to 'IN_ADDR' (aka 'in_addr')}}
+ // FIXME: MSVC accepts the following; not sure why clang tries to
+ // copy-construct an in_addr.
+ IN_ADDR local_addr2 = a; // expected-error {{no viable constructor copying variable of type 'IN_ADDR' (aka 'in_addr')}}
}
template<typename T> void h1(T (__stdcall M::* const )()) { }
Index: clang/lib/Sema/SemaOverload.cpp
===================================================================
--- clang/lib/Sema/SemaOverload.cpp
+++ clang/lib/Sema/SemaOverload.cpp
@@ -3195,9 +3195,8 @@
Qualifiers FromQuals = FromType.getQualifiers();
Qualifiers ToQuals = ToType.getQualifiers();
- // Ignore __unaligned qualifier if this type is void.
- if (ToType.getUnqualifiedType()->isVoidType())
- FromQuals.removeUnaligned();
+ // Ignore __unaligned qualifier.
+ FromQuals.removeUnaligned();
// Objective-C ARC:
// Check Objective-C lifetime conversions.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120936.412813.patch
Type: text/x-patch
Size: 3083 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220303/e4a29a4c/attachment-0001.bin>
More information about the cfe-commits
mailing list