@@ -3815,131 +3815,6 @@ void MissingMemberFailure::diagnoseUnsafeCxxMethod(SourceLoc loc,
38153815 !isa_and_nonnull<clang::CXXRecordDecl>(
38163816 baseType->getAnyNominal ()->getClangDecl ()))
38173817 return ;
3818-
3819- if (name.getBaseIdentifier ().str () == " getFromPointer" ||
3820- name.getBaseIdentifier ().str () == " isValid" ||
3821- name.getBaseIdentifier ().str () == " __dataUnsafe" ||
3822- name.getBaseIdentifier ().str () == " __getOpaquePointerValueUnsafe" ||
3823- name.getBaseIdentifier ().str () == " __getStartUnsafe" ||
3824- name.getBaseIdentifier ().str () == " __c_strUnsafe" ) {
3825- // OK, we did not find a member that we probably should have.
3826- // Dump the world.
3827- llvm::dbgs () << " ====================================================\n " ;
3828- llvm::dbgs () << " ====================================================\n\n " ;
3829- llvm::dbgs () << " Hello! You have unfortuantly stubled across an interop bug that we have been trying to track down for a while. Please reach out to Zoe Carver and provide a link to this build. You can re-run this build and it should work next time. Sorry for the inconvience.\n\n " ;
3830- llvm::dbgs () << " ====================================================\n " ;
3831- llvm::dbgs () << " ====================================================\n\n " ;
3832-
3833- llvm::dbgs () << " THE NAME: " ; name.dump ();
3834-
3835- llvm::dbgs () << " ====================================================\n " ;
3836- llvm::dbgs () << " ====================================================\n\n " ;
3837-
3838- auto cxxRecord = cast<clang::CXXRecordDecl>(baseType->getAnyNominal ()->getClangDecl ());
3839- llvm::dbgs () << " CXX RECORD: " ; cxxRecord->dump ();
3840-
3841- llvm::dbgs () << " ====================================================\n " ;
3842- llvm::dbgs () << " ====================================================\n\n " ;
3843-
3844- auto dumpRedecls = [](const clang::CXXRecordDecl *cxxRecordToDump) {
3845- llvm::dbgs () << " REDECLS:\n " ;
3846- unsigned redeclIdx = 0 ;
3847- for (auto redecl : cxxRecordToDump->redecls ()) {
3848- llvm::dbgs () << " REDECL(" << redeclIdx << " ): " ; redecl->dump ();
3849- redeclIdx++;
3850- }
3851- };
3852-
3853- dumpRedecls (cxxRecord);
3854-
3855- llvm::dbgs () << " ====================================================\n " ;
3856- llvm::dbgs () << " ====================================================\n\n " ;
3857- if (name.getBaseIdentifier ().str () == " getFromPointer" ||
3858- name.getBaseIdentifier ().str () == " isValid" ) {
3859- llvm::dbgs () << " LOOKUP UNSAFE VERSION:\n " ;
3860- auto unsafeId =
3861- ctx.getIdentifier (" __" + name.getBaseIdentifier ().str ().str () + " Unsafe" );
3862- for (auto found :
3863- baseType->getAnyNominal ()->lookupDirect (DeclBaseName (unsafeId))) {
3864- llvm::dbgs () << " **FOUND UNSAFE VERSION**\n " ;
3865- llvm::dbgs () << " UNSAFE: " ;
3866- found->dump ();
3867-
3868- if (auto cxxMethod = dyn_cast_or_null<clang::CXXMethodDecl>(found->getClangDecl ())) {
3869- llvm::dbgs () << " FOUND CXX METHOD." ;
3870- auto returnType = cxxMethod->getReturnType ();
3871- llvm::dbgs () << " CXX METHOD RETURN TYPE: " ;
3872- returnType->dump ();
3873-
3874- llvm::dbgs () << " CAN RETURN TYPE: " ;
3875- returnType->getCanonicalTypeUnqualified ().dump ();
3876-
3877- if (auto recordType = dyn_cast<clang::RecordType>(returnType)) {
3878- dumpRedecls (returnType->getAsCXXRecordDecl ());
3879- } else {
3880- llvm::dbgs () << " NOT A RECORD TYPE\n " ;
3881- }
3882- }
3883- }
3884- } else {
3885- std::string safeName;
3886- if (name.getBaseIdentifier ().str () == " __dataUnsafe" )
3887- safeName = " data" ;
3888- if (name.getBaseIdentifier ().str () == " __getOpaquePointerValueUnsafe" )
3889- safeName = " getOpaquePointerValue" ;
3890- if (name.getBaseIdentifier ().str () == " __getStartUnsafe" )
3891- safeName = " getStart" ;
3892- if (name.getBaseIdentifier ().str () == " __c_strUnsafe" )
3893- safeName = " c_str" ;
3894-
3895- auto safeId = ctx.getIdentifier (safeName);
3896- for (auto found :
3897- baseType->getAnyNominal ()->lookupDirect (DeclBaseName (safeId))) {
3898- llvm::dbgs () << " **FOUND SAFE VERSION**\n " ;
3899- llvm::dbgs () << " UNSAFE: " ;
3900- found->dump ();
3901-
3902- if (auto cxxMethod = dyn_cast_or_null<clang::CXXMethodDecl>(found->getClangDecl ())) {
3903- llvm::dbgs () << " FOUND CXX METHOD." ;
3904- auto returnType = cxxMethod->getReturnType ();
3905- llvm::dbgs () << " CXX METHOD RETURN TYPE: " ;
3906- returnType->dump ();
3907-
3908- llvm::dbgs () << " CAN RETURN TYPE: " ;
3909- returnType->getCanonicalTypeUnqualified ().dump ();
3910-
3911- if (auto recordType = dyn_cast<clang::RecordType>(returnType)) {
3912- dumpRedecls (returnType->getAsCXXRecordDecl ());
3913- } else {
3914- llvm::dbgs () << " NOT A RECORD TYPE\n " ;
3915- }
3916- }
3917- }
3918- }
3919-
3920- llvm::dbgs () << " ====================================================\n " ;
3921- llvm::dbgs () << " ====================================================\n\n " ;
3922- llvm::dbgs () << " (IMPORTED) SWIFT TYPE: " ;
3923- baseType->dump ();
3924-
3925- llvm::dbgs () << " (IMPORTED) SWIFT DECL: " ;
3926- baseType->getAnyNominal ()->dump ();
3927-
3928- // And for my final trick, I will dump the whole lookup table.
3929- llvm::dbgs () << " ====================================================\n " ;
3930- llvm::dbgs () << " ====================================================\n\n " ;
3931- llvm::dbgs () << " LOOKUP TABLE: " ;
3932-
3933- if (auto clangModule = cxxRecord->getOwningModule ()) {
3934- dumpSwiftLookupTable (ctx.getClangModuleLoader ()->findLookupTable (clangModule));
3935- } else {
3936- llvm::dbgs () << " NO MODULE\n " ;
3937- }
3938-
3939- llvm::dbgs () << " ====================================================\n " ;
3940- llvm::dbgs () << " DBUG DUMP DONE\n " ;
3941- llvm::dbgs () << " ====================================================\n\n " ;
3942- }
39433818
39443819 auto unsafeId =
39453820 ctx.getIdentifier (" __" + name.getBaseIdentifier ().str ().str () + " Unsafe" );
0 commit comments