clang 22.0.0git
Sema.cpp
Go to the documentation of this file.
1//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the actions class which performs semantic analysis and
10// builds an AST out of a parse stream.
11//
12//===----------------------------------------------------------------------===//
13
14#include "UsedDeclVisitor.h"
17#include "clang/AST/Decl.h"
18#include "clang/AST/DeclCXX.h"
20#include "clang/AST/DeclObjC.h"
21#include "clang/AST/Expr.h"
22#include "clang/AST/ExprCXX.h"
24#include "clang/AST/StmtCXX.h"
41#include "clang/Sema/Scope.h"
44#include "clang/Sema/SemaARM.h"
45#include "clang/Sema/SemaAVR.h"
46#include "clang/Sema/SemaBPF.h"
47#include "clang/Sema/SemaCUDA.h"
51#include "clang/Sema/SemaHLSL.h"
54#include "clang/Sema/SemaM68k.h"
55#include "clang/Sema/SemaMIPS.h"
58#include "clang/Sema/SemaObjC.h"
62#include "clang/Sema/SemaPPC.h"
66#include "clang/Sema/SemaSYCL.h"
69#include "clang/Sema/SemaWasm.h"
70#include "clang/Sema/SemaX86.h"
74#include "llvm/ADT/DenseMap.h"
75#include "llvm/ADT/STLExtras.h"
76#include "llvm/ADT/SmallPtrSet.h"
77#include "llvm/Support/TimeProfiler.h"
78#include <optional>
79
80using namespace clang;
81using namespace sema;
82
86
89 bool IncludeComments,
90 std::optional<tok::TokenKind> ExpectedToken) {
91 if (!Loc.isValid())
92 return SourceRange();
93 std::optional<Token> NextToken =
94 Lexer::findNextToken(Loc, SourceMgr, LangOpts, IncludeComments);
95 if (!NextToken)
96 return SourceRange();
97 if (ExpectedToken && NextToken->getKind() != *ExpectedToken)
98 return SourceRange();
99 SourceLocation TokenStart = NextToken->getLocation();
100 SourceLocation TokenEnd = NextToken->getLastLoc();
101 if (!TokenStart.isValid() || !TokenEnd.isValid())
102 return SourceRange();
103 if (!IncludeMacros && (TokenStart.isMacroID() || TokenEnd.isMacroID()))
104 return SourceRange();
105
106 return SourceRange(TokenStart, TokenEnd);
107}
108
109ModuleLoader &Sema::getModuleLoader() const { return PP.getModuleLoader(); }
110
113 StringRef Platform) {
115 if (!SDKInfo && !WarnedDarwinSDKInfoMissing) {
116 Diag(Loc, diag::warn_missing_sdksettings_for_availability_checking)
117 << Platform;
118 WarnedDarwinSDKInfoMissing = true;
119 }
120 return SDKInfo;
121}
122
124 if (CachedDarwinSDKInfo)
125 return CachedDarwinSDKInfo->get();
126 auto SDKInfo = parseDarwinSDKInfo(
127 PP.getFileManager().getVirtualFileSystem(),
128 PP.getHeaderSearchInfo().getHeaderSearchOpts().Sysroot);
129 if (SDKInfo && *SDKInfo) {
130 CachedDarwinSDKInfo = std::make_unique<DarwinSDKInfo>(std::move(**SDKInfo));
131 return CachedDarwinSDKInfo->get();
132 }
133 if (!SDKInfo)
134 llvm::consumeError(SDKInfo.takeError());
135 CachedDarwinSDKInfo = std::unique_ptr<DarwinSDKInfo>();
136 return nullptr;
137}
138
140 const IdentifierInfo *ParamName, unsigned int Index) {
141 std::string InventedName;
142 llvm::raw_string_ostream OS(InventedName);
143
144 if (!ParamName)
145 OS << "auto:" << Index + 1;
146 else
147 OS << ParamName->getName() << ":auto";
148
149 return &Context.Idents.get(OS.str());
150}
151
153 const Preprocessor &PP) {
154 PrintingPolicy Policy = Context.getPrintingPolicy();
155 // In diagnostics, we print _Bool as bool if the latter is defined as the
156 // former.
157 Policy.Bool = Context.getLangOpts().Bool;
158 if (!Policy.Bool) {
159 if (const MacroInfo *BoolMacro = PP.getMacroInfo(Context.getBoolName())) {
160 Policy.Bool = BoolMacro->isObjectLike() &&
161 BoolMacro->getNumTokens() == 1 &&
162 BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
163 }
164 }
165
166 // Shorten the data output if needed
167 Policy.EntireContentsOfLargeArray = false;
168
169 return Policy;
170}
171
173 TUScope = S;
174 PushDeclContext(S, Context.getTranslationUnitDecl());
175}
176
177namespace clang {
178namespace sema {
179
181 Sema *S = nullptr;
184
185public:
186 void set(Sema &S) { this->S = &S; }
187
188 void reset() { S = nullptr; }
189
192 FileID PrevFID) override {
193 if (!S)
194 return;
195 switch (Reason) {
196 case EnterFile: {
197 SourceManager &SM = S->getSourceManager();
198 SourceLocation IncludeLoc = SM.getIncludeLoc(SM.getFileID(Loc));
199 if (IncludeLoc.isValid()) {
200 if (llvm::timeTraceProfilerEnabled()) {
201 OptionalFileEntryRef FE = SM.getFileEntryRefForID(SM.getFileID(Loc));
202 ProfilerStack.push_back(llvm::timeTraceAsyncProfilerBegin(
203 "Source", FE ? FE->getName() : StringRef("<unknown>")));
204 }
205
206 IncludeStack.push_back(IncludeLoc);
207 S->DiagnoseNonDefaultPragmaAlignPack(
209 IncludeLoc);
210 }
211 break;
212 }
213 case ExitFile:
214 if (!IncludeStack.empty()) {
215 if (llvm::timeTraceProfilerEnabled())
216 llvm::timeTraceProfilerEnd(ProfilerStack.pop_back_val());
217
218 S->DiagnoseNonDefaultPragmaAlignPack(
220 IncludeStack.pop_back_val());
221 }
222 break;
223 default:
224 break;
225 }
226 }
227 void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace,
228 diag::Severity Mapping, StringRef Str) override {
229 // If one of the analysis-based diagnostics was enabled while processing
230 // a function, we want to note it in the analysis-based warnings so they
231 // can be run at the end of the function body even if the analysis warnings
232 // are disabled at that point.
234 diag::Flavor Flavor =
236 StringRef Group = Str.substr(2);
237
238 if (S->PP.getDiagnostics().getDiagnosticIDs()->getDiagnosticsInGroup(
239 Flavor, Group, GroupDiags))
240 return;
241
242 for (diag::kind K : GroupDiags) {
243 // Note: the cases in this switch should be kept in sync with the
244 // diagnostics in AnalysisBasedWarnings::getPolicyInEffectAt().
246 S->AnalysisWarnings.getPolicyOverrides();
247 switch (K) {
248 default: break;
249 case diag::warn_unreachable:
250 case diag::warn_unreachable_break:
251 case diag::warn_unreachable_return:
252 case diag::warn_unreachable_loop_increment:
253 Override.enableCheckUnreachable = true;
254 break;
255 case diag::warn_double_lock:
256 Override.enableThreadSafetyAnalysis = true;
257 break;
258 case diag::warn_use_in_invalid_state:
259 Override.enableConsumedAnalysis = true;
260 break;
261 }
262 }
263 }
264};
265
266} // end namespace sema
267} // end namespace clang
268
269const unsigned Sema::MaxAlignmentExponent;
271
276 Context(ctxt), Consumer(consumer), Diags(PP.getDiagnostics()),
280 ExternalSource(nullptr), StackHandler(Diags), CurScope(nullptr),
281 Ident_super(nullptr), AMDGPUPtr(std::make_unique<SemaAMDGPU>(*this)),
282 ARMPtr(std::make_unique<SemaARM>(*this)),
283 AVRPtr(std::make_unique<SemaAVR>(*this)),
284 BPFPtr(std::make_unique<SemaBPF>(*this)),
285 CodeCompletionPtr(
286 std::make_unique<SemaCodeCompletion>(*this, CodeCompleter)),
287 CUDAPtr(std::make_unique<SemaCUDA>(*this)),
288 DirectXPtr(std::make_unique<SemaDirectX>(*this)),
289 HLSLPtr(std::make_unique<SemaHLSL>(*this)),
290 HexagonPtr(std::make_unique<SemaHexagon>(*this)),
291 LoongArchPtr(std::make_unique<SemaLoongArch>(*this)),
292 M68kPtr(std::make_unique<SemaM68k>(*this)),
293 MIPSPtr(std::make_unique<SemaMIPS>(*this)),
294 MSP430Ptr(std::make_unique<SemaMSP430>(*this)),
295 NVPTXPtr(std::make_unique<SemaNVPTX>(*this)),
296 ObjCPtr(std::make_unique<SemaObjC>(*this)),
297 OpenACCPtr(std::make_unique<SemaOpenACC>(*this)),
298 OpenCLPtr(std::make_unique<SemaOpenCL>(*this)),
299 OpenMPPtr(std::make_unique<SemaOpenMP>(*this)),
300 PPCPtr(std::make_unique<SemaPPC>(*this)),
301 PseudoObjectPtr(std::make_unique<SemaPseudoObject>(*this)),
302 RISCVPtr(std::make_unique<SemaRISCV>(*this)),
303 SPIRVPtr(std::make_unique<SemaSPIRV>(*this)),
304 SYCLPtr(std::make_unique<SemaSYCL>(*this)),
305 SwiftPtr(std::make_unique<SemaSwift>(*this)),
306 SystemZPtr(std::make_unique<SemaSystemZ>(*this)),
307 WasmPtr(std::make_unique<SemaWasm>(*this)),
308 X86Ptr(std::make_unique<SemaX86>(*this)),
310 LangOpts.getMSPointerToMemberRepresentationMethod()),
311 MSStructPragmaOn(false), VtorDispStack(LangOpts.getVtorDispMode()),
320 FullyCheckedComparisonCategories(
321 static_cast<unsigned>(ComparisonCategoryType::Last) + 1),
326 ArgPackSubstIndex(std::nullopt), SatisfactionCache(Context) {
327 assert(pp.TUKind == TUKind);
328 TUScope = nullptr;
329
330 LoadedExternalKnownNamespaces = false;
331 for (unsigned I = 0; I != NSAPI::NumNSNumberLiteralMethods; ++I)
332 ObjC().NSNumberLiteralMethods[I] = nullptr;
333
334 if (getLangOpts().ObjC)
335 ObjC().NSAPIObj.reset(new NSAPI(Context));
336
339
340 // Tell diagnostics how to render things from the AST library.
341 Diags.SetArgToStringFn(&FormatASTNodeDiagnosticArgument, &Context);
342
343 // This evaluation context exists to ensure that there's always at least one
344 // valid evaluation context available. It is never removed from the
345 // evaluation stack.
346 ExprEvalContexts.emplace_back(
349
350 // Initialization of data sharing attributes stack for OpenMP
351 OpenMP().InitDataSharingAttributesStack();
352
353 std::unique_ptr<sema::SemaPPCallbacks> Callbacks =
354 std::make_unique<sema::SemaPPCallbacks>();
355 SemaPPCallbackHandler = Callbacks.get();
356 PP.addPPCallbacks(std::move(Callbacks));
357 SemaPPCallbackHandler->set(*this);
358
359 CurFPFeatures.setFPEvalMethod(PP.getCurrentFPEvalMethod());
360}
361
362// Anchor Sema's type info to this TU.
363void Sema::anchor() {}
364
365void Sema::addImplicitTypedef(StringRef Name, QualType T) {
366 DeclarationName DN = &Context.Idents.get(Name);
367 if (IdResolver.begin(DN) == IdResolver.end())
368 PushOnScopeChains(Context.buildImplicitTypedef(T, Name), TUScope);
369}
370
372 // Create BuiltinVaListDecl *before* ExternalSemaSource::InitializeSema(this)
373 // because during initialization ASTReader can emit globals that require
374 // name mangling. And the name mangling uses BuiltinVaListDecl.
375 if (Context.getTargetInfo().hasBuiltinMSVaList())
376 (void)Context.getBuiltinMSVaListDecl();
377 (void)Context.getBuiltinVaListDecl();
378
379 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
380 SC->InitializeSema(*this);
381
382 // Tell the external Sema source about this Sema object.
383 if (ExternalSemaSource *ExternalSema
384 = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
385 ExternalSema->InitializeSema(*this);
386
387 // This needs to happen after ExternalSemaSource::InitializeSema(this) or we
388 // will not be able to merge any duplicate __va_list_tag decls correctly.
389 VAListTagName = PP.getIdentifierInfo("__va_list_tag");
390
391 if (!TUScope)
392 return;
393
394 // Initialize predefined 128-bit integer types, if needed.
395 if (Context.getTargetInfo().hasInt128Type() ||
396 (Context.getAuxTargetInfo() &&
397 Context.getAuxTargetInfo()->hasInt128Type())) {
398 // If either of the 128-bit integer types are unavailable to name lookup,
399 // define them now.
400 DeclarationName Int128 = &Context.Idents.get("__int128_t");
401 if (IdResolver.begin(Int128) == IdResolver.end())
402 PushOnScopeChains(Context.getInt128Decl(), TUScope);
403
404 DeclarationName UInt128 = &Context.Idents.get("__uint128_t");
405 if (IdResolver.begin(UInt128) == IdResolver.end())
406 PushOnScopeChains(Context.getUInt128Decl(), TUScope);
407 }
408
409
410 // Initialize predefined Objective-C types:
411 if (getLangOpts().ObjC) {
412 // If 'SEL' does not yet refer to any declarations, make it refer to the
413 // predefined 'SEL'.
414 DeclarationName SEL = &Context.Idents.get("SEL");
415 if (IdResolver.begin(SEL) == IdResolver.end())
416 PushOnScopeChains(Context.getObjCSelDecl(), TUScope);
417
418 // If 'id' does not yet refer to any declarations, make it refer to the
419 // predefined 'id'.
420 DeclarationName Id = &Context.Idents.get("id");
421 if (IdResolver.begin(Id) == IdResolver.end())
422 PushOnScopeChains(Context.getObjCIdDecl(), TUScope);
423
424 // Create the built-in typedef for 'Class'.
425 DeclarationName Class = &Context.Idents.get("Class");
426 if (IdResolver.begin(Class) == IdResolver.end())
427 PushOnScopeChains(Context.getObjCClassDecl(), TUScope);
428
429 // Create the built-in forward declaratino for 'Protocol'.
430 DeclarationName Protocol = &Context.Idents.get("Protocol");
431 if (IdResolver.begin(Protocol) == IdResolver.end())
432 PushOnScopeChains(Context.getObjCProtocolDecl(), TUScope);
433 }
434
435 // Create the internal type for the *StringMakeConstantString builtins.
436 DeclarationName ConstantString = &Context.Idents.get("__NSConstantString");
437 if (IdResolver.begin(ConstantString) == IdResolver.end())
438 PushOnScopeChains(Context.getCFConstantStringDecl(), TUScope);
439
440 // Initialize Microsoft "predefined C++ types".
441 if (getLangOpts().MSVCCompat) {
442 if (getLangOpts().CPlusPlus &&
443 IdResolver.begin(&Context.Idents.get("type_info")) == IdResolver.end())
444 PushOnScopeChains(Context.getMSTypeInfoTagDecl(), TUScope);
445
446 addImplicitTypedef("size_t", Context.getSizeType());
447 }
448
449 // Initialize predefined OpenCL types and supported extensions and (optional)
450 // core features.
451 if (getLangOpts().OpenCL) {
453 Context.getTargetInfo().getSupportedOpenCLOpts(), getLangOpts());
454 addImplicitTypedef("sampler_t", Context.OCLSamplerTy);
455 addImplicitTypedef("event_t", Context.OCLEventTy);
456 auto OCLCompatibleVersion = getLangOpts().getOpenCLCompatibleVersion();
457 if (OCLCompatibleVersion >= 200) {
458 if (getLangOpts().OpenCLCPlusPlus || getLangOpts().Blocks) {
459 addImplicitTypedef("clk_event_t", Context.OCLClkEventTy);
460 addImplicitTypedef("queue_t", Context.OCLQueueTy);
461 }
462 if (getLangOpts().OpenCLPipes)
463 addImplicitTypedef("reserve_id_t", Context.OCLReserveIDTy);
464 addImplicitTypedef("atomic_int", Context.getAtomicType(Context.IntTy));
465 addImplicitTypedef("atomic_uint",
466 Context.getAtomicType(Context.UnsignedIntTy));
467 addImplicitTypedef("atomic_float",
468 Context.getAtomicType(Context.FloatTy));
469 // OpenCLC v2.0, s6.13.11.6 requires that atomic_flag is implemented as
470 // 32-bit integer and OpenCLC v2.0, s6.1.1 int is always 32-bit wide.
471 addImplicitTypedef("atomic_flag", Context.getAtomicType(Context.IntTy));
472
473
474 // OpenCL v2.0 s6.13.11.6:
475 // - The atomic_long and atomic_ulong types are supported if the
476 // cl_khr_int64_base_atomics and cl_khr_int64_extended_atomics
477 // extensions are supported.
478 // - The atomic_double type is only supported if double precision
479 // is supported and the cl_khr_int64_base_atomics and
480 // cl_khr_int64_extended_atomics extensions are supported.
481 // - If the device address space is 64-bits, the data types
482 // atomic_intptr_t, atomic_uintptr_t, atomic_size_t and
483 // atomic_ptrdiff_t are supported if the cl_khr_int64_base_atomics and
484 // cl_khr_int64_extended_atomics extensions are supported.
485
486 auto AddPointerSizeDependentTypes = [&]() {
487 auto AtomicSizeT = Context.getAtomicType(Context.getSizeType());
488 auto AtomicIntPtrT = Context.getAtomicType(Context.getIntPtrType());
489 auto AtomicUIntPtrT = Context.getAtomicType(Context.getUIntPtrType());
490 auto AtomicPtrDiffT =
491 Context.getAtomicType(Context.getPointerDiffType());
492 addImplicitTypedef("atomic_size_t", AtomicSizeT);
493 addImplicitTypedef("atomic_intptr_t", AtomicIntPtrT);
494 addImplicitTypedef("atomic_uintptr_t", AtomicUIntPtrT);
495 addImplicitTypedef("atomic_ptrdiff_t", AtomicPtrDiffT);
496 };
497
498 if (Context.getTypeSize(Context.getSizeType()) == 32) {
499 AddPointerSizeDependentTypes();
500 }
501
502 if (getOpenCLOptions().isSupported("cl_khr_fp16", getLangOpts())) {
503 auto AtomicHalfT = Context.getAtomicType(Context.HalfTy);
504 addImplicitTypedef("atomic_half", AtomicHalfT);
505 }
506
507 std::vector<QualType> Atomic64BitTypes;
508 if (getOpenCLOptions().isSupported("cl_khr_int64_base_atomics",
509 getLangOpts()) &&
510 getOpenCLOptions().isSupported("cl_khr_int64_extended_atomics",
511 getLangOpts())) {
512 if (getOpenCLOptions().isSupported("cl_khr_fp64", getLangOpts())) {
513 auto AtomicDoubleT = Context.getAtomicType(Context.DoubleTy);
514 addImplicitTypedef("atomic_double", AtomicDoubleT);
515 Atomic64BitTypes.push_back(AtomicDoubleT);
516 }
517 auto AtomicLongT = Context.getAtomicType(Context.LongTy);
518 auto AtomicULongT = Context.getAtomicType(Context.UnsignedLongTy);
519 addImplicitTypedef("atomic_long", AtomicLongT);
520 addImplicitTypedef("atomic_ulong", AtomicULongT);
521
522
523 if (Context.getTypeSize(Context.getSizeType()) == 64) {
524 AddPointerSizeDependentTypes();
525 }
526 }
527 }
528
529#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
530 if (getOpenCLOptions().isSupported(#Ext, getLangOpts())) { \
531 addImplicitTypedef(#ExtType, Context.Id##Ty); \
532 }
533#include "clang/Basic/OpenCLExtensionTypes.def"
534 }
535
536 if (Context.getTargetInfo().hasAArch64ACLETypes() ||
537 (Context.getAuxTargetInfo() &&
538 Context.getAuxTargetInfo()->hasAArch64ACLETypes())) {
539#define SVE_TYPE(Name, Id, SingletonId) \
540 addImplicitTypedef(#Name, Context.SingletonId);
541#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
542 addImplicitTypedef( \
543 #Name, Context.getVectorType(Context.BaseType, NumEls, VectorKind));
544#include "clang/Basic/AArch64ACLETypes.def"
545 }
546
547 if (Context.getTargetInfo().getTriple().isPPC64()) {
548#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
549 addImplicitTypedef(#Name, Context.Id##Ty);
550#include "clang/Basic/PPCTypes.def"
551#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
552 addImplicitTypedef(#Name, Context.Id##Ty);
553#include "clang/Basic/PPCTypes.def"
554 }
555
556 if (Context.getTargetInfo().hasRISCVVTypes()) {
557#define RVV_TYPE(Name, Id, SingletonId) \
558 addImplicitTypedef(Name, Context.SingletonId);
559#include "clang/Basic/RISCVVTypes.def"
560 }
561
562 if (Context.getTargetInfo().getTriple().isWasm() &&
563 Context.getTargetInfo().hasFeature("reference-types")) {
564#define WASM_TYPE(Name, Id, SingletonId) \
565 addImplicitTypedef(Name, Context.SingletonId);
566#include "clang/Basic/WebAssemblyReferenceTypes.def"
567 }
568
569 if (Context.getTargetInfo().getTriple().isAMDGPU() ||
570 (Context.getAuxTargetInfo() &&
571 Context.getAuxTargetInfo()->getTriple().isAMDGPU())) {
572#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
573 addImplicitTypedef(Name, Context.SingletonId);
574#include "clang/Basic/AMDGPUTypes.def"
575 }
576
577 if (Context.getTargetInfo().hasBuiltinMSVaList()) {
578 DeclarationName MSVaList = &Context.Idents.get("__builtin_ms_va_list");
579 if (IdResolver.begin(MSVaList) == IdResolver.end())
580 PushOnScopeChains(Context.getBuiltinMSVaListDecl(), TUScope);
581 }
582
583 DeclarationName BuiltinVaList = &Context.Idents.get("__builtin_va_list");
584 if (IdResolver.begin(BuiltinVaList) == IdResolver.end())
585 PushOnScopeChains(Context.getBuiltinVaListDecl(), TUScope);
586}
587
589 assert(InstantiatingSpecializations.empty() &&
590 "failed to clean up an InstantiatingTemplate?");
591
593
594 // Kill all the active scopes.
596 delete FSI;
597
598 // Tell the SemaConsumer to forget about us; we're going out of scope.
599 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
600 SC->ForgetSema();
601
602 // Detach from the external Sema source.
603 if (ExternalSemaSource *ExternalSema
604 = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
605 ExternalSema->ForgetSema();
606
607 // Delete cached satisfactions.
608 std::vector<ConstraintSatisfaction *> Satisfactions;
609 Satisfactions.reserve(SatisfactionCache.size());
610 for (auto &Node : SatisfactionCache)
611 Satisfactions.push_back(&Node);
612 for (auto *Node : Satisfactions)
613 delete Node;
614
616
617 // Destroys data sharing attributes stack for OpenMP
618 OpenMP().DestroyDataSharingAttributesStack();
619
620 // Detach from the PP callback handler which outlives Sema since it's owned
621 // by the preprocessor.
622 SemaPPCallbackHandler->reset();
623}
624
626 llvm::function_ref<void()> Fn) {
627 StackHandler.runWithSufficientStackSpace(Loc, Fn);
628}
629
631 UnavailableAttr::ImplicitReason reason) {
632 // If we're not in a function, it's an error.
633 FunctionDecl *fn = dyn_cast<FunctionDecl>(CurContext);
634 if (!fn) return false;
635
636 // If we're in template instantiation, it's an error.
638 return false;
639
640 // If that function's not in a system header, it's an error.
641 if (!Context.getSourceManager().isInSystemHeader(loc))
642 return false;
643
644 // If the function is already unavailable, it's not an error.
645 if (fn->hasAttr<UnavailableAttr>()) return true;
646
647 fn->addAttr(UnavailableAttr::CreateImplicit(Context, "", reason, loc));
648 return true;
649}
650
654
656 assert(E && "Cannot use with NULL ptr");
657
658 if (!ExternalSource) {
659 ExternalSource = std::move(E);
660 return;
661 }
662
663 if (auto *Ex = dyn_cast<MultiplexExternalSemaSource>(ExternalSource.get()))
664 Ex->AddSource(std::move(E));
665 else
666 ExternalSource = llvm::makeIntrusiveRefCnt<MultiplexExternalSemaSource>(
667 ExternalSource, std::move(E));
668}
669
670void Sema::PrintStats() const {
671 llvm::errs() << "\n*** Semantic Analysis Stats:\n";
672 if (SFINAETrap *Trap = getSFINAEContext())
673 llvm::errs() << int(Trap->hasErrorOccurred())
674 << " SFINAE diagnostics trapped.\n";
675
676 BumpAlloc.PrintStats();
677 AnalysisWarnings.PrintStats();
678}
679
681 QualType SrcType,
682 SourceLocation Loc) {
683 std::optional<NullabilityKind> ExprNullability = SrcType->getNullability();
684 if (!ExprNullability || (*ExprNullability != NullabilityKind::Nullable &&
685 *ExprNullability != NullabilityKind::NullableResult))
686 return;
687
688 std::optional<NullabilityKind> TypeNullability = DstType->getNullability();
689 if (!TypeNullability || *TypeNullability != NullabilityKind::NonNull)
690 return;
691
692 Diag(Loc, diag::warn_nullability_lost) << SrcType << DstType;
693}
694
695// Generate diagnostics when adding or removing effects in a type conversion.
697 SourceLocation Loc) {
698 const auto SrcFX = FunctionEffectsRef::get(SrcType);
699 const auto DstFX = FunctionEffectsRef::get(DstType);
700 if (SrcFX != DstFX) {
701 for (const auto &Diff : FunctionEffectDiffVector(SrcFX, DstFX)) {
702 if (Diff.shouldDiagnoseConversion(SrcType, SrcFX, DstType, DstFX))
703 Diag(Loc, diag::warn_invalid_add_func_effects) << Diff.effectName();
704 }
705 }
706}
707
709 // nullptr only exists from C++11 on, so don't warn on its absence earlier.
711 return;
712
713 if (Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
714 return;
715
716 const Expr *EStripped = E->IgnoreParenImpCasts();
717 if (EStripped->getType()->isNullPtrType())
718 return;
719 if (isa<GNUNullExpr>(EStripped))
720 return;
721
722 if (Diags.isIgnored(diag::warn_zero_as_null_pointer_constant,
723 E->getBeginLoc()))
724 return;
725
726 // Don't diagnose the conversion from a 0 literal to a null pointer argument
727 // in a synthesized call to operator<=>.
728 if (!CodeSynthesisContexts.empty() &&
729 CodeSynthesisContexts.back().Kind ==
731 return;
732
733 // Ignore null pointers in defaulted comparison operators.
735 if (FD && FD->isDefaulted()) {
736 return;
737 }
738
739 // If it is a macro from system header, and if the macro name is not "NULL",
740 // do not warn.
741 // Note that uses of "NULL" will be ignored above on systems that define it
742 // as __null.
743 SourceLocation MaybeMacroLoc = E->getBeginLoc();
744 if (Diags.getSuppressSystemWarnings() &&
745 SourceMgr.isInSystemMacro(MaybeMacroLoc) &&
746 !findMacroSpelling(MaybeMacroLoc, "NULL"))
747 return;
748
749 Diag(E->getBeginLoc(), diag::warn_zero_as_null_pointer_constant)
751}
752
753/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
754/// If there is already an implicit cast, merge into the existing one.
755/// The result is of the given category.
758 const CXXCastPath *BasePath,
760#ifndef NDEBUG
761 if (VK == VK_PRValue && !E->isPRValue()) {
762 switch (Kind) {
763 default:
764 llvm_unreachable(
765 ("can't implicitly cast glvalue to prvalue with this cast "
766 "kind: " +
767 std::string(CastExpr::getCastKindName(Kind)))
768 .c_str());
769 case CK_Dependent:
770 case CK_LValueToRValue:
771 case CK_ArrayToPointerDecay:
772 case CK_FunctionToPointerDecay:
773 case CK_ToVoid:
774 case CK_NonAtomicToAtomic:
775 case CK_HLSLArrayRValue:
776 case CK_HLSLAggregateSplatCast:
777 break;
778 }
779 }
780 assert((VK == VK_PRValue || Kind == CK_Dependent || !E->isPRValue()) &&
781 "can't cast prvalue to glvalue");
782#endif
783
786 if (Context.hasAnyFunctionEffects() && !isCast(CCK) &&
787 Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
789
790 QualType ExprTy = Context.getCanonicalType(E->getType());
791 QualType TypeTy = Context.getCanonicalType(Ty);
792
793 // This cast is used in place of a regular LValue to RValue cast for
794 // HLSL Array Parameter Types. It needs to be emitted even if
795 // ExprTy == TypeTy, except if E is an HLSLOutArgExpr
796 // Emitting a cast in that case will prevent HLSLOutArgExpr from
797 // being handled properly in EmitCallArg
798 if (Kind == CK_HLSLArrayRValue && !isa<HLSLOutArgExpr>(E))
799 return ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK,
801
802 if (ExprTy == TypeTy)
803 return E;
804
805 if (Kind == CK_ArrayToPointerDecay) {
806 // C++1z [conv.array]: The temporary materialization conversion is applied.
807 // We also use this to fuel C++ DR1213, which applies to C++11 onwards.
808 if (getLangOpts().CPlusPlus && E->isPRValue()) {
809 // The temporary is an lvalue in C++98 and an xvalue otherwise.
811 E->getType(), E, !getLangOpts().CPlusPlus11);
812 if (Materialized.isInvalid())
813 return ExprError();
814 E = Materialized.get();
815 }
816 // C17 6.7.1p6 footnote 124: The implementation can treat any register
817 // declaration simply as an auto declaration. However, whether or not
818 // addressable storage is actually used, the address of any part of an
819 // object declared with storage-class specifier register cannot be
820 // computed, either explicitly(by use of the unary & operator as discussed
821 // in 6.5.3.2) or implicitly(by converting an array name to a pointer as
822 // discussed in 6.3.2.1).Thus, the only operator that can be applied to an
823 // array declared with storage-class specifier register is sizeof.
824 if (VK == VK_PRValue && !getLangOpts().CPlusPlus && !E->isPRValue()) {
825 if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
826 if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
827 if (VD->getStorageClass() == SC_Register) {
828 Diag(E->getExprLoc(), diag::err_typecheck_address_of)
829 << /*register variable*/ 3 << E->getSourceRange();
830 return ExprError();
831 }
832 }
833 }
834 }
835 }
836
837 if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {
838 if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
839 ImpCast->setType(Ty);
840 ImpCast->setValueKind(VK);
841 return E;
842 }
843 }
844
845 return ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK,
847}
848
850 switch (ScalarTy->getScalarTypeKind()) {
851 case Type::STK_Bool: return CK_NoOp;
852 case Type::STK_CPointer: return CK_PointerToBoolean;
853 case Type::STK_BlockPointer: return CK_PointerToBoolean;
854 case Type::STK_ObjCObjectPointer: return CK_PointerToBoolean;
855 case Type::STK_MemberPointer: return CK_MemberPointerToBoolean;
856 case Type::STK_Integral: return CK_IntegralToBoolean;
857 case Type::STK_Floating: return CK_FloatingToBoolean;
858 case Type::STK_IntegralComplex: return CK_IntegralComplexToBoolean;
859 case Type::STK_FloatingComplex: return CK_FloatingComplexToBoolean;
860 case Type::STK_FixedPoint: return CK_FixedPointToBoolean;
861 }
862 llvm_unreachable("unknown scalar type kind");
863}
864
865/// Used to prune the decls of Sema's UnusedFileScopedDecls vector.
866static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
867 if (D->getMostRecentDecl()->isUsed())
868 return true;
869
870 if (D->isExternallyVisible())
871 return true;
872
873 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
874 // If this is a function template and none of its specializations is used,
875 // we should warn.
876 if (FunctionTemplateDecl *Template = FD->getDescribedFunctionTemplate())
877 for (const auto *Spec : Template->specializations())
878 if (ShouldRemoveFromUnused(SemaRef, Spec))
879 return true;
880
881 // UnusedFileScopedDecls stores the first declaration.
882 // The declaration may have become definition so check again.
883 const FunctionDecl *DeclToCheck;
884 if (FD->hasBody(DeclToCheck))
885 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
886
887 // Later redecls may add new information resulting in not having to warn,
888 // so check again.
889 DeclToCheck = FD->getMostRecentDecl();
890 if (DeclToCheck != FD)
891 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
892 }
893
894 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
895 // If a variable usable in constant expressions is referenced,
896 // don't warn if it isn't used: if the value of a variable is required
897 // for the computation of a constant expression, it doesn't make sense to
898 // warn even if the variable isn't odr-used. (isReferenced doesn't
899 // precisely reflect that, but it's a decent approximation.)
900 if (VD->isReferenced() &&
901 VD->mightBeUsableInConstantExpressions(SemaRef->Context))
902 return true;
903
904 if (VarTemplateDecl *Template = VD->getDescribedVarTemplate())
905 // If this is a variable template and none of its specializations is used,
906 // we should warn.
907 for (const auto *Spec : Template->specializations())
908 if (ShouldRemoveFromUnused(SemaRef, Spec))
909 return true;
910
911 // UnusedFileScopedDecls stores the first declaration.
912 // The declaration may have become definition so check again.
913 const VarDecl *DeclToCheck = VD->getDefinition();
914 if (DeclToCheck)
915 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
916
917 // Later redecls may add new information resulting in not having to warn,
918 // so check again.
919 DeclToCheck = VD->getMostRecentDecl();
920 if (DeclToCheck != VD)
921 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
922 }
923
924 return false;
925}
926
927static bool isFunctionOrVarDeclExternC(const NamedDecl *ND) {
928 if (const auto *FD = dyn_cast<FunctionDecl>(ND))
929 return FD->isExternC();
930 return cast<VarDecl>(ND)->isExternC();
931}
932
933/// Determine whether ND is an external-linkage function or variable whose
934/// type has no linkage.
936 // Note: it's not quite enough to check whether VD has UniqueExternalLinkage,
937 // because we also want to catch the case where its type has VisibleNoLinkage,
938 // which does not affect the linkage of VD.
939 return getLangOpts().CPlusPlus && VD->hasExternalFormalLinkage() &&
942}
943
944/// Obtains a sorted list of functions and variables that are undefined but
945/// ODR-used.
947 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> > &Undefined) {
948 for (const auto &UndefinedUse : UndefinedButUsed) {
949 NamedDecl *ND = UndefinedUse.first;
950
951 // Ignore attributes that have become invalid.
952 if (ND->isInvalidDecl()) continue;
953
954 // __attribute__((weakref)) is basically a definition.
955 if (ND->hasAttr<WeakRefAttr>()) continue;
956
958 continue;
959
960 if (ND->hasAttr<DLLImportAttr>() || ND->hasAttr<DLLExportAttr>()) {
961 // An exported function will always be emitted when defined, so even if
962 // the function is inline, it doesn't have to be emitted in this TU. An
963 // imported function implies that it has been exported somewhere else.
964 continue;
965 }
966
967 if (const auto *FD = dyn_cast<FunctionDecl>(ND)) {
968 if (FD->isDefined())
969 continue;
970 if (FD->isExternallyVisible() &&
972 !FD->getMostRecentDecl()->isInlined() &&
973 !FD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
974 continue;
975 if (FD->getBuiltinID())
976 continue;
977 } else {
978 const auto *VD = cast<VarDecl>(ND);
979 if (VD->hasDefinition() != VarDecl::DeclarationOnly)
980 continue;
981 if (VD->isExternallyVisible() &&
983 !VD->getMostRecentDecl()->isInline() &&
984 !VD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
985 continue;
986
987 // Skip VarDecls that lack formal definitions but which we know are in
988 // fact defined somewhere.
989 if (VD->isKnownToBeDefined())
990 continue;
991 }
992
993 Undefined.push_back(std::make_pair(ND, UndefinedUse.second));
994 }
995}
996
997/// checkUndefinedButUsed - Check for undefined objects with internal linkage
998/// or that are inline.
1000 if (S.UndefinedButUsed.empty()) return;
1001
1002 // Collect all the still-undefined entities with internal linkage.
1005 S.UndefinedButUsed.clear();
1006 if (Undefined.empty()) return;
1007
1008 for (const auto &Undef : Undefined) {
1009 ValueDecl *VD = cast<ValueDecl>(Undef.first);
1010 SourceLocation UseLoc = Undef.second;
1011
1012 if (S.isExternalWithNoLinkageType(VD)) {
1013 // C++ [basic.link]p8:
1014 // A type without linkage shall not be used as the type of a variable
1015 // or function with external linkage unless
1016 // -- the entity has C language linkage
1017 // -- the entity is not odr-used or is defined in the same TU
1018 //
1019 // As an extension, accept this in cases where the type is externally
1020 // visible, since the function or variable actually can be defined in
1021 // another translation unit in that case.
1023 ? diag::ext_undefined_internal_type
1024 : diag::err_undefined_internal_type)
1025 << isa<VarDecl>(VD) << VD;
1026 } else if (!VD->isExternallyVisible()) {
1027 // FIXME: We can promote this to an error. The function or variable can't
1028 // be defined anywhere else, so the program must necessarily violate the
1029 // one definition rule.
1030 bool IsImplicitBase = false;
1031 if (const auto *BaseD = dyn_cast<FunctionDecl>(VD)) {
1032 auto *DVAttr = BaseD->getAttr<OMPDeclareVariantAttr>();
1033 if (DVAttr && !DVAttr->getTraitInfo().isExtensionActive(
1034 llvm::omp::TraitProperty::
1035 implementation_extension_disable_implicit_base)) {
1036 const auto *Func = cast<FunctionDecl>(
1037 cast<DeclRefExpr>(DVAttr->getVariantFuncRef())->getDecl());
1038 IsImplicitBase = BaseD->isImplicit() &&
1039 Func->getIdentifier()->isMangledOpenMPVariantName();
1040 }
1041 }
1042 if (!S.getLangOpts().OpenMP || !IsImplicitBase)
1043 S.Diag(VD->getLocation(), diag::warn_undefined_internal)
1044 << isa<VarDecl>(VD) << VD;
1045 } else if (auto *FD = dyn_cast<FunctionDecl>(VD)) {
1046 (void)FD;
1047 assert(FD->getMostRecentDecl()->isInlined() &&
1048 "used object requires definition but isn't inline or internal?");
1049 // FIXME: This is ill-formed; we should reject.
1050 S.Diag(VD->getLocation(), diag::warn_undefined_inline) << VD;
1051 } else {
1052 assert(cast<VarDecl>(VD)->getMostRecentDecl()->isInline() &&
1053 "used var requires definition but isn't inline or internal?");
1054 S.Diag(VD->getLocation(), diag::err_undefined_inline_var) << VD;
1055 }
1056 if (UseLoc.isValid())
1057 S.Diag(UseLoc, diag::note_used_here);
1058 }
1059}
1060
1062 if (!ExternalSource)
1063 return;
1064
1066 ExternalSource->ReadWeakUndeclaredIdentifiers(WeakIDs);
1067 for (auto &WeakID : WeakIDs)
1068 (void)WeakUndeclaredIdentifiers[WeakID.first].insert(WeakID.second);
1069}
1070
1071
1072typedef llvm::DenseMap<const CXXRecordDecl*, bool> RecordCompleteMap;
1073
1074/// Returns true, if all methods and nested classes of the given
1075/// CXXRecordDecl are defined in this translation unit.
1076///
1077/// Should only be called from ActOnEndOfTranslationUnit so that all
1078/// definitions are actually read.
1080 RecordCompleteMap &MNCComplete) {
1081 RecordCompleteMap::iterator Cache = MNCComplete.find(RD);
1082 if (Cache != MNCComplete.end())
1083 return Cache->second;
1084 if (!RD->isCompleteDefinition())
1085 return false;
1086 bool Complete = true;
1088 E = RD->decls_end();
1089 I != E && Complete; ++I) {
1090 if (const CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I))
1091 Complete = M->isDefined() || M->isDefaulted() ||
1092 (M->isPureVirtual() && !isa<CXXDestructorDecl>(M));
1093 else if (const FunctionTemplateDecl *F = dyn_cast<FunctionTemplateDecl>(*I))
1094 // If the template function is marked as late template parsed at this
1095 // point, it has not been instantiated and therefore we have not
1096 // performed semantic analysis on it yet, so we cannot know if the type
1097 // can be considered complete.
1098 Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&
1099 F->getTemplatedDecl()->isDefined();
1100 else if (const CXXRecordDecl *R = dyn_cast<CXXRecordDecl>(*I)) {
1101 if (R->isInjectedClassName())
1102 continue;
1103 if (R->hasDefinition())
1104 Complete = MethodsAndNestedClassesComplete(R->getDefinition(),
1105 MNCComplete);
1106 else
1107 Complete = false;
1108 }
1109 }
1110 MNCComplete[RD] = Complete;
1111 return Complete;
1112}
1113
1114/// Returns true, if the given CXXRecordDecl is fully defined in this
1115/// translation unit, i.e. all methods are defined or pure virtual and all
1116/// friends, friend functions and nested classes are fully defined in this
1117/// translation unit.
1118///
1119/// Should only be called from ActOnEndOfTranslationUnit so that all
1120/// definitions are actually read.
1122 RecordCompleteMap &RecordsComplete,
1123 RecordCompleteMap &MNCComplete) {
1124 RecordCompleteMap::iterator Cache = RecordsComplete.find(RD);
1125 if (Cache != RecordsComplete.end())
1126 return Cache->second;
1127 bool Complete = MethodsAndNestedClassesComplete(RD, MNCComplete);
1129 E = RD->friend_end();
1130 I != E && Complete; ++I) {
1131 // Check if friend classes and methods are complete.
1132 if (TypeSourceInfo *TSI = (*I)->getFriendType()) {
1133 // Friend classes are available as the TypeSourceInfo of the FriendDecl.
1134 if (CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
1135 Complete = MethodsAndNestedClassesComplete(FriendD, MNCComplete);
1136 else
1137 Complete = false;
1138 } else {
1139 // Friend functions are available through the NamedDecl of FriendDecl.
1140 if (const FunctionDecl *FD =
1141 dyn_cast<FunctionDecl>((*I)->getFriendDecl()))
1142 Complete = FD->isDefined();
1143 else
1144 // This is a template friend, give up.
1145 Complete = false;
1146 }
1147 }
1148 RecordsComplete[RD] = Complete;
1149 return Complete;
1150}
1151
1153 if (ExternalSource)
1154 ExternalSource->ReadUnusedLocalTypedefNameCandidates(
1157 if (TD->isReferenced())
1158 continue;
1159 Diag(TD->getLocation(), diag::warn_unused_local_typedef)
1160 << isa<TypeAliasDecl>(TD) << TD->getDeclName();
1161 }
1163}
1164
1166 if (getLangOpts().CPlusPlusModules &&
1167 getLangOpts().getCompilingModule() == LangOptions::CMK_HeaderUnit)
1168 HandleStartOfHeaderUnit();
1169}
1170
1172 if (Kind == TUFragmentKind::Global) {
1173 // Perform Pending Instantiations at the end of global module fragment so
1174 // that the module ownership of TU-level decls won't get messed.
1175 llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");
1177 return;
1178 }
1179
1180 // Transfer late parsed template instantiations over to the pending template
1181 // instantiation list. During normal compilation, the late template parser
1182 // will be installed and instantiating these templates will succeed.
1183 //
1184 // If we are building a TU prefix for serialization, it is also safe to
1185 // transfer these over, even though they are not parsed. The end of the TU
1186 // should be outside of any eager template instantiation scope, so when this
1187 // AST is deserialized, these templates will not be parsed until the end of
1188 // the combined TU.
1193
1194 // If DefinedUsedVTables ends up marking any virtual member functions it
1195 // might lead to more pending template instantiations, which we then need
1196 // to instantiate.
1198
1199 // C++: Perform implicit template instantiations.
1200 //
1201 // FIXME: When we perform these implicit instantiations, we do not
1202 // carefully keep track of the point of instantiation (C++ [temp.point]).
1203 // This means that name lookup that occurs within the template
1204 // instantiation will always happen at the end of the translation unit,
1205 // so it will find some names that are not required to be found. This is
1206 // valid, but we could do better by diagnosing if an instantiation uses a
1207 // name that was not visible at its first point of instantiation.
1208 if (ExternalSource) {
1209 // Load pending instantiations from the external source.
1211 ExternalSource->ReadPendingInstantiations(Pending);
1212 for (auto PII : Pending)
1213 if (auto Func = dyn_cast<FunctionDecl>(PII.first))
1214 Func->setInstantiationIsPending(true);
1216 Pending.begin(), Pending.end());
1217 }
1218
1219 {
1220 llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");
1222 }
1223
1225
1226 assert(LateParsedInstantiations.empty() &&
1227 "end of TU template instantiation should not create more "
1228 "late-parsed templates");
1229}
1230
1232 assert(DelayedDiagnostics.getCurrentPool() == nullptr
1233 && "reached end of translation unit with a pool attached?");
1234
1235 // If code completion is enabled, don't perform any end-of-translation-unit
1236 // work.
1237 if (PP.isCodeCompletionEnabled())
1238 return;
1239
1240 // Complete translation units and modules define vtables and perform implicit
1241 // instantiations. PCH files do not.
1242 if (TUKind != TU_Prefix) {
1244
1246 !ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1250
1252 } else {
1253 // If we are building a TU prefix for serialization, it is safe to transfer
1254 // these over, even though they are not parsed. The end of the TU should be
1255 // outside of any eager template instantiation scope, so when this AST is
1256 // deserialized, these templates will not be parsed until the end of the
1257 // combined TU.
1262
1263 if (LangOpts.PCHInstantiateTemplates) {
1264 llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");
1266 }
1267 }
1268
1273
1274 // All delayed member exception specs should be checked or we end up accepting
1275 // incompatible declarations.
1278
1279 // All dllexport classes should have been processed already.
1280 assert(DelayedDllExportClasses.empty());
1281 assert(DelayedDllExportMemberFunctions.empty());
1282
1283 // Remove file scoped decls that turned out to be used.
1285 std::remove_if(UnusedFileScopedDecls.begin(nullptr, true),
1287 [this](const DeclaratorDecl *DD) {
1288 return ShouldRemoveFromUnused(this, DD);
1289 }),
1290 UnusedFileScopedDecls.end());
1291
1292 if (TUKind == TU_Prefix) {
1293 // Translation unit prefixes don't need any of the checking below.
1294 if (!PP.isIncrementalProcessingEnabled())
1295 TUScope = nullptr;
1296 return;
1297 }
1298
1299 // Check for #pragma weak identifiers that were never declared
1301 for (const auto &WeakIDs : WeakUndeclaredIdentifiers) {
1302 if (WeakIDs.second.empty())
1303 continue;
1304
1305 Decl *PrevDecl = LookupSingleName(TUScope, WeakIDs.first, SourceLocation(),
1307 if (PrevDecl != nullptr &&
1308 !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl)))
1309 for (const auto &WI : WeakIDs.second)
1310 Diag(WI.getLocation(), diag::warn_attribute_wrong_decl_type)
1311 << "'weak'" << /*isRegularKeyword=*/0 << ExpectedVariableOrFunction;
1312 else
1313 for (const auto &WI : WeakIDs.second)
1314 Diag(WI.getLocation(), diag::warn_weak_identifier_undeclared)
1315 << WeakIDs.first;
1316 }
1317
1318 if (LangOpts.CPlusPlus11 &&
1319 !Diags.isIgnored(diag::warn_delegating_ctor_cycle, SourceLocation()))
1321
1322 if (!Diags.hasErrorOccurred()) {
1323 if (ExternalSource)
1324 ExternalSource->ReadUndefinedButUsed(UndefinedButUsed);
1325 checkUndefinedButUsed(*this);
1326 }
1327
1328 // A global-module-fragment is only permitted within a module unit.
1329 if (!ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1331 Diag(ModuleScopes.back().BeginLoc,
1332 diag::err_module_declaration_missing_after_global_module_introducer);
1333 } else if (getLangOpts().getCompilingModule() ==
1335 // We can't use ModuleScopes here since ModuleScopes is always
1336 // empty if we're compiling the BMI.
1337 !getASTContext().getCurrentNamedModule()) {
1338 // If we are building a module interface unit, we should have seen the
1339 // module declaration.
1340 //
1341 // FIXME: Make a better guess as to where to put the module declaration.
1342 Diag(getSourceManager().getLocForStartOfFile(
1343 getSourceManager().getMainFileID()),
1344 diag::err_module_declaration_missing);
1345 }
1346
1347 // Now we can decide whether the modules we're building need an initializer.
1348 if (Module *CurrentModule = getCurrentModule();
1349 CurrentModule && CurrentModule->isInterfaceOrPartition()) {
1350 auto DoesModNeedInit = [this](Module *M) {
1351 if (!getASTContext().getModuleInitializers(M).empty())
1352 return true;
1353 for (auto [Exported, _] : M->Exports)
1354 if (Exported->isNamedModuleInterfaceHasInit())
1355 return true;
1356 for (Module *I : M->Imports)
1358 return true;
1359
1360 return false;
1361 };
1362
1363 CurrentModule->NamedModuleHasInit =
1364 DoesModNeedInit(CurrentModule) ||
1365 llvm::any_of(CurrentModule->submodules(), DoesModNeedInit);
1366 }
1367
1368 if (TUKind == TU_ClangModule) {
1369 // If we are building a module, resolve all of the exported declarations
1370 // now.
1371 if (Module *CurrentModule = PP.getCurrentModule()) {
1372 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
1373
1375 Stack.push_back(CurrentModule);
1376 while (!Stack.empty()) {
1377 Module *Mod = Stack.pop_back_val();
1378
1379 // Resolve the exported declarations and conflicts.
1380 // FIXME: Actually complain, once we figure out how to teach the
1381 // diagnostic client to deal with complaints in the module map at this
1382 // point.
1383 ModMap.resolveExports(Mod, /*Complain=*/false);
1384 ModMap.resolveUses(Mod, /*Complain=*/false);
1385 ModMap.resolveConflicts(Mod, /*Complain=*/false);
1386
1387 // Queue the submodules, so their exports will also be resolved.
1388 auto SubmodulesRange = Mod->submodules();
1389 Stack.append(SubmodulesRange.begin(), SubmodulesRange.end());
1390 }
1391 }
1392
1393 // Warnings emitted in ActOnEndOfTranslationUnit() should be emitted for
1394 // modules when they are built, not every time they are used.
1396 }
1397
1398 // C++ standard modules. Diagnose cases where a function is declared inline
1399 // in the module purview but has no definition before the end of the TU or
1400 // the start of a Private Module Fragment (if one is present).
1401 if (!PendingInlineFuncDecls.empty()) {
1402 for (auto *D : PendingInlineFuncDecls) {
1403 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
1404 bool DefInPMF = false;
1405 if (auto *FDD = FD->getDefinition()) {
1406 DefInPMF = FDD->getOwningModule()->isPrivateModule();
1407 if (!DefInPMF)
1408 continue;
1409 }
1410 Diag(FD->getLocation(), diag::err_export_inline_not_defined)
1411 << DefInPMF;
1412 // If we have a PMF it should be at the end of the ModuleScopes.
1413 if (DefInPMF &&
1414 ModuleScopes.back().Module->Kind == Module::PrivateModuleFragment) {
1415 Diag(ModuleScopes.back().BeginLoc,
1416 diag::note_private_module_fragment);
1417 }
1418 }
1419 }
1420 PendingInlineFuncDecls.clear();
1421 }
1422
1423 // C99 6.9.2p2:
1424 // A declaration of an identifier for an object that has file
1425 // scope without an initializer, and without a storage-class
1426 // specifier or with the storage-class specifier static,
1427 // constitutes a tentative definition. If a translation unit
1428 // contains one or more tentative definitions for an identifier,
1429 // and the translation unit contains no external definition for
1430 // that identifier, then the behavior is exactly as if the
1431 // translation unit contains a file scope declaration of that
1432 // identifier, with the composite type as of the end of the
1433 // translation unit, with an initializer equal to 0.
1435 for (TentativeDefinitionsType::iterator
1436 T = TentativeDefinitions.begin(ExternalSource.get()),
1437 TEnd = TentativeDefinitions.end();
1438 T != TEnd; ++T) {
1439 VarDecl *VD = (*T)->getActingDefinition();
1440
1441 // If the tentative definition was completed, getActingDefinition() returns
1442 // null. If we've already seen this variable before, insert()'s second
1443 // return value is false.
1444 if (!VD || VD->isInvalidDecl() || !Seen.insert(VD).second)
1445 continue;
1446
1447 if (const IncompleteArrayType *ArrayT
1448 = Context.getAsIncompleteArrayType(VD->getType())) {
1449 // Set the length of the array to 1 (C99 6.9.2p5).
1450 Diag(VD->getLocation(), diag::warn_tentative_incomplete_array);
1451 llvm::APInt One(Context.getTypeSize(Context.getSizeType()), true);
1452 QualType T = Context.getConstantArrayType(
1453 ArrayT->getElementType(), One, nullptr, ArraySizeModifier::Normal, 0);
1454 VD->setType(T);
1455 } else if (RequireCompleteType(VD->getLocation(), VD->getType(),
1456 diag::err_tentative_def_incomplete_type))
1457 VD->setInvalidDecl();
1458
1459 // No initialization is performed for a tentative definition.
1461
1462 // In C, if the definition is const-qualified and has no initializer, it
1463 // is left uninitialized unless it has static or thread storage duration.
1464 QualType Type = VD->getType();
1465 if (!VD->isInvalidDecl() && !getLangOpts().CPlusPlus &&
1466 Type.isConstQualified() && !VD->getAnyInitializer()) {
1467 unsigned DiagID = diag::warn_default_init_const_unsafe;
1468 if (VD->getStorageDuration() == SD_Static ||
1470 DiagID = diag::warn_default_init_const;
1471
1472 bool EmitCppCompat = !Diags.isIgnored(
1473 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
1474 VD->getLocation());
1475
1476 Diag(VD->getLocation(), DiagID) << Type << EmitCppCompat;
1477 }
1478
1479 // Notify the consumer that we've completed a tentative definition.
1480 if (!VD->isInvalidDecl())
1481 Consumer.CompleteTentativeDefinition(VD);
1482 }
1483
1484 // In incremental mode, tentative definitions belong to the current
1485 // partial translation unit (PTU). Once they have been completed and
1486 // emitted to codegen, drop them to prevent re-emission in future PTUs.
1487 if (PP.isIncrementalProcessingEnabled())
1489 TentativeDefinitions.end());
1490
1491 for (auto *D : ExternalDeclarations) {
1492 if (!D || D->isInvalidDecl() || D->getPreviousDecl() || !D->isUsed())
1493 continue;
1494
1495 Consumer.CompleteExternalDeclaration(D);
1496 }
1497
1498 if (LangOpts.HLSL)
1499 HLSL().ActOnEndOfTranslationUnit(getASTContext().getTranslationUnitDecl());
1500
1501 // If there were errors, disable 'unused' warnings since they will mostly be
1502 // noise. Don't warn for a use from a module: either we should warn on all
1503 // file-scope declarations in modules or not at all, but whether the
1504 // declaration is used is immaterial.
1505 if (!Diags.hasErrorOccurred() && TUKind != TU_ClangModule) {
1506 // Output warning for unused file scoped decls.
1507 for (UnusedFileScopedDeclsType::iterator
1508 I = UnusedFileScopedDecls.begin(ExternalSource.get()),
1509 E = UnusedFileScopedDecls.end();
1510 I != E; ++I) {
1511 if (ShouldRemoveFromUnused(this, *I))
1512 continue;
1513
1514 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
1515 const FunctionDecl *DiagD;
1516 if (!FD->hasBody(DiagD))
1517 DiagD = FD;
1518 if (DiagD->isDeleted())
1519 continue; // Deleted functions are supposed to be unused.
1520 SourceRange DiagRange = DiagD->getLocation();
1521 if (const ASTTemplateArgumentListInfo *ASTTAL =
1523 DiagRange.setEnd(ASTTAL->RAngleLoc);
1524 if (DiagD->isReferenced()) {
1525 if (isa<CXXMethodDecl>(DiagD))
1526 Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)
1527 << DiagD << DiagRange;
1528 else {
1529 if (FD->getStorageClass() == SC_Static &&
1530 !FD->isInlineSpecified() &&
1531 !SourceMgr.isInMainFile(
1532 SourceMgr.getExpansionLoc(FD->getLocation())))
1533 Diag(DiagD->getLocation(),
1534 diag::warn_unneeded_static_internal_decl)
1535 << DiagD << DiagRange;
1536 else
1537 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
1538 << /*function=*/0 << DiagD << DiagRange;
1539 }
1540 } else if (!FD->isTargetMultiVersion() ||
1541 FD->isTargetMultiVersionDefault()) {
1542 if (FD->getDescribedFunctionTemplate())
1543 Diag(DiagD->getLocation(), diag::warn_unused_template)
1544 << /*function=*/0 << DiagD << DiagRange;
1545 else
1546 Diag(DiagD->getLocation(), isa<CXXMethodDecl>(DiagD)
1547 ? diag::warn_unused_member_function
1548 : diag::warn_unused_function)
1549 << DiagD << DiagRange;
1550 }
1551 } else {
1552 const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition();
1553 if (!DiagD)
1554 DiagD = cast<VarDecl>(*I);
1555 SourceRange DiagRange = DiagD->getLocation();
1556 if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(DiagD)) {
1557 if (const ASTTemplateArgumentListInfo *ASTTAL =
1558 VTSD->getTemplateArgsAsWritten())
1559 DiagRange.setEnd(ASTTAL->RAngleLoc);
1560 }
1561 if (DiagD->isReferenced()) {
1562 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
1563 << /*variable=*/1 << DiagD << DiagRange;
1564 } else if (DiagD->getDescribedVarTemplate()) {
1565 Diag(DiagD->getLocation(), diag::warn_unused_template)
1566 << /*variable=*/1 << DiagD << DiagRange;
1567 } else if (DiagD->getType().isConstQualified()) {
1568 const SourceManager &SM = SourceMgr;
1569 if (SM.getMainFileID() != SM.getFileID(DiagD->getLocation()) ||
1570 !PP.getLangOpts().IsHeaderFile)
1571 Diag(DiagD->getLocation(), diag::warn_unused_const_variable)
1572 << DiagD << DiagRange;
1573 } else {
1574 Diag(DiagD->getLocation(), diag::warn_unused_variable)
1575 << DiagD << DiagRange;
1576 }
1577 }
1578 }
1579
1581 }
1582
1583 if (!Diags.isIgnored(diag::warn_unused_private_field, SourceLocation())) {
1584 // FIXME: Load additional unused private field candidates from the external
1585 // source.
1586 RecordCompleteMap RecordsComplete;
1587 RecordCompleteMap MNCComplete;
1588 for (const NamedDecl *D : UnusedPrivateFields) {
1589 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());
1590 if (RD && !RD->isUnion() &&
1591 IsRecordFullyDefined(RD, RecordsComplete, MNCComplete)) {
1592 Diag(D->getLocation(), diag::warn_unused_private_field)
1593 << D->getDeclName();
1594 }
1595 }
1596 }
1597
1598 if (!Diags.isIgnored(diag::warn_mismatched_delete_new, SourceLocation())) {
1599 if (ExternalSource)
1600 ExternalSource->ReadMismatchingDeleteExpressions(DeleteExprs);
1601 for (const auto &DeletedFieldInfo : DeleteExprs) {
1602 for (const auto &DeleteExprLoc : DeletedFieldInfo.second) {
1603 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first, DeleteExprLoc.first,
1604 DeleteExprLoc.second);
1605 }
1606 }
1607 }
1608
1609 AnalysisWarnings.IssueWarnings(Context.getTranslationUnitDecl());
1610
1611 if (Context.hasAnyFunctionEffects())
1612 performFunctionEffectAnalysis(Context.getTranslationUnitDecl());
1613
1614 // Check we've noticed that we're no longer parsing the initializer for every
1615 // variable. If we miss cases, then at best we have a performance issue and
1616 // at worst a rejects-valid bug.
1617 assert(ParsingInitForAutoVars.empty() &&
1618 "Didn't unmark var as having its initializer parsed");
1619
1620 if (!PP.isIncrementalProcessingEnabled())
1621 TUScope = nullptr;
1622
1623 checkExposure(Context.getTranslationUnitDecl());
1624}
1625
1626
1627//===----------------------------------------------------------------------===//
1628// Helper functions.
1629//===----------------------------------------------------------------------===//
1630
1632 DeclContext *DC = CurContext;
1633
1634 while (true) {
1635 if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC) ||
1637 DC = DC->getParent();
1638 } else if (!AllowLambda && isa<CXXMethodDecl>(DC) &&
1639 cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
1640 cast<CXXRecordDecl>(DC->getParent())->isLambda()) {
1641 DC = DC->getParent()->getParent();
1642 } else break;
1643 }
1644
1645 return DC;
1646}
1647
1648/// getCurFunctionDecl - If inside of a function body, this returns a pointer
1649/// to the function decl for the function being parsed. If we're currently
1650/// in a 'block', this returns the containing context.
1651FunctionDecl *Sema::getCurFunctionDecl(bool AllowLambda) const {
1652 DeclContext *DC = getFunctionLevelDeclContext(AllowLambda);
1653 return dyn_cast<FunctionDecl>(DC);
1654}
1655
1658 while (isa<RecordDecl>(DC))
1659 DC = DC->getParent();
1660 return dyn_cast<ObjCMethodDecl>(DC);
1661}
1662
1666 return cast<NamedDecl>(DC);
1667 return nullptr;
1668}
1669
1675
1676void Sema::EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB) {
1677 // FIXME: It doesn't make sense to me that DiagID is an incoming argument here
1678 // and yet we also use the current diag ID on the DiagnosticsEngine. This has
1679 // been made more painfully obvious by the refactor that introduced this
1680 // function, but it is possible that the incoming argument can be
1681 // eliminated. If it truly cannot be (for example, there is some reentrancy
1682 // issue I am not seeing yet), then there should at least be a clarifying
1683 // comment somewhere.
1684 Diagnostic DiagInfo(&Diags, DB);
1685 if (SFINAETrap *Trap = getSFINAEContext()) {
1686 sema::TemplateDeductionInfo *Info = Trap->getDeductionInfo();
1689 // We'll report the diagnostic below.
1690 break;
1691
1693 // Count this failure so that we know that template argument deduction
1694 // has failed.
1695 Trap->setErrorOccurred();
1696
1697 // Make a copy of this suppressed diagnostic and store it with the
1698 // template-deduction information.
1699 if (Info && !Info->hasSFINAEDiagnostic())
1700 Info->addSFINAEDiagnostic(
1701 DiagInfo.getLocation(),
1702 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1703
1704 Diags.setLastDiagnosticIgnored(true);
1705 return;
1706
1708 // Per C++ Core Issue 1170, access control is part of SFINAE.
1709 // Additionally, the WithAccessChecking flag can be used to temporarily
1710 // make access control a part of SFINAE for the purposes of checking
1711 // type traits.
1712 if (!Trap->withAccessChecking() && !getLangOpts().CPlusPlus11)
1713 break;
1714
1715 SourceLocation Loc = DiagInfo.getLocation();
1716
1717 // Suppress this diagnostic.
1718 Trap->setErrorOccurred();
1719
1720 // Make a copy of this suppressed diagnostic and store it with the
1721 // template-deduction information.
1722 if (Info && !Info->hasSFINAEDiagnostic())
1723 Info->addSFINAEDiagnostic(
1724 DiagInfo.getLocation(),
1725 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1726
1727 Diags.setLastDiagnosticIgnored(true);
1728
1729 // Now produce a C++98 compatibility warning.
1730 Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
1731
1732 // The last diagnostic which Sema produced was ignored. Suppress any
1733 // notes attached to it.
1734 Diags.setLastDiagnosticIgnored(true);
1735 return;
1736 }
1737
1739 if (DiagnosticsEngine::Level Level = getDiagnostics().getDiagnosticLevel(
1740 DiagInfo.getID(), DiagInfo.getLocation());
1742 return;
1743 // Make a copy of this suppressed diagnostic and store it with the
1744 // template-deduction information;
1745 if (Info) {
1747 DiagInfo.getLocation(),
1748 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1749 if (!Diags.getDiagnosticIDs()->isNote(DiagID))
1751 Info->addSuppressedDiagnostic(Loc, std::move(PD));
1752 });
1753 }
1754
1755 // Suppress this diagnostic.
1756 Diags.setLastDiagnosticIgnored(true);
1757 return;
1758 }
1759 }
1760
1761 // Copy the diagnostic printing policy over the ASTContext printing policy.
1762 // TODO: Stop doing that. See: https://reviews.llvm.org/D45093#1090292
1763 Context.setPrintingPolicy(getPrintingPolicy());
1764
1765 // Emit the diagnostic.
1766 if (!Diags.EmitDiagnostic(DB))
1767 return;
1768
1769 // If this is not a note, and we're in a template instantiation
1770 // that is different from the last template instantiation where
1771 // we emitted an error, print a template instantiation
1772 // backtrace.
1773 if (!Diags.getDiagnosticIDs()->isNote(DiagID))
1775}
1776
1779 return true;
1780 auto *FD = dyn_cast<FunctionDecl>(CurContext);
1781 if (!FD)
1782 return false;
1783 auto Loc = DeviceDeferredDiags.find(FD);
1784 if (Loc == DeviceDeferredDiags.end())
1785 return false;
1786 for (auto PDAt : Loc->second) {
1787 if (Diags.getDiagnosticIDs()->isDefaultMappingAsError(
1788 PDAt.second.getDiagID()))
1789 return true;
1790 }
1791 return false;
1792}
1793
1794// Print notes showing how we can reach FD starting from an a priori
1795// known-callable function.
1796static void emitCallStackNotes(Sema &S, const FunctionDecl *FD) {
1797 auto FnIt = S.CUDA().DeviceKnownEmittedFns.find(FD);
1798 while (FnIt != S.CUDA().DeviceKnownEmittedFns.end()) {
1799 // Respect error limit.
1801 return;
1802 DiagnosticBuilder Builder(
1803 S.Diags.Report(FnIt->second.Loc, diag::note_called_by));
1804 Builder << FnIt->second.FD;
1805 FnIt = S.CUDA().DeviceKnownEmittedFns.find(FnIt->second.FD);
1806 }
1807}
1808
1809namespace {
1810
1811/// Helper class that emits deferred diagnostic messages if an entity directly
1812/// or indirectly using the function that causes the deferred diagnostic
1813/// messages is known to be emitted.
1814///
1815/// During parsing of AST, certain diagnostic messages are recorded as deferred
1816/// diagnostics since it is unknown whether the functions containing such
1817/// diagnostics will be emitted. A list of potentially emitted functions and
1818/// variables that may potentially trigger emission of functions are also
1819/// recorded. DeferredDiagnosticsEmitter recursively visits used functions
1820/// by each function to emit deferred diagnostics.
1821///
1822/// During the visit, certain OpenMP directives or initializer of variables
1823/// with certain OpenMP attributes will cause subsequent visiting of any
1824/// functions enter a state which is called OpenMP device context in this
1825/// implementation. The state is exited when the directive or initializer is
1826/// exited. This state can change the emission states of subsequent uses
1827/// of functions.
1828///
1829/// Conceptually the functions or variables to be visited form a use graph
1830/// where the parent node uses the child node. At any point of the visit,
1831/// the tree nodes traversed from the tree root to the current node form a use
1832/// stack. The emission state of the current node depends on two factors:
1833/// 1. the emission state of the root node
1834/// 2. whether the current node is in OpenMP device context
1835/// If the function is decided to be emitted, its contained deferred diagnostics
1836/// are emitted, together with the information about the use stack.
1837///
1838class DeferredDiagnosticsEmitter
1839 : public UsedDeclVisitor<DeferredDiagnosticsEmitter> {
1840public:
1841 typedef UsedDeclVisitor<DeferredDiagnosticsEmitter> Inherited;
1842
1843 // Whether the function is already in the current use-path.
1844 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> InUsePath;
1845
1846 // The current use-path.
1847 llvm::SmallVector<CanonicalDeclPtr<FunctionDecl>, 4> UsePath;
1848
1849 // Whether the visiting of the function has been done. Done[0] is for the
1850 // case not in OpenMP device context. Done[1] is for the case in OpenMP
1851 // device context. We need two sets because diagnostics emission may be
1852 // different depending on whether it is in OpenMP device context.
1853 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> DoneMap[2];
1854
1855 // Emission state of the root node of the current use graph.
1856 bool ShouldEmitRootNode;
1857
1858 // Current OpenMP device context level. It is initialized to 0 and each
1859 // entering of device context increases it by 1 and each exit decreases
1860 // it by 1. Non-zero value indicates it is currently in device context.
1861 unsigned InOMPDeviceContext;
1862
1863 DeferredDiagnosticsEmitter(Sema &S)
1864 : Inherited(S), ShouldEmitRootNode(false), InOMPDeviceContext(0) {}
1865
1866 bool shouldVisitDiscardedStmt() const { return false; }
1867
1868 void VisitOMPTargetDirective(OMPTargetDirective *Node) {
1869 ++InOMPDeviceContext;
1870 Inherited::VisitOMPTargetDirective(Node);
1871 --InOMPDeviceContext;
1872 }
1873
1874 void visitUsedDecl(SourceLocation Loc, Decl *D) {
1875 if (isa<VarDecl>(D))
1876 return;
1877 if (auto *FD = dyn_cast<FunctionDecl>(D))
1878 checkFunc(Loc, FD);
1879 else
1880 Inherited::visitUsedDecl(Loc, D);
1881 }
1882
1883 // Visitor member and parent dtors called by this dtor.
1884 void VisitCalledDestructors(CXXDestructorDecl *DD) {
1885 const CXXRecordDecl *RD = DD->getParent();
1886
1887 // Visit the dtors of all members
1888 for (const FieldDecl *FD : RD->fields()) {
1889 QualType FT = FD->getType();
1890 if (const auto *ClassDecl = FT->getAsCXXRecordDecl();
1891 ClassDecl &&
1892 (ClassDecl->isBeingDefined() || ClassDecl->isCompleteDefinition()))
1893 if (CXXDestructorDecl *MemberDtor = ClassDecl->getDestructor())
1894 asImpl().visitUsedDecl(MemberDtor->getLocation(), MemberDtor);
1895 }
1896
1897 // Also visit base class dtors
1898 for (const auto &Base : RD->bases()) {
1899 QualType BaseType = Base.getType();
1900 if (const auto *BaseDecl = BaseType->getAsCXXRecordDecl();
1901 BaseDecl &&
1902 (BaseDecl->isBeingDefined() || BaseDecl->isCompleteDefinition()))
1903 if (CXXDestructorDecl *BaseDtor = BaseDecl->getDestructor())
1904 asImpl().visitUsedDecl(BaseDtor->getLocation(), BaseDtor);
1905 }
1906 }
1907
1908 void VisitDeclStmt(DeclStmt *DS) {
1909 // Visit dtors called by variables that need destruction
1910 for (auto *D : DS->decls())
1911 if (auto *VD = dyn_cast<VarDecl>(D))
1912 if (VD->isThisDeclarationADefinition() &&
1913 VD->needsDestruction(S.Context)) {
1914 QualType VT = VD->getType();
1915 if (const auto *ClassDecl = VT->getAsCXXRecordDecl();
1916 ClassDecl && (ClassDecl->isBeingDefined() ||
1917 ClassDecl->isCompleteDefinition()))
1918 if (CXXDestructorDecl *Dtor = ClassDecl->getDestructor())
1919 asImpl().visitUsedDecl(Dtor->getLocation(), Dtor);
1920 }
1921
1922 Inherited::VisitDeclStmt(DS);
1923 }
1924 void checkVar(VarDecl *VD) {
1925 assert(VD->isFileVarDecl() &&
1926 "Should only check file-scope variables");
1927 if (auto *Init = VD->getInit()) {
1928 auto DevTy = OMPDeclareTargetDeclAttr::getDeviceType(VD);
1929 bool IsDev = DevTy && (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost ||
1930 *DevTy == OMPDeclareTargetDeclAttr::DT_Any);
1931 if (IsDev)
1932 ++InOMPDeviceContext;
1933 this->Visit(Init);
1934 if (IsDev)
1935 --InOMPDeviceContext;
1936 }
1937 }
1938
1939 void checkFunc(SourceLocation Loc, FunctionDecl *FD) {
1940 auto &Done = DoneMap[InOMPDeviceContext > 0 ? 1 : 0];
1941 FunctionDecl *Caller = UsePath.empty() ? nullptr : UsePath.back();
1942 if ((!ShouldEmitRootNode && !S.getLangOpts().OpenMP && !Caller) ||
1943 S.shouldIgnoreInHostDeviceCheck(FD) || InUsePath.count(FD))
1944 return;
1945 // Finalize analysis of OpenMP-specific constructs.
1946 if (Caller && S.LangOpts.OpenMP && UsePath.size() == 1 &&
1947 (ShouldEmitRootNode || InOMPDeviceContext))
1948 S.OpenMP().finalizeOpenMPDelayedAnalysis(Caller, FD, Loc);
1949 if (Caller)
1950 S.CUDA().DeviceKnownEmittedFns[FD] = {Caller, Loc};
1951 // Always emit deferred diagnostics for the direct users. This does not
1952 // lead to explosion of diagnostics since each user is visited at most
1953 // twice.
1954 if (ShouldEmitRootNode || InOMPDeviceContext)
1955 emitDeferredDiags(FD, Caller);
1956 // Do not revisit a function if the function body has been completely
1957 // visited before.
1958 if (!Done.insert(FD).second)
1959 return;
1960 InUsePath.insert(FD);
1961 UsePath.push_back(FD);
1962 if (auto *S = FD->getBody()) {
1963 this->Visit(S);
1964 }
1965 if (CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(FD))
1966 asImpl().VisitCalledDestructors(Dtor);
1967 UsePath.pop_back();
1968 InUsePath.erase(FD);
1969 }
1970
1971 void checkRecordedDecl(Decl *D) {
1972 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
1973 ShouldEmitRootNode = S.getEmissionStatus(FD, /*Final=*/true) ==
1974 Sema::FunctionEmissionStatus::Emitted;
1975 checkFunc(SourceLocation(), FD);
1976 } else
1977 checkVar(cast<VarDecl>(D));
1978 }
1979
1980 // Emit any deferred diagnostics for FD
1981 void emitDeferredDiags(FunctionDecl *FD, bool ShowCallStack) {
1982 auto It = S.DeviceDeferredDiags.find(FD);
1983 if (It == S.DeviceDeferredDiags.end())
1984 return;
1985 bool HasWarningOrError = false;
1986 bool FirstDiag = true;
1987 for (PartialDiagnosticAt &PDAt : It->second) {
1988 // Respect error limit.
1989 if (S.Diags.hasFatalErrorOccurred())
1990 return;
1991 const SourceLocation &Loc = PDAt.first;
1992 const PartialDiagnostic &PD = PDAt.second;
1993 HasWarningOrError |=
1994 S.getDiagnostics().getDiagnosticLevel(PD.getDiagID(), Loc) >=
1996 {
1997 DiagnosticBuilder Builder(S.Diags.Report(Loc, PD.getDiagID()));
1998 PD.Emit(Builder);
1999 }
2000 // Emit the note on the first diagnostic in case too many diagnostics
2001 // cause the note not emitted.
2002 if (FirstDiag && HasWarningOrError && ShowCallStack) {
2003 emitCallStackNotes(S, FD);
2004 FirstDiag = false;
2005 }
2006 }
2007 }
2008};
2009} // namespace
2010
2012 if (ExternalSource)
2013 ExternalSource->ReadDeclsToCheckForDeferredDiags(
2015
2016 if ((DeviceDeferredDiags.empty() && !LangOpts.OpenMP) ||
2018 return;
2019
2020 DeferredDiagnosticsEmitter DDE(*this);
2021 for (auto *D : DeclsToCheckForDeferredDiags)
2022 DDE.checkRecordedDecl(D);
2023}
2024
2025// In CUDA, there are some constructs which may appear in semantically-valid
2026// code, but trigger errors if we ever generate code for the function in which
2027// they appear. Essentially every construct you're not allowed to use on the
2028// device falls into this category, because you are allowed to use these
2029// constructs in a __host__ __device__ function, but only if that function is
2030// never codegen'ed on the device.
2031//
2032// To handle semantic checking for these constructs, we keep track of the set of
2033// functions we know will be emitted, either because we could tell a priori that
2034// they would be emitted, or because they were transitively called by a
2035// known-emitted function.
2036//
2037// We also keep a partial call graph of which not-known-emitted functions call
2038// which other not-known-emitted functions.
2039//
2040// When we see something which is illegal if the current function is emitted
2041// (usually by way of DiagIfDeviceCode, DiagIfHostCode, or
2042// CheckCall), we first check if the current function is known-emitted. If
2043// so, we immediately output the diagnostic.
2044//
2045// Otherwise, we "defer" the diagnostic. It sits in Sema::DeviceDeferredDiags
2046// until we discover that the function is known-emitted, at which point we take
2047// it out of this map and emit the diagnostic.
2048
2049Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(Kind K, SourceLocation Loc,
2050 unsigned DiagID,
2051 const FunctionDecl *Fn,
2052 Sema &S)
2053 : S(S), Loc(Loc), DiagID(DiagID), Fn(Fn),
2054 ShowCallStack(K == K_ImmediateWithCallStack || K == K_Deferred) {
2055 switch (K) {
2056 case K_Nop:
2057 break;
2058 case K_Immediate:
2059 case K_ImmediateWithCallStack:
2060 ImmediateDiag.emplace(
2061 ImmediateDiagBuilder(S.Diags.Report(Loc, DiagID), S, DiagID));
2062 break;
2063 case K_Deferred:
2064 assert(Fn && "Must have a function to attach the deferred diag to.");
2065 auto &Diags = S.DeviceDeferredDiags[Fn];
2066 PartialDiagId.emplace(Diags.size());
2067 Diags.emplace_back(Loc, S.PDiag(DiagID));
2068 break;
2069 }
2070}
2071
2072Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(SemaDiagnosticBuilder &&D)
2073 : S(D.S), Loc(D.Loc), DiagID(D.DiagID), Fn(D.Fn),
2074 ShowCallStack(D.ShowCallStack), ImmediateDiag(D.ImmediateDiag),
2075 PartialDiagId(D.PartialDiagId) {
2076 // Clean the previous diagnostics.
2077 D.ShowCallStack = false;
2078 D.ImmediateDiag.reset();
2079 D.PartialDiagId.reset();
2080}
2081
2082Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
2083 if (ImmediateDiag) {
2084 // Emit our diagnostic and, if it was a warning or error, output a callstack
2085 // if Fn isn't a priori known-emitted.
2086 ImmediateDiag.reset(); // Emit the immediate diag.
2087
2088 if (ShowCallStack) {
2089 bool IsWarningOrError = S.getDiagnostics().getDiagnosticLevel(
2090 DiagID, Loc) >= DiagnosticsEngine::Warning;
2091 if (IsWarningOrError)
2092 emitCallStackNotes(S, Fn);
2093 }
2094 } else {
2095 assert((!PartialDiagId || ShowCallStack) &&
2096 "Must always show call stack for deferred diags.");
2097 }
2098}
2099
2100Sema::SemaDiagnosticBuilder
2101Sema::targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD) {
2102 FD = FD ? FD : getCurFunctionDecl();
2103 if (LangOpts.OpenMP)
2104 return LangOpts.OpenMPIsTargetDevice
2105 ? OpenMP().diagIfOpenMPDeviceCode(Loc, DiagID, FD)
2106 : OpenMP().diagIfOpenMPHostCode(Loc, DiagID, FD);
2107 if (getLangOpts().CUDA)
2108 return getLangOpts().CUDAIsDevice ? CUDA().DiagIfDeviceCode(Loc, DiagID)
2109 : CUDA().DiagIfHostCode(Loc, DiagID);
2110
2111 if (getLangOpts().SYCLIsDevice)
2112 return SYCL().DiagIfDeviceCode(Loc, DiagID);
2113
2115 FD, *this);
2116}
2117
2119 if (isUnevaluatedContext() || Ty.isNull())
2120 return;
2121
2122 // The original idea behind checkTypeSupport function is that unused
2123 // declarations can be replaced with an array of bytes of the same size during
2124 // codegen, such replacement doesn't seem to be possible for types without
2125 // constant byte size like zero length arrays. So, do a deep check for SYCL.
2126 if (D && LangOpts.SYCLIsDevice) {
2127 llvm::DenseSet<QualType> Visited;
2128 SYCL().deepTypeCheckForDevice(Loc, Visited, D);
2129 }
2130
2132
2133 // Memcpy operations for structs containing a member with unsupported type
2134 // are ok, though.
2135 if (const auto *MD = dyn_cast<CXXMethodDecl>(C)) {
2136 if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) &&
2137 MD->isTrivial())
2138 return;
2139
2140 if (const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD))
2141 if (Ctor->isCopyOrMoveConstructor() && Ctor->isTrivial())
2142 return;
2143 }
2144
2145 // Try to associate errors with the lexical context, if that is a function, or
2146 // the value declaration otherwise.
2147 const FunctionDecl *FD = isa<FunctionDecl>(C)
2149 : dyn_cast_or_null<FunctionDecl>(D);
2150
2151 auto CheckDeviceType = [&](QualType Ty) {
2152 if (Ty->isDependentType())
2153 return;
2154
2155 if (Ty->isBitIntType()) {
2156 if (!Context.getTargetInfo().hasBitIntType()) {
2157 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2158 if (D)
2159 PD << D;
2160 else
2161 PD << "expression";
2162 targetDiag(Loc, PD, FD)
2163 << false /*show bit size*/ << 0 /*bitsize*/ << false /*return*/
2164 << Ty << Context.getTargetInfo().getTriple().str();
2165 }
2166 return;
2167 }
2168
2169 // Check if we are dealing with two 'long double' but with different
2170 // semantics.
2171 bool LongDoubleMismatched = false;
2172 if (Ty->isRealFloatingType() && Context.getTypeSize(Ty) == 128) {
2173 const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(Ty);
2174 if ((&Sem != &llvm::APFloat::PPCDoubleDouble() &&
2175 !Context.getTargetInfo().hasFloat128Type()) ||
2176 (&Sem == &llvm::APFloat::PPCDoubleDouble() &&
2177 !Context.getTargetInfo().hasIbm128Type()))
2178 LongDoubleMismatched = true;
2179 }
2180
2181 if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) ||
2182 (Ty->isFloat128Type() && !Context.getTargetInfo().hasFloat128Type()) ||
2183 (Ty->isIbm128Type() && !Context.getTargetInfo().hasIbm128Type()) ||
2184 (Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 &&
2185 !Context.getTargetInfo().hasInt128Type()) ||
2186 (Ty->isBFloat16Type() && !Context.getTargetInfo().hasBFloat16Type() &&
2187 !LangOpts.CUDAIsDevice) ||
2188 LongDoubleMismatched) {
2189 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2190 if (D)
2191 PD << D;
2192 else
2193 PD << "expression";
2194
2195 if (targetDiag(Loc, PD, FD)
2196 << true /*show bit size*/
2197 << static_cast<unsigned>(Context.getTypeSize(Ty)) << Ty
2198 << false /*return*/ << Context.getTargetInfo().getTriple().str()) {
2199 if (D)
2200 D->setInvalidDecl();
2201 }
2202 if (D)
2203 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2204 }
2205 };
2206
2207 auto CheckType = [&](QualType Ty, bool IsRetTy = false) {
2208 if (LangOpts.SYCLIsDevice ||
2209 (LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice) ||
2210 LangOpts.CUDAIsDevice)
2211 CheckDeviceType(Ty);
2212
2214 const TargetInfo &TI = Context.getTargetInfo();
2215 if (!TI.hasLongDoubleType() && UnqualTy == Context.LongDoubleTy) {
2216 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2217 if (D)
2218 PD << D;
2219 else
2220 PD << "expression";
2221
2222 if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty
2223 << false /*return*/
2224 << TI.getTriple().str()) {
2225 if (D)
2226 D->setInvalidDecl();
2227 }
2228 if (D)
2229 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2230 }
2231
2232 bool IsDouble = UnqualTy == Context.DoubleTy;
2233 bool IsFloat = UnqualTy == Context.FloatTy;
2234 if (IsRetTy && !TI.hasFPReturn() && (IsDouble || IsFloat)) {
2235 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2236 if (D)
2237 PD << D;
2238 else
2239 PD << "expression";
2240
2241 if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty << true /*return*/
2242 << TI.getTriple().str()) {
2243 if (D)
2244 D->setInvalidDecl();
2245 }
2246 if (D)
2247 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2248 }
2249
2250 if (TI.hasRISCVVTypes() && Ty->isRVVSizelessBuiltinType() && FD) {
2251 llvm::StringMap<bool> CallerFeatureMap;
2252 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2253 RISCV().checkRVVTypeSupport(Ty, Loc, D, CallerFeatureMap);
2254 }
2255
2256 // Don't allow SVE types in functions without a SVE target.
2257 if (Ty->isSVESizelessBuiltinType() && FD && !FD->getType().isNull()) {
2258 llvm::StringMap<bool> CallerFeatureMap;
2259 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2260 if (!Builtin::evaluateRequiredTargetFeatures("sve", CallerFeatureMap)) {
2261 if (!Builtin::evaluateRequiredTargetFeatures("sme", CallerFeatureMap))
2262 Diag(Loc, diag::err_sve_vector_in_non_sve_target) << Ty;
2263 else if (!IsArmStreamingFunction(FD,
2264 /*IncludeLocallyStreaming=*/true))
2265 Diag(Loc, diag::err_sve_vector_in_non_streaming_function) << Ty;
2266 }
2267 }
2268
2269 if (auto *VT = Ty->getAs<VectorType>();
2270 VT && FD &&
2271 (VT->getVectorKind() == VectorKind::SveFixedLengthData ||
2272 VT->getVectorKind() == VectorKind::SveFixedLengthPredicate) &&
2273 (LangOpts.VScaleMin != LangOpts.VScaleStreamingMin ||
2274 LangOpts.VScaleMax != LangOpts.VScaleStreamingMax)) {
2275 if (IsArmStreamingFunction(FD, /*IncludeLocallyStreaming=*/true)) {
2276 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2277 << Ty << /*Streaming*/ 0;
2278 } else if (const auto *FTy = FD->getType()->getAs<FunctionProtoType>()) {
2279 if (FTy->getAArch64SMEAttributes() &
2281 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2282 << Ty << /*StreamingCompatible*/ 1;
2283 }
2284 }
2285 }
2286 };
2287
2288 CheckType(Ty);
2289 if (const auto *FPTy = dyn_cast<FunctionProtoType>(Ty)) {
2290 for (const auto &ParamTy : FPTy->param_types())
2291 CheckType(ParamTy);
2292 CheckType(FPTy->getReturnType(), /*IsRetTy=*/true);
2293 }
2294 if (const auto *FNPTy = dyn_cast<FunctionNoProtoType>(Ty))
2295 CheckType(FNPTy->getReturnType(), /*IsRetTy=*/true);
2296}
2297
2298bool Sema::findMacroSpelling(SourceLocation &locref, StringRef name) {
2299 SourceLocation loc = locref;
2300 if (!loc.isMacroID()) return false;
2301
2302 // There's no good way right now to look at the intermediate
2303 // expansions, so just jump to the expansion location.
2304 loc = getSourceManager().getExpansionLoc(loc);
2305
2306 // If that's written with the name, stop here.
2307 SmallString<16> buffer;
2308 if (getPreprocessor().getSpelling(loc, buffer) == name) {
2309 locref = loc;
2310 return true;
2311 }
2312 return false;
2313}
2314
2316
2317 if (!Ctx)
2318 return nullptr;
2319
2320 Ctx = Ctx->getPrimaryContext();
2321 for (Scope *S = getCurScope(); S; S = S->getParent()) {
2322 // Ignore scopes that cannot have declarations. This is important for
2323 // out-of-line definitions of static class members.
2324 if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))
2325 if (DeclContext *Entity = S->getEntity())
2326 if (Ctx == Entity->getPrimaryContext())
2327 return S;
2328 }
2329
2330 return nullptr;
2331}
2332
2333/// Enter a new function scope
2335 if (FunctionScopes.empty() && CachedFunctionScope) {
2336 // Use CachedFunctionScope to avoid allocating memory when possible.
2337 CachedFunctionScope->Clear();
2338 FunctionScopes.push_back(CachedFunctionScope.release());
2339 } else {
2341 }
2342 if (LangOpts.OpenMP)
2343 OpenMP().pushOpenMPFunctionRegion();
2344}
2345
2348 BlockScope, Block));
2350}
2351
2354 FunctionScopes.push_back(LSI);
2356 return LSI;
2357}
2358
2360 if (LambdaScopeInfo *const LSI = getCurLambda()) {
2361 LSI->AutoTemplateParameterDepth = Depth;
2362 return;
2363 }
2364 llvm_unreachable(
2365 "Remove assertion if intentionally called in a non-lambda context.");
2366}
2367
2368// Check that the type of the VarDecl has an accessible copy constructor and
2369// resolve its destructor's exception specification.
2370// This also performs initialization of block variables when they are moved
2371// to the heap. It uses the same rules as applicable for implicit moves
2372// according to the C++ standard in effect ([class.copy.elision]p3).
2373static void checkEscapingByref(VarDecl *VD, Sema &S) {
2374 QualType T = VD->getType();
2377 SourceLocation Loc = VD->getLocation();
2378 Expr *VarRef =
2379 new (S.Context) DeclRefExpr(S.Context, VD, false, T, VK_LValue, Loc);
2380 ExprResult Result;
2381 auto IE = InitializedEntity::InitializeBlock(Loc, T);
2382 if (S.getLangOpts().CPlusPlus23) {
2383 auto *E = ImplicitCastExpr::Create(S.Context, T, CK_NoOp, VarRef, nullptr,
2385 Result = S.PerformCopyInitialization(IE, SourceLocation(), E);
2386 } else {
2389 VarRef);
2390 }
2391
2392 if (!Result.isInvalid()) {
2393 Result = S.MaybeCreateExprWithCleanups(Result);
2394 Expr *Init = Result.getAs<Expr>();
2396 }
2397
2398 // The destructor's exception specification is needed when IRGen generates
2399 // block copy/destroy functions. Resolve it here.
2400 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
2401 if (CXXDestructorDecl *DD = RD->getDestructor()) {
2402 auto *FPT = DD->getType()->castAs<FunctionProtoType>();
2403 S.ResolveExceptionSpec(Loc, FPT);
2404 }
2405}
2406
2407static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S) {
2408 // Set the EscapingByref flag of __block variables captured by
2409 // escaping blocks.
2410 for (const BlockDecl *BD : FSI.Blocks) {
2411 for (const BlockDecl::Capture &BC : BD->captures()) {
2412 VarDecl *VD = BC.getVariable();
2413 if (VD->hasAttr<BlocksAttr>()) {
2414 // Nothing to do if this is a __block variable captured by a
2415 // non-escaping block.
2416 if (BD->doesNotEscape())
2417 continue;
2418 VD->setEscapingByref();
2419 }
2420 // Check whether the captured variable is or contains an object of
2421 // non-trivial C union type.
2422 QualType CapType = BC.getVariable()->getType();
2425 S.checkNonTrivialCUnion(BC.getVariable()->getType(),
2426 BD->getCaretLocation(),
2429 }
2430 }
2431
2432 for (VarDecl *VD : FSI.ByrefBlockVars) {
2433 // __block variables might require us to capture a copy-initializer.
2434 if (!VD->isEscapingByref())
2435 continue;
2436 // It's currently invalid to ever have a __block variable with an
2437 // array type; should we diagnose that here?
2438 // Regardless, we don't want to ignore array nesting when
2439 // constructing this copy.
2440 if (VD->getType()->isStructureOrClassType())
2441 checkEscapingByref(VD, S);
2442 }
2443}
2444
2447 const Decl *D, QualType BlockType) {
2448 assert(!FunctionScopes.empty() && "mismatched push/pop!");
2449
2450 markEscapingByrefs(*FunctionScopes.back(), *this);
2451
2454
2455 if (LangOpts.OpenMP)
2456 OpenMP().popOpenMPFunctionRegion(Scope.get());
2457
2458 // Issue any analysis-based warnings.
2459 if (WP && D) {
2460 inferNoReturnAttr(*this, D);
2461 AnalysisWarnings.IssueWarnings(*WP, Scope.get(), D, BlockType);
2462 } else
2463 for (const auto &PUD : Scope->PossiblyUnreachableDiags)
2464 Diag(PUD.Loc, PUD.PD);
2465
2466 return Scope;
2467}
2468
2471 if (!Scope->isPlainFunction())
2472 Self->CapturingFunctionScopes--;
2473 // Stash the function scope for later reuse if it's for a normal function.
2474 if (Scope->isPlainFunction() && !Self->CachedFunctionScope)
2475 Self->CachedFunctionScope.reset(Scope);
2476 else
2477 delete Scope;
2478}
2479
2480void Sema::PushCompoundScope(bool IsStmtExpr) {
2481 getCurFunction()->CompoundScopes.push_back(
2482 CompoundScopeInfo(IsStmtExpr, getCurFPFeatures()));
2483}
2484
2486 FunctionScopeInfo *CurFunction = getCurFunction();
2487 assert(!CurFunction->CompoundScopes.empty() && "mismatched push/pop");
2488
2489 CurFunction->CompoundScopes.pop_back();
2490}
2491
2493 return getCurFunction()->hasUnrecoverableErrorOccurred();
2494}
2495
2497 if (!FunctionScopes.empty())
2498 FunctionScopes.back()->setHasBranchIntoScope();
2499}
2500
2502 if (!FunctionScopes.empty())
2503 FunctionScopes.back()->setHasBranchProtectedScope();
2504}
2505
2507 if (!FunctionScopes.empty())
2508 FunctionScopes.back()->setHasIndirectGoto();
2509}
2510
2512 if (!FunctionScopes.empty())
2513 FunctionScopes.back()->setHasMustTail();
2514}
2515
2517 if (FunctionScopes.empty())
2518 return nullptr;
2519
2520 auto CurBSI = dyn_cast<BlockScopeInfo>(FunctionScopes.back());
2521 if (CurBSI && CurBSI->TheDecl &&
2522 !CurBSI->TheDecl->Encloses(CurContext)) {
2523 // We have switched contexts due to template instantiation.
2524 assert(!CodeSynthesisContexts.empty());
2525 return nullptr;
2526 }
2527
2528 return CurBSI;
2529}
2530
2532 if (FunctionScopes.empty())
2533 return nullptr;
2534
2535 for (int e = FunctionScopes.size() - 1; e >= 0; --e) {
2537 continue;
2538 return FunctionScopes[e];
2539 }
2540 return nullptr;
2541}
2542
2544 for (auto *Scope : llvm::reverse(FunctionScopes)) {
2545 if (auto *CSI = dyn_cast<CapturingScopeInfo>(Scope)) {
2546 auto *LSI = dyn_cast<LambdaScopeInfo>(CSI);
2547 if (LSI && LSI->Lambda && !LSI->Lambda->Encloses(CurContext) &&
2548 LSI->AfterParameterList) {
2549 // We have switched contexts due to template instantiation.
2550 // FIXME: We should swap out the FunctionScopes during code synthesis
2551 // so that we don't need to check for this.
2552 assert(!CodeSynthesisContexts.empty());
2553 return nullptr;
2554 }
2555 return CSI;
2556 }
2557 }
2558 return nullptr;
2559}
2560
2561LambdaScopeInfo *Sema::getCurLambda(bool IgnoreNonLambdaCapturingScope) {
2562 if (FunctionScopes.empty())
2563 return nullptr;
2564
2565 auto I = FunctionScopes.rbegin();
2566 if (IgnoreNonLambdaCapturingScope) {
2567 auto E = FunctionScopes.rend();
2568 while (I != E && isa<CapturingScopeInfo>(*I) && !isa<LambdaScopeInfo>(*I))
2569 ++I;
2570 if (I == E)
2571 return nullptr;
2572 }
2573 auto *CurLSI = dyn_cast<LambdaScopeInfo>(*I);
2574 if (CurLSI && CurLSI->Lambda && CurLSI->CallOperator &&
2575 !CurLSI->Lambda->Encloses(CurContext) && CurLSI->AfterParameterList) {
2576 // We have switched contexts due to template instantiation.
2577 assert(!CodeSynthesisContexts.empty());
2578 return nullptr;
2579 }
2580
2581 return CurLSI;
2582}
2583
2584// We have a generic lambda if we parsed auto parameters, or we have
2585// an associated template parameter list.
2587 if (LambdaScopeInfo *LSI = getCurLambda()) {
2588 return (LSI->TemplateParams.size() ||
2589 LSI->GLTemplateParameterList) ? LSI : nullptr;
2590 }
2591 return nullptr;
2592}
2593
2594
2596 if (!LangOpts.RetainCommentsFromSystemHeaders &&
2597 SourceMgr.isInSystemHeader(Comment.getBegin()))
2598 return;
2599 RawComment RC(SourceMgr, Comment, LangOpts.CommentOpts, false);
2601 SourceRange MagicMarkerRange(Comment.getBegin(),
2602 Comment.getBegin().getLocWithOffset(3));
2603 StringRef MagicMarkerText;
2604 switch (RC.getKind()) {
2606 MagicMarkerText = "///<";
2607 break;
2609 MagicMarkerText = "/**<";
2610 break;
2612 // FIXME: are there other scenarios that could produce an invalid
2613 // raw comment here?
2614 Diag(Comment.getBegin(), diag::warn_splice_in_doxygen_comment);
2615 return;
2616 default:
2617 llvm_unreachable("if this is an almost Doxygen comment, "
2618 "it should be ordinary");
2619 }
2620 Diag(Comment.getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
2621 FixItHint::CreateReplacement(MagicMarkerRange, MagicMarkerText);
2622 }
2623 Context.addComment(RC);
2624}
2625
2626// Pin this vtable to this file.
2628char ExternalSemaSource::ID;
2629
2632
2636
2638 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {}
2639
2641 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &) {}
2642
2643bool Sema::tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
2645 ZeroArgCallReturnTy = QualType();
2646 OverloadSet.clear();
2647
2648 const OverloadExpr *Overloads = nullptr;
2649 bool IsMemExpr = false;
2650 if (E.getType() == Context.OverloadTy) {
2652
2653 // Ignore overloads that are pointer-to-member constants.
2655 return false;
2656
2657 Overloads = FR.Expression;
2658 } else if (E.getType() == Context.BoundMemberTy) {
2659 Overloads = dyn_cast<UnresolvedMemberExpr>(E.IgnoreParens());
2660 IsMemExpr = true;
2661 }
2662
2663 bool Ambiguous = false;
2664 bool IsMV = false;
2665
2666 if (Overloads) {
2667 for (OverloadExpr::decls_iterator it = Overloads->decls_begin(),
2668 DeclsEnd = Overloads->decls_end(); it != DeclsEnd; ++it) {
2669 OverloadSet.addDecl(*it);
2670
2671 // Check whether the function is a non-template, non-member which takes no
2672 // arguments.
2673 if (IsMemExpr)
2674 continue;
2675 if (const FunctionDecl *OverloadDecl
2676 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
2677 if (OverloadDecl->getMinRequiredArguments() == 0) {
2678 if (!ZeroArgCallReturnTy.isNull() && !Ambiguous &&
2679 (!IsMV || !(OverloadDecl->isCPUDispatchMultiVersion() ||
2680 OverloadDecl->isCPUSpecificMultiVersion()))) {
2681 ZeroArgCallReturnTy = QualType();
2682 Ambiguous = true;
2683 } else {
2684 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
2685 IsMV = OverloadDecl->isCPUDispatchMultiVersion() ||
2686 OverloadDecl->isCPUSpecificMultiVersion();
2687 }
2688 }
2689 }
2690 }
2691
2692 // If it's not a member, use better machinery to try to resolve the call
2693 if (!IsMemExpr)
2694 return !ZeroArgCallReturnTy.isNull();
2695 }
2696
2697 // Attempt to call the member with no arguments - this will correctly handle
2698 // member templates with defaults/deduction of template arguments, overloads
2699 // with default arguments, etc.
2700 if (IsMemExpr && !E.isTypeDependent()) {
2701 Sema::TentativeAnalysisScope Trap(*this);
2703 SourceLocation());
2704 if (R.isUsable()) {
2705 ZeroArgCallReturnTy = R.get()->getType();
2706 return true;
2707 }
2708 return false;
2709 }
2710
2711 if (const auto *DeclRef = dyn_cast<DeclRefExpr>(E.IgnoreParens())) {
2712 if (const auto *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
2713 if (Fun->getMinRequiredArguments() == 0)
2714 ZeroArgCallReturnTy = Fun->getReturnType();
2715 return true;
2716 }
2717 }
2718
2719 // We don't have an expression that's convenient to get a FunctionDecl from,
2720 // but we can at least check if the type is "function of 0 arguments".
2721 QualType ExprTy = E.getType();
2722 const FunctionType *FunTy = nullptr;
2723 QualType PointeeTy = ExprTy->getPointeeType();
2724 if (!PointeeTy.isNull())
2725 FunTy = PointeeTy->getAs<FunctionType>();
2726 if (!FunTy)
2727 FunTy = ExprTy->getAs<FunctionType>();
2728
2729 if (const auto *FPT = dyn_cast_if_present<FunctionProtoType>(FunTy)) {
2730 if (FPT->getNumParams() == 0)
2731 ZeroArgCallReturnTy = FunTy->getReturnType();
2732 return true;
2733 }
2734 return false;
2735}
2736
2737/// Give notes for a set of overloads.
2738///
2739/// A companion to tryExprAsCall. In cases when the name that the programmer
2740/// wrote was an overloaded function, we may be able to make some guesses about
2741/// plausible overloads based on their return types; such guesses can be handed
2742/// off to this method to be emitted as notes.
2743///
2744/// \param Overloads - The overloads to note.
2745/// \param FinalNoteLoc - If we've suppressed printing some overloads due to
2746/// -fshow-overloads=best, this is the location to attach to the note about too
2747/// many candidates. Typically this will be the location of the original
2748/// ill-formed expression.
2749static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads,
2750 const SourceLocation FinalNoteLoc) {
2751 unsigned ShownOverloads = 0;
2752 unsigned SuppressedOverloads = 0;
2753 for (UnresolvedSetImpl::iterator It = Overloads.begin(),
2754 DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
2755 if (ShownOverloads >= S.Diags.getNumOverloadCandidatesToShow()) {
2756 ++SuppressedOverloads;
2757 continue;
2758 }
2759
2760 const NamedDecl *Fn = (*It)->getUnderlyingDecl();
2761 // Don't print overloads for non-default multiversioned functions.
2762 if (const auto *FD = Fn->getAsFunction()) {
2763 if (FD->isMultiVersion() && FD->hasAttr<TargetAttr>() &&
2764 !FD->getAttr<TargetAttr>()->isDefaultVersion())
2765 continue;
2766 if (FD->isMultiVersion() && FD->hasAttr<TargetVersionAttr>() &&
2767 !FD->getAttr<TargetVersionAttr>()->isDefaultVersion())
2768 continue;
2769 }
2770 S.Diag(Fn->getLocation(), diag::note_possible_target_of_call);
2771 ++ShownOverloads;
2772 }
2773
2774 S.Diags.overloadCandidatesShown(ShownOverloads);
2775
2776 if (SuppressedOverloads)
2777 S.Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
2778 << SuppressedOverloads;
2779}
2780
2782 const UnresolvedSetImpl &Overloads,
2783 bool (*IsPlausibleResult)(QualType)) {
2784 if (!IsPlausibleResult)
2785 return noteOverloads(S, Overloads, Loc);
2786
2787 UnresolvedSet<2> PlausibleOverloads;
2788 for (OverloadExpr::decls_iterator It = Overloads.begin(),
2789 DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
2790 const auto *OverloadDecl = cast<FunctionDecl>(*It);
2791 QualType OverloadResultTy = OverloadDecl->getReturnType();
2792 if (IsPlausibleResult(OverloadResultTy))
2793 PlausibleOverloads.addDecl(It.getDecl());
2794 }
2795 noteOverloads(S, PlausibleOverloads, Loc);
2796}
2797
2798/// Determine whether the given expression can be called by just
2799/// putting parentheses after it. Notably, expressions with unary
2800/// operators can't be because the unary operator will start parsing
2801/// outside the call.
2802static bool IsCallableWithAppend(const Expr *E) {
2803 E = E->IgnoreImplicit();
2804 return (!isa<CStyleCastExpr>(E) &&
2805 !isa<UnaryOperator>(E) &&
2806 !isa<BinaryOperator>(E) &&
2808}
2809
2811 if (const auto *UO = dyn_cast<UnaryOperator>(E))
2812 E = UO->getSubExpr();
2813
2814 if (const auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
2815 if (ULE->getNumDecls() == 0)
2816 return false;
2817
2818 const NamedDecl *ND = *ULE->decls_begin();
2819 if (const auto *FD = dyn_cast<FunctionDecl>(ND))
2821 }
2822 return false;
2823}
2824
2826 bool ForceComplain,
2827 bool (*IsPlausibleResult)(QualType)) {
2828 SourceLocation Loc = E.get()->getExprLoc();
2829 SourceRange Range = E.get()->getSourceRange();
2830 UnresolvedSet<4> Overloads;
2831
2832 // If this is a SFINAE context, don't try anything that might trigger ADL
2833 // prematurely.
2834 if (!isSFINAEContext()) {
2835 QualType ZeroArgCallTy;
2836 if (tryExprAsCall(*E.get(), ZeroArgCallTy, Overloads) &&
2837 !ZeroArgCallTy.isNull() &&
2838 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
2839 // At this point, we know E is potentially callable with 0
2840 // arguments and that it returns something of a reasonable type,
2841 // so we can emit a fixit and carry on pretending that E was
2842 // actually a CallExpr.
2843 SourceLocation ParenInsertionLoc = getLocForEndOfToken(Range.getEnd());
2845 Diag(Loc, PD) << /*zero-arg*/ 1 << IsMV << Range
2846 << (IsCallableWithAppend(E.get())
2847 ? FixItHint::CreateInsertion(ParenInsertionLoc,
2848 "()")
2849 : FixItHint());
2850 if (!IsMV)
2851 notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
2852
2853 // FIXME: Try this before emitting the fixit, and suppress diagnostics
2854 // while doing so.
2855 E = BuildCallExpr(nullptr, E.get(), Range.getEnd(), {},
2856 Range.getEnd().getLocWithOffset(1));
2857 return true;
2858 }
2859 }
2860 if (!ForceComplain) return false;
2861
2863 Diag(Loc, PD) << /*not zero-arg*/ 0 << IsMV << Range;
2864 if (!IsMV)
2865 notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
2866 E = ExprError();
2867 return true;
2868}
2869
2871 if (!Ident_super)
2872 Ident_super = &Context.Idents.get("super");
2873 return Ident_super;
2874}
2875
2878 unsigned OpenMPCaptureLevel) {
2879 auto *CSI = new CapturedRegionScopeInfo(
2880 getDiagnostics(), S, CD, RD, CD->getContextParam(), K,
2881 (getLangOpts().OpenMP && K == CR_OpenMP)
2882 ? OpenMP().getOpenMPNestingLevel()
2883 : 0,
2884 OpenMPCaptureLevel);
2885 CSI->ReturnType = Context.VoidTy;
2886 FunctionScopes.push_back(CSI);
2888}
2889
2891 if (FunctionScopes.empty())
2892 return nullptr;
2893
2894 return dyn_cast<CapturedRegionScopeInfo>(FunctionScopes.back());
2895}
2896
2897const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
2901
2903 : S(S), OldFPFeaturesState(S.CurFPFeatures),
2904 OldOverrides(S.FpPragmaStack.CurrentValue),
2905 OldEvalMethod(S.PP.getCurrentFPEvalMethod()),
2906 OldFPPragmaLocation(S.PP.getLastFPEvalPragmaLocation()) {}
2907
2909 S.CurFPFeatures = OldFPFeaturesState;
2910 S.FpPragmaStack.CurrentValue = OldOverrides;
2911 S.PP.setCurrentFPEvalMethod(OldFPPragmaLocation, OldEvalMethod);
2912}
2913
2915 assert(D.getCXXScopeSpec().isSet() &&
2916 "can only be called for qualified names");
2917
2918 auto LR = LookupResult(*this, D.getIdentifier(), D.getBeginLoc(),
2922 if (!DC)
2923 return false;
2924
2925 LookupQualifiedName(LR, DC);
2926 bool Result = llvm::all_of(LR, [](Decl *Dcl) {
2927 if (NamedDecl *ND = dyn_cast<NamedDecl>(Dcl)) {
2928 ND = ND->getUnderlyingDecl();
2929 return isa<FunctionDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
2930 isa<UsingDecl>(ND);
2931 }
2932 return false;
2933 });
2934 return Result;
2935}
2936
2939
2940 auto *A = AnnotateAttr::Create(Context, Annot, Args.data(), Args.size(), CI);
2942 CI, MutableArrayRef<Expr *>(A->args_begin(), A->args_end()))) {
2943 return nullptr;
2944 }
2945 return A;
2946}
2947
2949 // Make sure that there is a string literal as the annotation's first
2950 // argument.
2951 StringRef Str;
2952 if (!checkStringLiteralArgumentAttr(AL, 0, Str))
2953 return nullptr;
2954
2956 Args.reserve(AL.getNumArgs() - 1);
2957 for (unsigned Idx = 1; Idx < AL.getNumArgs(); Idx++) {
2958 assert(!AL.isArgIdent(Idx));
2959 Args.push_back(AL.getArgAsExpr(Idx));
2960 }
2961
2962 return CreateAnnotationAttr(AL, Str, Args);
2963}
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
#define SM(sm)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis functions specific to AVR.
This file declares semantic analysis functions specific to BPF.
This file declares semantic analysis for CUDA constructs.
This file declares facilities that support code completion.
This file declares semantic analysis for DirectX constructs.
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis functions specific to Hexagon.
This file declares semantic analysis functions specific to LoongArch.
This file declares semantic analysis functions specific to M68k.
This file declares semantic analysis functions specific to MIPS.
This file declares semantic analysis functions specific to MSP430.
This file declares semantic analysis functions specific to NVPTX.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis routines for OpenCL.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis for expressions involving.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SPIRV constructs.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to SystemZ.
This file declares semantic analysis functions specific to Wasm.
This file declares semantic analysis functions specific to X86.
static void checkEscapingByref(VarDecl *VD, Sema &S)
Definition Sema.cpp:2373
static bool IsCPUDispatchCPUSpecificMultiVersion(const Expr *E)
Definition Sema.cpp:2810
llvm::DenseMap< const CXXRecordDecl *, bool > RecordCompleteMap
Definition Sema.cpp:1072
static bool IsCallableWithAppend(const Expr *E)
Determine whether the given expression can be called by just putting parentheses after it.
Definition Sema.cpp:2802
static bool MethodsAndNestedClassesComplete(const CXXRecordDecl *RD, RecordCompleteMap &MNCComplete)
Returns true, if all methods and nested classes of the given CXXRecordDecl are defined in this transl...
Definition Sema.cpp:1079
static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads, const SourceLocation FinalNoteLoc)
Give notes for a set of overloads.
Definition Sema.cpp:2749
static bool isFunctionOrVarDeclExternC(const NamedDecl *ND)
Definition Sema.cpp:927
static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S)
Definition Sema.cpp:2407
static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D)
Used to prune the decls of Sema's UnusedFileScopedDecls vector.
Definition Sema.cpp:866
static void emitCallStackNotes(Sema &S, const FunctionDecl *FD)
Definition Sema.cpp:1796
static void notePlausibleOverloads(Sema &S, SourceLocation Loc, const UnresolvedSetImpl &Overloads, bool(*IsPlausibleResult)(QualType))
Definition Sema.cpp:2781
static void checkUndefinedButUsed(Sema &S)
checkUndefinedButUsed - Check for undefined objects with internal linkage or that are inline.
Definition Sema.cpp:999
static bool IsRecordFullyDefined(const CXXRecordDecl *RD, RecordCompleteMap &RecordsComplete, RecordCompleteMap &MNCComplete)
Returns true, if the given CXXRecordDecl is fully defined in this translation unit,...
Definition Sema.cpp:1121
Defines the SourceManager interface.
Allows QualTypes to be sorted and hence used in maps and sets.
TypePropertyCache< Private > Cache
Definition Type.cpp:4785
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:34
virtual ASTMutationListener * GetASTMutationListener()
If the consumer is interested in entities getting modified after their initial creation,...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
bool isUsable() const
Definition Ownership.h:169
Attr - This represents one attribute.
Definition Attr.h:45
A class which contains all the information about a particular captured value.
Definition Decl.h:4660
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4654
ArrayRef< Capture > captures() const
Definition Decl.h:4781
SourceLocation getCaretLocation() const
Definition Decl.h:4727
bool doesNotEscape() const
Definition Decl.h:4805
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of C++ classes.
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2255
An iterator over the friend declarations of a class.
Definition DeclFriend.h:198
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
friend_iterator friend_begin() const
Definition DeclFriend.h:250
base_class_range bases()
Definition DeclCXX.h:608
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
Definition DeclCXX.cpp:2121
friend_iterator friend_end() const
Definition DeclFriend.h:254
bool isSet() const
Deprecated.
Definition DeclSpec.h:198
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4926
ImplicitParamDecl * getContextParam() const
Retrieve the parameter containing captured variables.
Definition Decl.h:4984
static const char * getCastKindName(CastKind CK)
Definition Expr.cpp:1946
Abstract interface for a consumer of code-completion information.
The information about the darwin SDK that was used during this compilation.
decl_iterator - Iterates through the declarations stored within this context.
Definition DeclBase.h:2330
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
decl_iterator decls_end() const
Definition DeclBase.h:2375
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1270
FriendSpecified isFriendSpecified() const
Definition DeclSpec.h:791
decl_range decls()
Definition Stmt.h:1659
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
T * getAttr() const
Definition DeclBase.h:573
void addAttr(Attr *A)
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
bool isReferenced() const
Whether any declaration of this entity was referenced.
Definition DeclBase.cpp:600
bool isInvalidDecl() const
Definition DeclBase.h:588
SourceLocation getLocation() const
Definition DeclBase.h:439
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition DeclBase.cpp:575
bool hasAttr() const
Definition DeclBase.h:577
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1874
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Definition DeclSpec.h:2021
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclSpec.h:2057
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
Definition DeclSpec.h:2036
const IdentifierInfo * getIdentifier() const
Definition DeclSpec.h:2304
A little helper class used to produce diagnostics.
static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID)
Determines whether the given built-in diagnostic ID is for an error that is suppressed if it occurs d...
@ SFINAE_SubstitutionFailure
The diagnostic should not be reported, but it should cause template argument deduction to fail.
@ SFINAE_Suppress
The diagnostic should be suppressed entirely.
@ SFINAE_AccessControl
The diagnostic is an access-control diagnostic, which will be substitution failures in some contexts ...
@ SFINAE_Report
The diagnostic should be reported.
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
const SourceLocation & getLocation() const
unsigned getID() const
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void overloadCandidatesShown(unsigned N)
Call this after showing N overload candidates.
Definition Diagnostic.h:777
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
Definition Diagnostic.h:762
Level
The level of the diagnostic, after it has been through mapping.
Definition Diagnostic.h:237
bool hasFatalErrorOccurred() const
Definition Diagnostic.h:879
RAII object that enters a new expression evaluation context.
This represents one expression.
Definition Expr.h:112
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:194
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Definition Expr.cpp:3085
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3073
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3081
bool isPRValue() const
Definition Expr.h:285
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:273
QualType getType() const
Definition Expr.h:144
An abstract interface that should be implemented by external AST sources that also provide informatio...
virtual void updateOutOfDateSelector(Selector Sel)
Load the contents of the global method pool for a given selector if necessary.
Definition Sema.cpp:2631
virtual void ReadMethodPool(Selector Sel)
Load the contents of the global method pool for a given selector.
Definition Sema.cpp:2630
virtual void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined)
Load the set of used but not defined functions or variables with internal linkage,...
Definition Sema.cpp:2637
~ExternalSemaSource() override
Definition Sema.cpp:2627
virtual void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces)
Load the set of namespaces that are known to the external source, which will be used during typo corr...
Definition Sema.cpp:2633
virtual void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &)
Definition Sema.cpp:2640
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3160
StringRef getName() const
The name of this FileEntry.
Definition FileEntry.h:61
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
Definition Diagnostic.h:79
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:140
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Definition Diagnostic.h:103
Represents a function declaration or definition.
Definition Decl.h:2000
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Definition Decl.h:2689
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition Decl.cpp:3268
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
Definition Decl.cpp:3695
bool isDeleted() const
Whether this function has been deleted.
Definition Decl.h:2540
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
Definition Decl.cpp:3691
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2385
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
Definition Decl.cpp:4328
static FunctionEffectsRef get(QualType QT)
Extract the effects from a Type if it is a function, block, or member function pointer,...
Definition TypeBase.h:9196
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5254
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4450
QualType getReturnType() const
Definition TypeBase.h:4790
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3787
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition Expr.cpp:2068
Represents a C array with an unspecified size.
Definition TypeBase.h:3909
static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, QualType Type)
@ CMK_HeaderUnit
Compiling a module header unit.
@ CMK_ModuleInterface
Compiling a C++ modules interface unit.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static std::optional< Token > findNextToken(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeComments=false)
Finds the token that comes right after the given location.
Definition Lexer.cpp:1321
static SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset, const SourceManager &SM, const LangOptions &LangOpts)
Computes the source location just past the end of the token at this source location.
Definition Lexer.cpp:848
Represents the results of name lookup.
Definition Lookup.h:147
Encapsulates the data about a macro definition (e.g.
Definition MacroInfo.h:39
Abstract interface for a module loader.
bool resolveExports(Module *Mod, bool Complain)
Resolve all of the unresolved exports in the given module.
bool resolveConflicts(Module *Mod, bool Complain)
Resolve all of the unresolved conflicts in the given module.
bool resolveUses(Module *Mod, bool Complain)
Resolve all of the unresolved uses in the given module.
Describes a module or submodule.
Definition Module.h:144
bool isNamedModuleInterfaceHasInit() const
Definition Module.h:684
bool isInterfaceOrPartition() const
Definition Module.h:671
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition Module.h:458
llvm::iterator_range< submodule_iterator > submodules()
Definition Module.h:838
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition Module.h:180
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition Module.h:177
static const unsigned NumNSNumberLiteralMethods
Definition NSAPI.h:191
This represents a decl that may have a name.
Definition Decl.h:274
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
Definition Decl.h:429
NamedDecl * getMostRecentDecl()
Definition Decl.h:501
bool isExternallyVisible() const
Definition Decl.h:433
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
void addSupport(const llvm::StringMap< bool > &FeaturesMap, const LangOptions &Opts)
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
Definition ExprCXX.h:3130
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
Definition ExprCXX.h:3191
UnresolvedSetImpl::iterator decls_iterator
Definition ExprCXX.h:3221
decls_iterator decls_begin() const
Definition ExprCXX.h:3223
decls_iterator decls_end() const
Definition ExprCXX.h:3226
This interface provides a way to observe the actions of the preprocessor as it does its thing.
Definition PPCallbacks.h:37
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
Definition ParsedAttr.h:371
bool isArgIdent(unsigned Arg) const
Definition ParsedAttr.h:385
Expr * getArgAsExpr(unsigned Arg) const
Definition ParsedAttr.h:383
void Emit(const DiagnosticBuilder &DB) const
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
A (possibly-)qualified type.
Definition TypeBase.h:937
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
Definition Type.h:85
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Definition Type.h:79
QualType getCanonicalType() const
Definition TypeBase.h:8330
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8372
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8351
bool hasUnsupportedSplice(const SourceManager &SourceMgr) const
@ RCK_OrdinaryC
Any normal C comment.
@ RCK_Invalid
Invalid comment.
@ RCK_OrdinaryBCPL
Any normal BCPL comments.
bool isAlmostTrailingComment() const LLVM_READONLY
Returns true if it is a probable typo:
CommentKind getKind() const LLVM_READONLY
Represents a struct/union/class.
Definition Decl.h:4312
field_range fields() const
Definition Decl.h:4515
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
Definition Scope.h:81
@ DeclScope
This is a scope that can contain a declaration.
Definition Scope.h:63
Smart pointer class that efficiently represents Objective-C method names.
A generic diagnostic builder for errors which may or may not be deferred.
Definition SemaBase.h:111
@ K_Immediate
Emit the diagnostic immediately (i.e., behave like Sema::Diag()).
Definition SemaBase.h:117
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition SemaBase.cpp:33
SemaBase(Sema &S)
Definition SemaBase.cpp:7
const LangOptions & getLangOpts() const
Definition SemaBase.cpp:11
DiagnosticsEngine & getDiagnostics() const
Definition SemaBase.cpp:10
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
llvm::DenseMap< CanonicalDeclPtr< const FunctionDecl >, FunctionDeclAndLoc > DeviceKnownEmittedFns
An inverse call graph, mapping known-emitted functions to one of their known-emitted callers (plus th...
Definition SemaCUDA.h:82
An abstract interface that should be implemented by clients that read ASTs and then require further s...
void ActOnEndOfTranslationUnit(TranslationUnitDecl *TU)
ObjCMethodDecl * NSNumberLiteralMethods[NSAPI::NumNSNumberLiteralMethods]
The Objective-C NSNumber methods used to create NSNumber literals.
Definition SemaObjC.h:606
void DiagnoseUseOfUnimplementedSelectors()
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
Definition SemaObjC.h:591
void DiagnoseUnterminatedOpenMPDeclareTarget()
Report unterminated 'omp declare target' or 'omp begin declare target' at the end of a compilation un...
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
Definition Sema.h:1355
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1370
Custom deleter to allow FunctionScopeInfos to be kept alive for a short time after they've been poppe...
Definition Sema.h:1051
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2470
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12411
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Definition Sema.h:12455
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:854
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
Definition Sema.h:3559
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition SemaAttr.cpp:503
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13522
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13005
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2543
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1120
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
Definition Sema.h:10029
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1061
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
Definition Sema.cpp:935
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition Sema.cpp:2643
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9302
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the pragma attribute stack.
Definition Sema.h:2106
OpaquePtr< QualType > TypeTy
Definition Sema.h:1276
void addImplicitTypedef(StringRef Name, QualType T)
Definition Sema.cpp:365
void PrintContextStack()
Definition Sema.h:13607
SemaOpenMP & OpenMP()
Definition Sema.h:1501
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6253
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
Definition Sema.h:1241
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Definition Sema.h:3541
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1152
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition Sema.h:6470
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
Definition Sema.h:1230
SemaCUDA & CUDA()
Definition Sema.h:1441
void Initialize()
Perform initialization that occurs after the parser has been initialized but before it parses anythin...
Definition Sema.cpp:371
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1223
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2446
Preprocessor & getPreprocessor() const
Definition Sema.h:924
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2315
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2044
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2038
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2496
void ActOnComment(SourceRange Comment)
Definition Sema.cpp:2595
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
Definition Sema.cpp:1231
FPOptionsOverride CurFPFeatureOverrides()
Definition Sema.h:2045
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition Sema.cpp:172
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
SemaSYCL & SYCL()
Definition Sema.h:1526
IdentifierInfo * getSuperIdentifier() const
Definition Sema.cpp:2870
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
Definition Sema.cpp:1651
void DiagnosePrecisionLossInComplexDivision()
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
Definition Sema.h:9242
ASTContext & Context
Definition Sema.h:1283
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
Definition Sema.cpp:680
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:922
SemaObjC & ObjC()
Definition Sema.h:1486
bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
Definition Sema.cpp:2825
SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags
Diagnostics that are emitted only if we discover that the given function must be codegen'ed.
Definition Sema.h:1411
void CheckDelayedMemberExceptionSpecs()
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition Sema.h:3140
PragmaStack< bool > StrictGuardStackCheckStack
Definition Sema.h:2041
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
Definition Sema.h:3549
ASTContext & getASTContext() const
Definition Sema.h:925
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1059
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:655
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
Definition Sema.h:6496
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
Definition Sema.h:6580
PragmaStack< StringLiteral * > ConstSegStack
Definition Sema.h:2037
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition Sema.cpp:756
unsigned TyposCorrected
The number of typos corrected by CorrectTypo.
Definition Sema.h:9245
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
Definition Sema.h:1213
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1191
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition Sema.cpp:1656
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Definition Sema.cpp:2586
void setFunctionHasIndirectGoto()
Definition Sema.cpp:2506
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition Sema.cpp:1670
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2334
FPOptions & getCurFPFeatures()
Definition Sema.h:920
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition Sema.h:8278
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:83
sema::LambdaScopeInfo * PushLambdaScope()
Definition Sema.cpp:2352
void PopCompoundScope()
Definition Sema.cpp:2485
api_notes::APINotesManager APINotes
Definition Sema.h:1287
const LangOptions & getLangOpts() const
Definition Sema.h:918
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
ASTConsumer & getASTConsumer() const
Definition Sema.h:926
void * OpaqueParser
Definition Sema.h:1325
Preprocessor & PP
Definition Sema.h:1282
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
threadSafety::BeforeSet * ThreadSafetyDeclCache
Definition Sema.h:1320
void checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D=nullptr)
Check if the type is allowed to be used for the current target.
Definition Sema.cpp:2118
const LangOptions & LangOpts
Definition Sema.h:1281
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition Sema.h:1219
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2561
static const uint64_t MaximumAlignment
Definition Sema.h:1214
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition Sema.h:6474
SemaHLSL & HLSL()
Definition Sema.h:1451
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1217
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
Definition Sema.cpp:1171
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
Definition Sema.cpp:139
SemaRISCV & RISCV()
Definition Sema.h:1516
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:13936
void performFunctionEffectAnalysis(TranslationUnitDecl *TU)
PragmaStack< AlignPackInfo > AlignPackStack
Definition Sema.h:2026
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedOverridingExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
Definition Sema.h:6572
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2036
DeclContext * getCurLexicalContext() const
Definition Sema.h:1124
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
Definition Sema.cpp:1663
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Definition Sema.cpp:849
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
Definition Sema.h:4742
sema::FunctionScopeInfo * getCurFunction() const
Definition Sema.h:1314
void PushCompoundScope(bool IsStmtExpr)
Definition Sema.cpp:2480
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
Definition Sema.cpp:2914
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
Definition Sema.cpp:2298
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2076
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9828
static bool isCast(CheckedConversionKind CCK)
Definition Sema.h:2520
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
Definition Sema.cpp:2516
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1414
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6500
SemaOpenCL & OpenCL()
Definition Sema.h:1496
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8141
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1631
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
bool GlobalNewDeleteDeclared
A flag to remember whether the implicit forms of operator new and delete have been declared.
Definition Sema.h:8337
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
Definition Sema.h:3563
bool MSStructPragmaOn
Definition Sema.h:1800
unsigned NonInstantiationEntries
The number of CodeSynthesisContexts that are not template instantiations and, therefore,...
Definition Sema.h:13553
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:13884
SourceManager & getSourceManager() const
Definition Sema.h:923
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
Definition Sema.cpp:630
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
Definition Sema.cpp:946
void diagnoseFunctionEffectConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn when implicitly changing function effects.
Definition Sema.cpp:696
void PerformPendingInstantiations(bool LocalOnly=false, bool AtEndOfTU=true)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
ExprResult PerformMoveOrCopyInitialization(const InitializedEntity &Entity, const NamedReturnInfo &NRInfo, Expr *Value, bool SupressSimplerImplicitMoves=false)
Perform the initialization of a potentially-movable value, which is the result of return value.
CanThrowResult canThrow(const Stmt *E)
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
@ NTCUK_Destruct
Definition Sema.h:4071
@ NTCUK_Copy
Definition Sema.h:4072
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
Definition Sema.cpp:2346
PragmaStack< MSVtorDispMode > VtorDispStack
Whether to insert vtordisps prior to virtual bases in the Microsoft C++ ABI.
Definition Sema.h:2025
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2083
bool isSFINAEContext() const
Definition Sema.h:13619
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
Definition Sema.h:13577
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition Sema.cpp:2876
void emitDeferredDiags()
Definition Sema.cpp:2011
void setFunctionHasMustTail()
Definition Sema.cpp:2511
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition Sema.h:8333
void CheckCompleteVariableDeclaration(VarDecl *VD)
void setFunctionHasBranchProtectedScope()
Definition Sema.cpp:2501
RedeclarationKind forRedeclarationInCurContext() const
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
Definition Sema.cpp:1165
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition Sema.h:1552
ASTConsumer & Consumer
Definition Sema.h:1284
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
Definition Sema.h:4628
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1319
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
Definition Sema.cpp:1777
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:13932
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
Definition Sema.cpp:109
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6712
std::pair< SourceLocation, bool > DeleteExprLoc
Definition Sema.h:966
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
Definition Sema.cpp:2359
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
Definition Sema.h:1246
void DiagnoseUnterminatedPragmaAttribute()
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
LateTemplateParserCB * LateTemplateParser
Definition Sema.h:1324
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
Delete-expressions to be analyzed at the end of translation unit.
Definition Sema.h:8344
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Definition Sema.h:3556
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition Sema.cpp:123
const llvm::MapVector< FieldDecl *, DeleteLocs > & getMismatchingDeleteExpressions() const
Retrieves list of suspicious delete-expressions that will be checked at the end of translation unit.
Definition Sema.cpp:2898
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8281
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
SourceManager & SourceMgr
Definition Sema.h:1286
DiagnosticsEngine & Diags
Definition Sema.h:1285
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:589
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:919
FPOptions CurFPFeatures
Definition Sema.h:1279
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2035
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
Definition Sema.cpp:2937
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
Definition Sema.h:6508
void PrintStats() const
Print out statistics about the semantic analysis.
Definition Sema.cpp:670
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
Definition Sema.h:1798
llvm::BumpPtrAllocator BumpAlloc
Definition Sema.h:1232
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
Definition Sema.cpp:88
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition Sema.cpp:625
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
Definition Sema.h:6252
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
Definition Sema.h:3531
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2101
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
Definition Sema.h:1338
sema::FunctionScopeInfo * getEnclosingFunction() const
Definition Sema.cpp:2531
sema::CapturedRegionScopeInfo * getCurCapturedRegion()
Retrieve the current captured region, if any.
Definition Sema.cpp:2890
void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E)
Warn when implicitly casting 0 to nullptr.
Definition Sema.cpp:708
void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB)
Cause the built diagnostic to be emitted on the DiagosticsEngine.
Definition Sema.cpp:1676
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
IdentifierResolver IdResolver
Definition Sema.h:3460
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
Definition Sema.cpp:2492
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
llvm::DenseSet< InstantiatingSpecializationsKey > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
Definition Sema.h:13525
ASTMutationListener * getASTMutationListener() const
Definition Sema.cpp:651
SFINAETrap * getSFINAEContext() const
Returns a pointer to the current SFINAE context, if any.
Definition Sema.h:13616
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
void setEnd(SourceLocation e)
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:338
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:350
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3812
bool isUnion() const
Definition Decl.h:3922
Exposes information about the current target.
Definition TargetInfo.h:226
virtual bool hasLongDoubleType() const
Determine whether the long double type is supported on this target.
Definition TargetInfo.h:733
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasFPReturn() const
Determine whether return of a floating point value is supported on this target.
Definition TargetInfo.h:737
bool hasRISCVVTypes() const
Returns whether or not the RISC-V V built-in types are available on this target.
A container of type source information.
Definition TypeBase.h:8249
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isFloat16Type() const
Definition TypeBase.h:8880
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:8915
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
Definition Type.cpp:2573
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9158
bool isFloat128Type() const
Definition TypeBase.h:8900
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:752
bool isBitIntType() const
Definition TypeBase.h:8780
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2782
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
Definition Type.cpp:2364
bool isIbm128Type() const
Definition TypeBase.h:8904
bool isBFloat16Type() const
Definition TypeBase.h:8892
bool isStructureOrClassType() const
Definition Type.cpp:706
bool isRealFloatingType() const
Floating point categories.
Definition Type.cpp:2320
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
Definition Type.cpp:2594
Linkage getLinkage() const
Determine the linkage of this type.
Definition Type.cpp:4891
@ STK_FloatingComplex
Definition TypeBase.h:2764
@ STK_ObjCObjectPointer
Definition TypeBase.h:2758
@ STK_IntegralComplex
Definition TypeBase.h:2763
@ STK_MemberPointer
Definition TypeBase.h:2759
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9091
bool isNullPtrType() const
Definition TypeBase.h:8908
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition Type.cpp:5014
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
A set of unresolved declarations.
UnresolvedSetIterator iterator
void addDecl(NamedDecl *D)
A set of unresolved declarations.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
void setType(QualType newType)
Definition Decl.h:724
QualType getType() const
Definition Decl.h:723
Represents a variable declaration or definition.
Definition Decl.h:926
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition Decl.cpp:2810
void setEscapingByref()
Definition Decl.h:1607
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
Definition Decl.cpp:2366
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
Definition Decl.h:1342
const Expr * getInit() const
Definition Decl.h:1368
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
Definition Decl.cpp:2345
@ DeclarationOnly
This declaration is only a declaration.
Definition Decl.h:1295
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
Definition Decl.h:1229
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
Definition Decl.cpp:2698
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Definition Decl.h:1358
Declaration of a variable template.
Represents a GCC generic vector type.
Definition TypeBase.h:4175
Retains information about a block that is currently being parsed.
Definition ScopeInfo.h:790
Retains information about a captured region.
Definition ScopeInfo.h:816
Contains information about the compound statement currently being parsed.
Definition ScopeInfo.h:67
Retains information about a function, method, or block that is currently being parsed.
Definition ScopeInfo.h:104
SmallVector< CompoundScopeInfo, 4 > CompoundScopes
The stack of currently active compound statement scopes in the function.
Definition ScopeInfo.h:228
llvm::SmallPtrSet< const BlockDecl *, 1 > Blocks
The set of blocks that are introduced in this function.
Definition ScopeInfo.h:231
llvm::TinyPtrVector< VarDecl * > ByrefBlockVars
The set of __block variables that are introduced in this function.
Definition ScopeInfo.h:234
void FileChanged(SourceLocation Loc, FileChangeReason Reason, SrcMgr::CharacteristicKind FileType, FileID PrevFID) override
Callback invoked whenever a source file is entered or exited.
Definition Sema.cpp:190
void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace, diag::Severity Mapping, StringRef Str) override
Callback invoked when a #pragma gcc diagnostic directive is read.
Definition Sema.cpp:227
Provides information about an attempted template argument deduction, whose success or failure was des...
void addSuppressedDiagnostic(SourceLocation Loc, PartialDiagnostic PD)
Add a new diagnostic to the set of diagnostics.
void addSFINAEDiagnostic(SourceLocation Loc, PartialDiagnostic PD)
Set the diagnostic which caused the SFINAE failure.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
Defines the clang::TargetInfo interface.
Definition SPIR.cpp:47
bool evaluateRequiredTargetFeatures(llvm::StringRef RequiredFatures, const llvm::StringMap< bool > &TargetFetureMap)
Returns true if the required target features of a builtin function are enabled.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
Flavor
Flavors of diagnostics we can emit.
@ WarningOrError
A diagnostic that indicates a problem or potential problem.
@ Remark
A diagnostic that indicates normal progress through compilation.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
void threadSafetyCleanup(BeforeSet *Cache)
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
Definition FileEntry.h:208
@ CPlusPlus
@ CPlusPlus11
@ ExpectedVariableOrFunction
@ Nullable
Values of this type can be null.
Definition Specifiers.h:352
@ NonNull
Values of this type can never be null.
Definition Specifiers.h:350
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:634
void inferNoReturnAttr(Sema &S, const Decl *D)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
@ CR_OpenMP
@ SC_Register
Definition Specifiers.h:257
@ SC_Static
Definition Specifiers.h:252
@ SD_Thread
Thread storage duration.
Definition Specifiers.h:342
@ SD_Static
Static storage duration.
Definition Specifiers.h:343
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
TUFragmentKind
Definition Sema.h:485
@ Private
The private module fragment, between 'module :private;' and the end of the translation unit.
Definition Sema.h:494
@ Global
The global module fragment, between 'module;' and a module-declaration.
Definition Sema.h:487
@ Normal
A normal translation unit fragment.
Definition Sema.h:491
ExprResult ExprError()
Definition Ownership.h:265
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition Sema.h:579
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_ClangModule
The translation unit is a clang module.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
void FormatASTNodeDiagnosticArgument(DiagnosticsEngine::ArgumentKind Kind, intptr_t Val, StringRef Modifier, StringRef Argument, ArrayRef< DiagnosticsEngine::ArgumentValue > PrevArgs, SmallVectorImpl< char > &Output, void *Cookie, ArrayRef< intptr_t > QualTypeVals)
DiagnosticsEngine argument formatting function for diagnostics that involve AST nodes.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:149
bool isExternalFormalLinkage(Linkage L)
Definition Linkage.h:117
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
Definition TypeBase.h:4154
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
Definition TypeBase.h:4157
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5864
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition Decl.cpp:6019
bool isExternallyVisible(Linkage L)
Definition Linkage.h:90
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:436
unsigned long uint64_t
#define false
Definition stdbool.h:26
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Describes how types, statements, expressions, and declarations should be printed.
unsigned Bool
Whether we can use 'bool' rather than '_Bool' (even if the language doesn't actually have 'bool',...
unsigned EntireContentsOfLargeArray
Whether to print the entire array initializers, especially on non-type template parameters,...
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13141