Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -6500,6 +6500,8 @@ << NewDecl; S.Diag(OldDecl->getLocation(), diag::note_previous_declaration); NewDecl->dropAttr(); + + assert(NewImportAttr && "!NewImportAttr"); NewDecl->addAttr( DLLExportAttr::CreateImplicit(S.Context, NewImportAttr->getRange())); } else { @@ -10433,7 +10435,7 @@ // Main isn't allowed to become a multiversion function, however it IS // permitted to have 'main' be marked with the 'target' optimization hint. - if (NewFD->isMain()) { + if (NewTA && NewFD->isMain()) { if ((MVType == MultiVersionKind::Target && NewTA->isDefaultVersion()) || MVType == MultiVersionKind::CPUDispatch || MVType == MultiVersionKind::CPUSpecific) { @@ -13199,6 +13201,8 @@ Deduced = DT->getDeducedType(); DeducedDecl = D; } else if (!Context.hasSameType(DT->getDeducedType(), Deduced)) { + assert(DeducedDecl && "!DeducedDecl"); + auto *AT = dyn_cast(DT); Diag(D->getTypeSourceInfo()->getTypeLoc().getBeginLoc(), diag::err_auto_different_deductions) Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -639,6 +639,7 @@ // C++11 [dcl.constexpr]p1: If any declaration of a function or function // template has a constexpr specifier then all its declarations shall // contain the constexpr specifier. + assert(Old && "!Old"); if (New->getConstexprKind() != Old->getConstexprKind()) { Diag(New->getLocation(), diag::err_constexpr_redecl_mismatch) << New << New->getConstexprKind() << Old->getConstexprKind(); @@ -1293,6 +1294,8 @@ } } + assert(BestPath && "!BestPath"); + // ... unambiguous ... QualType BaseType = BestPath->back().Base->getType(); if (Paths.isAmbiguous(S.Context.getCanonicalType(BaseType))) { @@ -2673,7 +2676,7 @@ const CXXRecordDecl *RD = cast(Record->getDecl()); if (Class->isInterface() && (!RD->isInterfaceLike() || - KnownBase->getAccessSpecifier() != AS_public)) { + (KnownBase && KnownBase->getAccessSpecifier() != AS_public))) { // The Microsoft extension __interface does not permit bases that // are not themselves public interfaces. Diag(KnownBase->getBeginLoc(), diag::err_invalid_base_in_interface) Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -4556,7 +4556,7 @@ // resolution for the operator overload should get the first crack // at the overload. bool IsMSPropertySubscript = false; - if (base->getType()->isNonOverloadPlaceholderType()) { + if (base && base->getType()->isNonOverloadPlaceholderType()) { IsMSPropertySubscript = isMSPropertySubscriptExpr(*this, base); if (!IsMSPropertySubscript) { ExprResult result = CheckPlaceholderExpr(base); Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -597,11 +597,11 @@ } } - if (E->getType()->isVariablyModifiedType()) + if (E && E->getType()->isVariablyModifiedType()) return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid) << E->getType()); else if (!inTemplateInstantiation() && - E->HasSideEffects(Context, WasEvaluated)) { + E && E->HasSideEffects(Context, WasEvaluated)) { // The expression operand for typeid is in an unevaluated expression // context, so side effects could result in unintended consequences. Diag(E->getExprLoc(), WasEvaluated Index: clang/lib/Sema/SemaExprObjC.cpp =================================================================== --- clang/lib/Sema/SemaExprObjC.cpp +++ clang/lib/Sema/SemaExprObjC.cpp @@ -589,6 +589,8 @@ } BoxingMethod = StringWithUTF8StringMethod; + assert(BoxingMethod && "!BoxingMethod"); + BoxedType = NSStringPointer; // Transfer the nullability from method's return type. Optional Nullability = Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -5912,11 +5912,11 @@ DeclAccessPair dap; if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer)) { AddZeroInitializationStep(Entity.getType()); - } else if (Initializer->getType() == Context.OverloadTy && + } else if (Initializer && Initializer->getType() == Context.OverloadTy && !S.ResolveAddressOfOverloadedFunction(Initializer, DestType, false, dap)) SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); - else if (Initializer->getType()->isFunctionType() && + else if (Initializer && Initializer->getType()->isFunctionType() && isExprAnUnaddressableFunction(S, Initializer)) SetFailed(InitializationSequence::FK_AddressOfUnaddressableFunction); else Index: clang/lib/Sema/SemaOverload.cpp =================================================================== --- clang/lib/Sema/SemaOverload.cpp +++ clang/lib/Sema/SemaOverload.cpp @@ -10413,7 +10413,8 @@ !ToRefTy->getPointeeType()->isIncompleteType() && S.IsDerivedFrom(SourceLocation(), ToRefTy->getPointeeType(), FromTy)) { BaseToDerivedConversion = 3; - } else if (ToTy->isLValueReferenceType() && !FromExpr->isLValue() && + } else if (ToTy->isLValueReferenceType() && FromExpr && + !FromExpr->isLValue() && ToTy.getNonReferenceType().getCanonicalType() == FromTy.getNonReferenceType().getCanonicalType()) { S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_lvalue) Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5186,7 +5186,7 @@ LocalEagerInstantiationScope LocalInstantiations(*this); VarDecl *OldVar = Var; - if (Def->isStaticDataMember() && !Def->isOutOfLine()) { + if (Def && Def->isStaticDataMember() && !Def->isOutOfLine()) { // We're instantiating an inline static data member whose definition was // provided inside the class. InstantiateVariableInitializer(Var, Def, TemplateArgs); Index: clang/lib/Sema/SemaTemplateVariadic.cpp =================================================================== --- clang/lib/Sema/SemaTemplateVariadic.cpp +++ clang/lib/Sema/SemaTemplateVariadic.cpp @@ -765,6 +765,8 @@ // retain an expansion. if (NumPartialExpansions) { if (NumExpansions && *NumExpansions < *NumPartialExpansions) { + assert(CurrentInstantiationScope && "!CurrentInstantiationScope"); + NamedDecl *PartialPack = CurrentInstantiationScope->getPartiallySubstitutedPack(); Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_partial) Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -8289,7 +8289,7 @@ // unless it's actually needed. if (Tag || IFace) { // Avoid diagnosing invalid decls as incomplete. - if (Def->isInvalidDecl()) + if (Def && Def->isInvalidDecl()) return true; // Give the external AST source a chance to complete the type. Index: clang/lib/Sema/TreeTransform.h =================================================================== --- clang/lib/Sema/TreeTransform.h +++ clang/lib/Sema/TreeTransform.h @@ -13921,7 +13921,7 @@ } // Determine whether this should be a builtin operation. - if (Op == OO_Subscript) { + if (Op == OO_Subscript && Second) { if (!First->getType()->isOverloadableType() && !Second->getType()->isOverloadableType()) return getSema().CreateBuiltinArraySubscriptExpr(