krsch created this revision. krsch added reviewers: NoQ, xazax.hun. Herald added a subscriber: rnkovacs. Herald added a project: All. krsch requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Do not suggest to take the address of a const pointer to get void* Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D138426 Files: clang/lib/Sema/SemaFixItUtils.cpp clang/test/FixIt/fixit-function-call.cpp Index: clang/test/FixIt/fixit-function-call.cpp =================================================================== --- clang/test/FixIt/fixit-function-call.cpp +++ clang/test/FixIt/fixit-function-call.cpp @@ -115,4 +115,16 @@ u(c); } +void accept_void(void*); + +void issue58958(const char* a) { +// CHECK: no matching function for call to 'accept_void' +// CHECK-NOT: take the address of the argument with & + accept_void(a); + char b; +// CHECK: no matching function for call to 'accept_void' +// CHECK: take the address of the argument with & + accept_void(b); +} + // CHECK: errors generated Index: clang/lib/Sema/SemaFixItUtils.cpp =================================================================== --- clang/lib/Sema/SemaFixItUtils.cpp +++ clang/lib/Sema/SemaFixItUtils.cpp @@ -132,6 +132,13 @@ if (!Expr->isLValue() || Expr->getObjectKind() != OK_Ordinary) return false; + // Do no take address of const pointer to get void* + const PointerType *FromPtrTy = dyn_cast<PointerType>(FromQTy); + const PointerType *ToPtrTy = dyn_cast<PointerType>(ToQTy); + if (FromPtrTy && FromPtrTy->getPointeeType().isConstQualified() && + ToPtrTy->isVoidPointerType()) + return false; + CanConvert = CompareTypes(S.Context.getPointerType(FromQTy), ToQTy, S, Begin, VK_PRValue); if (CanConvert) {
Index: clang/test/FixIt/fixit-function-call.cpp =================================================================== --- clang/test/FixIt/fixit-function-call.cpp +++ clang/test/FixIt/fixit-function-call.cpp @@ -115,4 +115,16 @@ u(c); } +void accept_void(void*); + +void issue58958(const char* a) { +// CHECK: no matching function for call to 'accept_void' +// CHECK-NOT: take the address of the argument with & + accept_void(a); + char b; +// CHECK: no matching function for call to 'accept_void' +// CHECK: take the address of the argument with & + accept_void(b); +} + // CHECK: errors generated Index: clang/lib/Sema/SemaFixItUtils.cpp =================================================================== --- clang/lib/Sema/SemaFixItUtils.cpp +++ clang/lib/Sema/SemaFixItUtils.cpp @@ -132,6 +132,13 @@ if (!Expr->isLValue() || Expr->getObjectKind() != OK_Ordinary) return false; + // Do no take address of const pointer to get void* + const PointerType *FromPtrTy = dyn_cast<PointerType>(FromQTy); + const PointerType *ToPtrTy = dyn_cast<PointerType>(ToQTy); + if (FromPtrTy && FromPtrTy->getPointeeType().isConstQualified() && + ToPtrTy->isVoidPointerType()) + return false; + CanConvert = CompareTypes(S.Context.getPointerType(FromQTy), ToQTy, S, Begin, VK_PRValue); if (CanConvert) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits