diff options
Diffstat (limited to 'clang/lib/Sema/SemaAvailability.cpp')
-rw-r--r-- | clang/lib/Sema/SemaAvailability.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index bf4a226668f7..05ad42780e50 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -19,6 +19,7 @@ #include "clang/Sema/DelayedDiagnostic.h" #include "clang/Sema/ScopeInfo.h" #include "clang/Sema/Sema.h" +#include <optional> using namespace clang; using namespace sema; @@ -192,6 +193,9 @@ shouldDiagnoseAvailabilityByDefault(const ASTContext &Context, case llvm::Triple::MacOSX: ForceAvailabilityFromVersion = VersionTuple(/*Major=*/10, /*Minor=*/13); break; + case llvm::Triple::ShaderModel: + // Always enable availability diagnostics for shader models. + return true; default: // New targets should always warn about availability. return Triple.getVendor() == llvm::Triple::Apple; @@ -241,16 +245,16 @@ struct AttributeInsertion { /// attribute argument. /// \param SlotNames The vector that will be populated with slot names. In case /// of unsuccessful parsing can contain invalid data. -/// \returns A number of method parameters if parsing was successful, None -/// otherwise. -static Optional<unsigned> +/// \returns A number of method parameters if parsing was successful, +/// std::nullopt otherwise. +static std::optional<unsigned> tryParseObjCMethodName(StringRef Name, SmallVectorImpl<StringRef> &SlotNames, const LangOptions &LangOpts) { // Accept replacements starting with - or + as valid ObjC method names. if (!Name.empty() && (Name.front() == '-' || Name.front() == '+')) Name = Name.drop_front(1); if (Name.empty()) - return None; + return std::nullopt; Name.split(SlotNames, ':'); unsigned NumParams; if (Name.back() == ':') { @@ -260,7 +264,7 @@ tryParseObjCMethodName(StringRef Name, SmallVectorImpl<StringRef> &SlotNames, } else { if (SlotNames.size() != 1) // Not a valid method name, just a colon-separated string. - return None; + return std::nullopt; NumParams = 0; } // Verify all slot names are valid. @@ -269,28 +273,28 @@ tryParseObjCMethodName(StringRef Name, SmallVectorImpl<StringRef> &SlotNames, if (S.empty()) continue; if (!isValidAsciiIdentifier(S, AllowDollar)) - return None; + return std::nullopt; } return NumParams; } /// Returns a source location in which it's appropriate to insert a new /// attribute for the given declaration \D. -static Optional<AttributeInsertion> +static std::optional<AttributeInsertion> createAttributeInsertion(const NamedDecl *D, const SourceManager &SM, const LangOptions &LangOpts) { if (isa<ObjCPropertyDecl>(D)) return AttributeInsertion::createInsertionAfter(D); if (const auto *MD = dyn_cast<ObjCMethodDecl>(D)) { if (MD->hasBody()) - return None; + return std::nullopt; return AttributeInsertion::createInsertionAfter(D); } if (const auto *TD = dyn_cast<TagDecl>(D)) { SourceLocation Loc = Lexer::getLocForEndOfToken(TD->getInnerLocStart(), 0, SM, LangOpts); if (Loc.isInvalid()) - return None; + return std::nullopt; // Insert after the 'struct'/whatever keyword. return AttributeInsertion::createInsertionAfter(Loc); } @@ -397,7 +401,7 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, return; if (!S.getPreprocessor().isMacroDefined("API_AVAILABLE")) return; - Optional<AttributeInsertion> Insertion = createAttributeInsertion( + std::optional<AttributeInsertion> Insertion = createAttributeInsertion( Enclosing, S.getSourceManager(), S.getLangOpts()); if (!Insertion) return; @@ -499,7 +503,7 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, if (const auto *MethodDecl = dyn_cast<ObjCMethodDecl>(ReferringDecl)) { Selector Sel = MethodDecl->getSelector(); SmallVector<StringRef, 12> SelectorSlotNames; - Optional<unsigned> NumParams = tryParseObjCMethodName( + std::optional<unsigned> NumParams = tryParseObjCMethodName( Replacement, SelectorSlotNames, S.getLangOpts()); if (NumParams && *NumParams == Sel.getNumArgs()) { assert(SelectorSlotNames.size() == Locs.size()); @@ -895,6 +899,11 @@ void Sema::DiagnoseUnguardedAvailabilityViolations(Decl *D) { return; Body = FD->getBody(); + + if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) + for (const CXXCtorInitializer *CI : CD->inits()) + DiagnoseUnguardedAvailability(*this, D).IssueDiagnostics(CI->getInit()); + } else if (auto *MD = dyn_cast<ObjCMethodDecl>(D)) Body = MD->getBody(); else if (auto *BD = dyn_cast<BlockDecl>(D)) |