@@ -1829,6 +1829,40 @@ static ExprResult PointerAuthStringDiscriminator(Sema &S, CallExpr *Call) {
18291829 return Call;
18301830}
18311831
1832+ static ExprResult GetVTablePointer(Sema &S, CallExpr *Call) {
1833+ if (S.checkArgCount(Call, 1))
1834+ return ExprError();
1835+ Expr *FirstArg = Call->getArg(0);
1836+ ExprResult FirstValue = S.DefaultFunctionArrayLvalueConversion(FirstArg);
1837+ if (FirstValue.isInvalid())
1838+ return ExprError();
1839+ Call->setArg(0, FirstValue.get());
1840+ QualType FirstArgType = FirstArg->getType();
1841+ if (FirstArgType->canDecayToPointerType() && FirstArgType->isArrayType())
1842+ FirstArgType = S.Context.getDecayedType(FirstArgType);
1843+
1844+ const CXXRecordDecl *FirstArgRecord = FirstArgType->getPointeeCXXRecordDecl();
1845+ if (!FirstArgRecord) {
1846+ S.Diag(FirstArg->getBeginLoc(), diag::err_get_vtable_pointer_incorrect_type)
1847+ << /*isPolymorphic=*/0 << FirstArgType;
1848+ return ExprError();
1849+ }
1850+ if (S.RequireCompleteType(
1851+ FirstArg->getBeginLoc(), FirstArgType->getPointeeType(),
1852+ diag::err_get_vtable_pointer_requires_complete_type)) {
1853+ return ExprError();
1854+ }
1855+
1856+ if (!FirstArgRecord->isPolymorphic()) {
1857+ S.Diag(FirstArg->getBeginLoc(), diag::err_get_vtable_pointer_incorrect_type)
1858+ << /*isPolymorphic=*/1 << FirstArgRecord;
1859+ return ExprError();
1860+ }
1861+ QualType ReturnType = S.Context.getPointerType(S.Context.VoidTy.withConst());
1862+ Call->setType(ReturnType);
1863+ return Call;
1864+ }
1865+
18321866static ExprResult BuiltinLaunder(Sema &S, CallExpr *TheCall) {
18331867 if (S.checkArgCount(TheCall, 1))
18341868 return ExprError();
@@ -2727,6 +2761,10 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
27272761 return PointerAuthAuthAndResign(*this, TheCall);
27282762 case Builtin::BI__builtin_ptrauth_string_discriminator:
27292763 return PointerAuthStringDiscriminator(*this, TheCall);
2764+
2765+ case Builtin::BI__builtin_get_vtable_pointer:
2766+ return GetVTablePointer(*this, TheCall);
2767+
27302768 // OpenCL v2.0, s6.13.16 - Pipe functions
27312769 case Builtin::BIread_pipe:
27322770 case Builtin::BIwrite_pipe:
0 commit comments