clang 23.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 bool IsExplicitCast = isa<CStyleCastExpr>(E) || isa<CXXStaticCastExpr>(E) ||
847
848 if ((Kind == CK_IntegralCast || Kind == CK_IntegralToBoolean ||
849 (Kind == CK_NoOp && E->getType()->isIntegerType() &&
850 Ty->isIntegerType())) &&
851 IsExplicitCast) {
852 if (const auto *SourceOBT = E->getType()->getAs<OverflowBehaviorType>()) {
853 if (Ty->isIntegerType() && !Ty->isOverflowBehaviorType()) {
854 Ty = Context.getOverflowBehaviorType(SourceOBT->getBehaviorKind(), Ty);
855 }
856 }
857 }
858
859 return ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK,
861}
862
864 switch (ScalarTy->getScalarTypeKind()) {
865 case Type::STK_Bool: return CK_NoOp;
866 case Type::STK_CPointer: return CK_PointerToBoolean;
867 case Type::STK_BlockPointer: return CK_PointerToBoolean;
868 case Type::STK_ObjCObjectPointer: return CK_PointerToBoolean;
869 case Type::STK_MemberPointer: return CK_MemberPointerToBoolean;
870 case Type::STK_Integral: return CK_IntegralToBoolean;
871 case Type::STK_Floating: return CK_FloatingToBoolean;
872 case Type::STK_IntegralComplex: return CK_IntegralComplexToBoolean;
873 case Type::STK_FloatingComplex: return CK_FloatingComplexToBoolean;
874 case Type::STK_FixedPoint: return CK_FixedPointToBoolean;
875 }
876 llvm_unreachable("unknown scalar type kind");
877}
878
879/// Used to prune the decls of Sema's UnusedFileScopedDecls vector.
880static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
881 if (D->getMostRecentDecl()->isUsed())
882 return true;
883
884 if (D->isExternallyVisible())
885 return true;
886
887 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
888 // If this is a function template and none of its specializations is used,
889 // we should warn.
890 if (FunctionTemplateDecl *Template = FD->getDescribedFunctionTemplate())
891 for (const auto *Spec : Template->specializations())
892 if (ShouldRemoveFromUnused(SemaRef, Spec))
893 return true;
894
895 // UnusedFileScopedDecls stores the first declaration.
896 // The declaration may have become definition so check again.
897 const FunctionDecl *DeclToCheck;
898 if (FD->hasBody(DeclToCheck))
899 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
900
901 // Later redecls may add new information resulting in not having to warn,
902 // so check again.
903 DeclToCheck = FD->getMostRecentDecl();
904 if (DeclToCheck != FD)
905 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
906 }
907
908 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
909 // If a variable usable in constant expressions is referenced,
910 // don't warn if it isn't used: if the value of a variable is required
911 // for the computation of a constant expression, it doesn't make sense to
912 // warn even if the variable isn't odr-used. (isReferenced doesn't
913 // precisely reflect that, but it's a decent approximation.)
914 if (VD->isReferenced() &&
915 VD->mightBeUsableInConstantExpressions(SemaRef->Context))
916 return true;
917
918 if (VarTemplateDecl *Template = VD->getDescribedVarTemplate())
919 // If this is a variable template and none of its specializations is used,
920 // we should warn.
921 for (const auto *Spec : Template->specializations())
922 if (ShouldRemoveFromUnused(SemaRef, Spec))
923 return true;
924
925 // UnusedFileScopedDecls stores the first declaration.
926 // The declaration may have become definition so check again.
927 const VarDecl *DeclToCheck = VD->getDefinition();
928 if (DeclToCheck)
929 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
930
931 // Later redecls may add new information resulting in not having to warn,
932 // so check again.
933 DeclToCheck = VD->getMostRecentDecl();
934 if (DeclToCheck != VD)
935 return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
936 }
937
938 return false;
939}
940
941static bool isFunctionOrVarDeclExternC(const NamedDecl *ND) {
942 if (const auto *FD = dyn_cast<FunctionDecl>(ND))
943 return FD->isExternC();
944 return cast<VarDecl>(ND)->isExternC();
945}
946
947/// Determine whether ND is an external-linkage function or variable whose
948/// type has no linkage.
950 // Note: it's not quite enough to check whether VD has UniqueExternalLinkage,
951 // because we also want to catch the case where its type has VisibleNoLinkage,
952 // which does not affect the linkage of VD.
953 return getLangOpts().CPlusPlus && VD->hasExternalFormalLinkage() &&
956}
957
958/// Obtains a sorted list of functions and variables that are undefined but
959/// ODR-used.
961 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> > &Undefined) {
962 for (const auto &UndefinedUse : UndefinedButUsed) {
963 NamedDecl *ND = UndefinedUse.first;
964
965 // Ignore attributes that have become invalid.
966 if (ND->isInvalidDecl()) continue;
967
968 // __attribute__((weakref)) is basically a definition.
969 if (ND->hasAttr<WeakRefAttr>()) continue;
970
972 continue;
973
974 if (ND->hasAttr<DLLImportAttr>() || ND->hasAttr<DLLExportAttr>()) {
975 // An exported function will always be emitted when defined, so even if
976 // the function is inline, it doesn't have to be emitted in this TU. An
977 // imported function implies that it has been exported somewhere else.
978 continue;
979 }
980
981 if (const auto *FD = dyn_cast<FunctionDecl>(ND)) {
982 if (FD->isDefined())
983 continue;
984 if (FD->isExternallyVisible() &&
986 !FD->getMostRecentDecl()->isInlined() &&
987 !FD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
988 continue;
989 if (FD->getBuiltinID())
990 continue;
991 } else {
992 const auto *VD = cast<VarDecl>(ND);
993 if (VD->hasDefinition() != VarDecl::DeclarationOnly)
994 continue;
995 if (VD->isExternallyVisible() &&
997 !VD->getMostRecentDecl()->isInline() &&
998 !VD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
999 continue;
1000
1001 // Skip VarDecls that lack formal definitions but which we know are in
1002 // fact defined somewhere.
1003 if (VD->isKnownToBeDefined())
1004 continue;
1005 }
1006
1007 Undefined.push_back(std::make_pair(ND, UndefinedUse.second));
1008 }
1009}
1010
1011/// checkUndefinedButUsed - Check for undefined objects with internal linkage
1012/// or that are inline.
1014 if (S.UndefinedButUsed.empty()) return;
1015
1016 // Collect all the still-undefined entities with internal linkage.
1019 S.UndefinedButUsed.clear();
1020 if (Undefined.empty()) return;
1021
1022 for (const auto &Undef : Undefined) {
1023 ValueDecl *VD = cast<ValueDecl>(Undef.first);
1024 SourceLocation UseLoc = Undef.second;
1025
1026 if (S.isExternalWithNoLinkageType(VD)) {
1027 // C++ [basic.link]p8:
1028 // A type without linkage shall not be used as the type of a variable
1029 // or function with external linkage unless
1030 // -- the entity has C language linkage
1031 // -- the entity is not odr-used or is defined in the same TU
1032 //
1033 // As an extension, accept this in cases where the type is externally
1034 // visible, since the function or variable actually can be defined in
1035 // another translation unit in that case.
1037 ? diag::ext_undefined_internal_type
1038 : diag::err_undefined_internal_type)
1039 << isa<VarDecl>(VD) << VD;
1040 } else if (!VD->isExternallyVisible()) {
1041 // FIXME: We can promote this to an error. The function or variable can't
1042 // be defined anywhere else, so the program must necessarily violate the
1043 // one definition rule.
1044 bool IsImplicitBase = false;
1045 if (const auto *BaseD = dyn_cast<FunctionDecl>(VD)) {
1046 auto *DVAttr = BaseD->getAttr<OMPDeclareVariantAttr>();
1047 if (DVAttr && !DVAttr->getTraitInfo().isExtensionActive(
1048 llvm::omp::TraitProperty::
1049 implementation_extension_disable_implicit_base)) {
1050 const auto *Func = cast<FunctionDecl>(
1051 cast<DeclRefExpr>(DVAttr->getVariantFuncRef())->getDecl());
1052 IsImplicitBase = BaseD->isImplicit() &&
1053 Func->getIdentifier()->isMangledOpenMPVariantName();
1054 }
1055 }
1056 if (!S.getLangOpts().OpenMP || !IsImplicitBase)
1057 S.Diag(VD->getLocation(), diag::warn_undefined_internal)
1058 << isa<VarDecl>(VD) << VD;
1059 } else if (auto *FD = dyn_cast<FunctionDecl>(VD)) {
1060 (void)FD;
1061 assert(FD->getMostRecentDecl()->isInlined() &&
1062 "used object requires definition but isn't inline or internal?");
1063 // FIXME: This is ill-formed; we should reject.
1064 S.Diag(VD->getLocation(), diag::warn_undefined_inline) << VD;
1065 } else {
1066 assert(cast<VarDecl>(VD)->getMostRecentDecl()->isInline() &&
1067 "used var requires definition but isn't inline or internal?");
1068 S.Diag(VD->getLocation(), diag::err_undefined_inline_var) << VD;
1069 }
1070 if (UseLoc.isValid())
1071 S.Diag(UseLoc, diag::note_used_here);
1072 }
1073}
1074
1076 if (!ExternalSource)
1077 return;
1078
1080 ExternalSource->ReadWeakUndeclaredIdentifiers(WeakIDs);
1081 for (auto &WeakID : WeakIDs)
1082 (void)WeakUndeclaredIdentifiers[WeakID.first].insert(WeakID.second);
1083}
1084
1085
1086typedef llvm::DenseMap<const CXXRecordDecl*, bool> RecordCompleteMap;
1087
1088/// Returns true, if all methods and nested classes of the given
1089/// CXXRecordDecl are defined in this translation unit.
1090///
1091/// Should only be called from ActOnEndOfTranslationUnit so that all
1092/// definitions are actually read.
1094 RecordCompleteMap &MNCComplete) {
1095 RecordCompleteMap::iterator Cache = MNCComplete.find(RD);
1096 if (Cache != MNCComplete.end())
1097 return Cache->second;
1098 if (!RD->isCompleteDefinition())
1099 return false;
1100 bool Complete = true;
1102 E = RD->decls_end();
1103 I != E && Complete; ++I) {
1104 if (const CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I))
1105 Complete = M->isDefined() || M->isDefaulted() ||
1106 (M->isPureVirtual() && !isa<CXXDestructorDecl>(M));
1107 else if (const FunctionTemplateDecl *F = dyn_cast<FunctionTemplateDecl>(*I))
1108 // If the template function is marked as late template parsed at this
1109 // point, it has not been instantiated and therefore we have not
1110 // performed semantic analysis on it yet, so we cannot know if the type
1111 // can be considered complete.
1112 Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&
1113 F->getTemplatedDecl()->isDefined();
1114 else if (const CXXRecordDecl *R = dyn_cast<CXXRecordDecl>(*I)) {
1115 if (R->isInjectedClassName())
1116 continue;
1117 if (R->hasDefinition())
1118 Complete = MethodsAndNestedClassesComplete(R->getDefinition(),
1119 MNCComplete);
1120 else
1121 Complete = false;
1122 }
1123 }
1124 MNCComplete[RD] = Complete;
1125 return Complete;
1126}
1127
1128/// Returns true, if the given CXXRecordDecl is fully defined in this
1129/// translation unit, i.e. all methods are defined or pure virtual and all
1130/// friends, friend functions and nested classes are fully defined in this
1131/// translation unit.
1132///
1133/// Should only be called from ActOnEndOfTranslationUnit so that all
1134/// definitions are actually read.
1136 RecordCompleteMap &RecordsComplete,
1137 RecordCompleteMap &MNCComplete) {
1138 RecordCompleteMap::iterator Cache = RecordsComplete.find(RD);
1139 if (Cache != RecordsComplete.end())
1140 return Cache->second;
1141 bool Complete = MethodsAndNestedClassesComplete(RD, MNCComplete);
1143 E = RD->friend_end();
1144 I != E && Complete; ++I) {
1145 // Check if friend classes and methods are complete.
1146 if (TypeSourceInfo *TSI = (*I)->getFriendType()) {
1147 // Friend classes are available as the TypeSourceInfo of the FriendDecl.
1148 if (CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
1149 Complete = MethodsAndNestedClassesComplete(FriendD, MNCComplete);
1150 else
1151 Complete = false;
1152 } else {
1153 // Friend functions are available through the NamedDecl of FriendDecl.
1154 if (const FunctionDecl *FD =
1155 dyn_cast<FunctionDecl>((*I)->getFriendDecl()))
1156 Complete = FD->isDefined();
1157 else
1158 // This is a template friend, give up.
1159 Complete = false;
1160 }
1161 }
1162 RecordsComplete[RD] = Complete;
1163 return Complete;
1164}
1165
1167 if (ExternalSource)
1168 ExternalSource->ReadUnusedLocalTypedefNameCandidates(
1171 if (TD->isReferenced())
1172 continue;
1173 Diag(TD->getLocation(), diag::warn_unused_local_typedef)
1174 << isa<TypeAliasDecl>(TD) << TD->getDeclName();
1175 }
1177}
1178
1180 if (getLangOpts().CPlusPlusModules &&
1181 getLangOpts().getCompilingModule() == LangOptions::CMK_HeaderUnit)
1182 HandleStartOfHeaderUnit();
1183}
1184
1186 if (Kind == TUFragmentKind::Global) {
1187 // Perform Pending Instantiations at the end of global module fragment so
1188 // that the module ownership of TU-level decls won't get messed.
1189 llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");
1191 return;
1192 }
1193
1194 // Transfer late parsed template instantiations over to the pending template
1195 // instantiation list. During normal compilation, the late template parser
1196 // will be installed and instantiating these templates will succeed.
1197 //
1198 // If we are building a TU prefix for serialization, it is also safe to
1199 // transfer these over, even though they are not parsed. The end of the TU
1200 // should be outside of any eager template instantiation scope, so when this
1201 // AST is deserialized, these templates will not be parsed until the end of
1202 // the combined TU.
1207
1208 // If DefinedUsedVTables ends up marking any virtual member functions it
1209 // might lead to more pending template instantiations, which we then need
1210 // to instantiate.
1212
1213 // C++: Perform implicit template instantiations.
1214 //
1215 // FIXME: When we perform these implicit instantiations, we do not
1216 // carefully keep track of the point of instantiation (C++ [temp.point]).
1217 // This means that name lookup that occurs within the template
1218 // instantiation will always happen at the end of the translation unit,
1219 // so it will find some names that are not required to be found. This is
1220 // valid, but we could do better by diagnosing if an instantiation uses a
1221 // name that was not visible at its first point of instantiation.
1222 if (ExternalSource) {
1223 // Load pending instantiations from the external source.
1225 ExternalSource->ReadPendingInstantiations(Pending);
1226 for (auto PII : Pending)
1227 if (auto Func = dyn_cast<FunctionDecl>(PII.first))
1228 Func->setInstantiationIsPending(true);
1230 Pending.begin(), Pending.end());
1231 }
1232
1233 {
1234 llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");
1236 }
1237
1239
1240 assert(LateParsedInstantiations.empty() &&
1241 "end of TU template instantiation should not create more "
1242 "late-parsed templates");
1243}
1244
1246 assert(DelayedDiagnostics.getCurrentPool() == nullptr
1247 && "reached end of translation unit with a pool attached?");
1248
1249 // If code completion is enabled, don't perform any end-of-translation-unit
1250 // work.
1251 if (PP.isCodeCompletionEnabled())
1252 return;
1253
1254 // Complete translation units and modules define vtables and perform implicit
1255 // instantiations. PCH files do not.
1256 if (TUKind != TU_Prefix) {
1258
1260 !ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1264
1266 } else {
1267 // If we are building a TU prefix for serialization, it is safe to transfer
1268 // these over, even though they are not parsed. The end of the TU should be
1269 // outside of any eager template instantiation scope, so when this AST is
1270 // deserialized, these templates will not be parsed until the end of the
1271 // combined TU.
1276
1277 if (LangOpts.PCHInstantiateTemplates) {
1278 llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");
1280 }
1281 }
1282
1287
1288 // All delayed member exception specs should be checked or we end up accepting
1289 // incompatible declarations.
1292
1293 // All dllexport classes should have been processed already.
1294 assert(DelayedDllExportClasses.empty());
1295 assert(DelayedDllExportMemberFunctions.empty());
1296
1297 // Remove file scoped decls that turned out to be used.
1299 std::remove_if(UnusedFileScopedDecls.begin(nullptr, true),
1301 [this](const DeclaratorDecl *DD) {
1302 return ShouldRemoveFromUnused(this, DD);
1303 }),
1304 UnusedFileScopedDecls.end());
1305
1306 if (TUKind == TU_Prefix) {
1307 // Translation unit prefixes don't need any of the checking below.
1308 if (!PP.isIncrementalProcessingEnabled())
1309 TUScope = nullptr;
1310 return;
1311 }
1312
1313 // Check for #pragma weak identifiers that were never declared
1315 for (const auto &WeakIDs : WeakUndeclaredIdentifiers) {
1316 if (WeakIDs.second.empty())
1317 continue;
1318
1319 Decl *PrevDecl = LookupSingleName(TUScope, WeakIDs.first, SourceLocation(),
1321 if (PrevDecl != nullptr &&
1322 !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl)))
1323 for (const auto &WI : WeakIDs.second)
1324 Diag(WI.getLocation(), diag::warn_attribute_wrong_decl_type)
1325 << "'weak'" << /*isRegularKeyword=*/0 << ExpectedVariableOrFunction;
1326 else
1327 for (const auto &WI : WeakIDs.second)
1328 Diag(WI.getLocation(), diag::warn_weak_identifier_undeclared)
1329 << WeakIDs.first;
1330 }
1331
1332 if (LangOpts.CPlusPlus11 &&
1333 !Diags.isIgnored(diag::warn_delegating_ctor_cycle, SourceLocation()))
1335
1336 if (!Diags.hasErrorOccurred()) {
1337 if (ExternalSource)
1338 ExternalSource->ReadUndefinedButUsed(UndefinedButUsed);
1339 checkUndefinedButUsed(*this);
1340 }
1341
1342 // A global-module-fragment is only permitted within a module unit.
1343 if (!ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1345 Diag(ModuleScopes.back().BeginLoc,
1346 diag::err_module_declaration_missing_after_global_module_introducer);
1347 } else if (getLangOpts().getCompilingModule() ==
1349 // We can't use ModuleScopes here since ModuleScopes is always
1350 // empty if we're compiling the BMI.
1351 !getASTContext().getCurrentNamedModule()) {
1352 // If we are building a module interface unit, we should have seen the
1353 // module declaration.
1354 //
1355 // FIXME: Make a better guess as to where to put the module declaration.
1356 Diag(getSourceManager().getLocForStartOfFile(
1357 getSourceManager().getMainFileID()),
1358 diag::err_module_declaration_missing);
1359 }
1360
1361 // Now we can decide whether the modules we're building need an initializer.
1362 if (Module *CurrentModule = getCurrentModule();
1363 CurrentModule && CurrentModule->isInterfaceOrPartition()) {
1364 auto DoesModNeedInit = [this](Module *M) {
1365 if (!getASTContext().getModuleInitializers(M).empty())
1366 return true;
1367 for (auto [Exported, _] : M->Exports)
1368 if (Exported->isNamedModuleInterfaceHasInit())
1369 return true;
1370 for (Module *I : M->Imports)
1372 return true;
1373
1374 return false;
1375 };
1376
1377 CurrentModule->NamedModuleHasInit =
1378 DoesModNeedInit(CurrentModule) ||
1379 llvm::any_of(CurrentModule->submodules(), DoesModNeedInit);
1380 }
1381
1382 if (TUKind == TU_ClangModule) {
1383 // If we are building a module, resolve all of the exported declarations
1384 // now.
1385 if (Module *CurrentModule = PP.getCurrentModule()) {
1386 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
1387
1389 Stack.push_back(CurrentModule);
1390 while (!Stack.empty()) {
1391 Module *Mod = Stack.pop_back_val();
1392
1393 // Resolve the exported declarations and conflicts.
1394 // FIXME: Actually complain, once we figure out how to teach the
1395 // diagnostic client to deal with complaints in the module map at this
1396 // point.
1397 ModMap.resolveExports(Mod, /*Complain=*/false);
1398 ModMap.resolveUses(Mod, /*Complain=*/false);
1399 ModMap.resolveConflicts(Mod, /*Complain=*/false);
1400
1401 // Queue the submodules, so their exports will also be resolved.
1402 auto SubmodulesRange = Mod->submodules();
1403 Stack.append(SubmodulesRange.begin(), SubmodulesRange.end());
1404 }
1405 }
1406
1407 // Warnings emitted in ActOnEndOfTranslationUnit() should be emitted for
1408 // modules when they are built, not every time they are used.
1410 }
1411
1412 // C++ standard modules. Diagnose cases where a function is declared inline
1413 // in the module purview but has no definition before the end of the TU or
1414 // the start of a Private Module Fragment (if one is present).
1415 if (!PendingInlineFuncDecls.empty()) {
1416 for (auto *D : PendingInlineFuncDecls) {
1417 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
1418 bool DefInPMF = false;
1419 if (auto *FDD = FD->getDefinition()) {
1420 DefInPMF = FDD->getOwningModule()->isPrivateModule();
1421 if (!DefInPMF)
1422 continue;
1423 }
1424 Diag(FD->getLocation(), diag::err_export_inline_not_defined)
1425 << DefInPMF;
1426 // If we have a PMF it should be at the end of the ModuleScopes.
1427 if (DefInPMF &&
1428 ModuleScopes.back().Module->Kind == Module::PrivateModuleFragment) {
1429 Diag(ModuleScopes.back().BeginLoc,
1430 diag::note_private_module_fragment);
1431 }
1432 }
1433 }
1434 PendingInlineFuncDecls.clear();
1435 }
1436
1437 // C99 6.9.2p2:
1438 // A declaration of an identifier for an object that has file
1439 // scope without an initializer, and without a storage-class
1440 // specifier or with the storage-class specifier static,
1441 // constitutes a tentative definition. If a translation unit
1442 // contains one or more tentative definitions for an identifier,
1443 // and the translation unit contains no external definition for
1444 // that identifier, then the behavior is exactly as if the
1445 // translation unit contains a file scope declaration of that
1446 // identifier, with the composite type as of the end of the
1447 // translation unit, with an initializer equal to 0.
1449 for (TentativeDefinitionsType::iterator
1450 T = TentativeDefinitions.begin(ExternalSource.get()),
1451 TEnd = TentativeDefinitions.end();
1452 T != TEnd; ++T) {
1453 VarDecl *VD = (*T)->getActingDefinition();
1454
1455 // If the tentative definition was completed, getActingDefinition() returns
1456 // null. If we've already seen this variable before, insert()'s second
1457 // return value is false.
1458 if (!VD || VD->isInvalidDecl() || !Seen.insert(VD).second)
1459 continue;
1460
1461 if (const IncompleteArrayType *ArrayT
1462 = Context.getAsIncompleteArrayType(VD->getType())) {
1463 // Set the length of the array to 1 (C99 6.9.2p5).
1464 Diag(VD->getLocation(), diag::warn_tentative_incomplete_array);
1465 llvm::APInt One(Context.getTypeSize(Context.getSizeType()), true);
1466 QualType T = Context.getConstantArrayType(
1467 ArrayT->getElementType(), One, nullptr, ArraySizeModifier::Normal, 0);
1468 VD->setType(T);
1469 } else if (RequireCompleteType(VD->getLocation(), VD->getType(),
1470 diag::err_tentative_def_incomplete_type))
1471 VD->setInvalidDecl();
1472
1473 // No initialization is performed for a tentative definition.
1475
1476 // In C, if the definition is const-qualified and has no initializer, it
1477 // is left uninitialized unless it has static or thread storage duration.
1478 QualType Type = VD->getType();
1479 if (!VD->isInvalidDecl() && !getLangOpts().CPlusPlus &&
1480 Type.isConstQualified() && !VD->getAnyInitializer()) {
1481 unsigned DiagID = diag::warn_default_init_const_unsafe;
1482 if (VD->getStorageDuration() == SD_Static ||
1484 DiagID = diag::warn_default_init_const;
1485
1486 bool EmitCppCompat = !Diags.isIgnored(
1487 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
1488 VD->getLocation());
1489
1490 Diag(VD->getLocation(), DiagID) << Type << EmitCppCompat;
1491 }
1492
1493 // Notify the consumer that we've completed a tentative definition.
1494 if (!VD->isInvalidDecl())
1495 Consumer.CompleteTentativeDefinition(VD);
1496 }
1497
1498 // In incremental mode, tentative definitions belong to the current
1499 // partial translation unit (PTU). Once they have been completed and
1500 // emitted to codegen, drop them to prevent re-emission in future PTUs.
1501 if (PP.isIncrementalProcessingEnabled())
1503 TentativeDefinitions.end());
1504
1505 for (auto *D : ExternalDeclarations) {
1506 if (!D || D->isInvalidDecl() || D->getPreviousDecl() || !D->isUsed())
1507 continue;
1508
1509 Consumer.CompleteExternalDeclaration(D);
1510 }
1511
1512 // Visit all pending #pragma export.
1513 for (const PendingPragmaInfo &Exported : PendingExportedNames.values()) {
1514 if (!Exported.Used)
1515 Diag(Exported.NameLoc, diag::warn_failed_to_resolve_pragma) << "export";
1516 }
1517
1518 if (LangOpts.HLSL)
1519 HLSL().ActOnEndOfTranslationUnit(getASTContext().getTranslationUnitDecl());
1520 if (LangOpts.OpenACC)
1522 getASTContext().getTranslationUnitDecl());
1523
1524 // If there were errors, disable 'unused' warnings since they will mostly be
1525 // noise. Don't warn for a use from a module: either we should warn on all
1526 // file-scope declarations in modules or not at all, but whether the
1527 // declaration is used is immaterial.
1528 if (!Diags.hasErrorOccurred() && TUKind != TU_ClangModule) {
1529 // Output warning for unused file scoped decls.
1530 for (UnusedFileScopedDeclsType::iterator
1531 I = UnusedFileScopedDecls.begin(ExternalSource.get()),
1532 E = UnusedFileScopedDecls.end();
1533 I != E; ++I) {
1534 if (ShouldRemoveFromUnused(this, *I))
1535 continue;
1536
1537 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
1538 const FunctionDecl *DiagD;
1539 if (!FD->hasBody(DiagD))
1540 DiagD = FD;
1541 if (DiagD->isDeleted())
1542 continue; // Deleted functions are supposed to be unused.
1543 SourceRange DiagRange = DiagD->getLocation();
1544 if (const ASTTemplateArgumentListInfo *ASTTAL =
1546 DiagRange.setEnd(ASTTAL->RAngleLoc);
1547 if (DiagD->isReferenced()) {
1548 if (isa<CXXMethodDecl>(DiagD))
1549 Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)
1550 << DiagD << DiagRange;
1551 else {
1552 if (FD->getStorageClass() == SC_Static &&
1553 !FD->isInlineSpecified() &&
1554 !SourceMgr.isInMainFile(
1555 SourceMgr.getExpansionLoc(FD->getLocation())))
1556 Diag(DiagD->getLocation(),
1557 diag::warn_unneeded_static_internal_decl)
1558 << DiagD << DiagRange;
1559 else
1560 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
1561 << /*function=*/0 << DiagD << DiagRange;
1562 }
1563 } else if (!FD->isTargetMultiVersion() ||
1564 FD->isTargetMultiVersionDefault()) {
1565 if (FD->getDescribedFunctionTemplate())
1566 Diag(DiagD->getLocation(), diag::warn_unused_template)
1567 << /*function=*/0 << DiagD << DiagRange;
1568 else
1569 Diag(DiagD->getLocation(), isa<CXXMethodDecl>(DiagD)
1570 ? diag::warn_unused_member_function
1571 : diag::warn_unused_function)
1572 << DiagD << DiagRange;
1573 }
1574 } else {
1575 const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition();
1576 if (!DiagD)
1577 DiagD = cast<VarDecl>(*I);
1578 SourceRange DiagRange = DiagD->getLocation();
1579 if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(DiagD)) {
1580 if (const ASTTemplateArgumentListInfo *ASTTAL =
1581 VTSD->getTemplateArgsAsWritten())
1582 DiagRange.setEnd(ASTTAL->RAngleLoc);
1583 }
1584 if (DiagD->isReferenced()) {
1585 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
1586 << /*variable=*/1 << DiagD << DiagRange;
1587 } else if (DiagD->getDescribedVarTemplate()) {
1588 Diag(DiagD->getLocation(), diag::warn_unused_template)
1589 << /*variable=*/1 << DiagD << DiagRange;
1590 } else if (DiagD->getType().isConstQualified()) {
1591 const SourceManager &SM = SourceMgr;
1592 if (SM.getMainFileID() != SM.getFileID(DiagD->getLocation()) ||
1593 !PP.getLangOpts().IsHeaderFile)
1594 Diag(DiagD->getLocation(), diag::warn_unused_const_variable)
1595 << DiagD << DiagRange;
1596 } else {
1597 Diag(DiagD->getLocation(), diag::warn_unused_variable)
1598 << DiagD << DiagRange;
1599 }
1600 }
1601 }
1602
1604 }
1605
1606 if (!Diags.isIgnored(diag::warn_unused_private_field, SourceLocation())) {
1607 // FIXME: Load additional unused private field candidates from the external
1608 // source.
1609 RecordCompleteMap RecordsComplete;
1610 RecordCompleteMap MNCComplete;
1611 for (const NamedDecl *D : UnusedPrivateFields) {
1612 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());
1613 if (RD && !RD->isUnion() &&
1614 IsRecordFullyDefined(RD, RecordsComplete, MNCComplete)) {
1615 Diag(D->getLocation(), diag::warn_unused_private_field)
1616 << D->getDeclName();
1617 }
1618 }
1619 }
1620
1621 if (!Diags.isIgnored(diag::warn_mismatched_delete_new, SourceLocation())) {
1622 if (ExternalSource)
1623 ExternalSource->ReadMismatchingDeleteExpressions(DeleteExprs);
1624 for (const auto &DeletedFieldInfo : DeleteExprs) {
1625 for (const auto &DeleteExprLoc : DeletedFieldInfo.second) {
1626 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first, DeleteExprLoc.first,
1627 DeleteExprLoc.second);
1628 }
1629 }
1630 }
1631
1632 AnalysisWarnings.IssueWarnings(Context.getTranslationUnitDecl());
1633
1634 if (Context.hasAnyFunctionEffects())
1635 performFunctionEffectAnalysis(Context.getTranslationUnitDecl());
1636
1637 // Check we've noticed that we're no longer parsing the initializer for every
1638 // variable. If we miss cases, then at best we have a performance issue and
1639 // at worst a rejects-valid bug.
1640 assert(ParsingInitForAutoVars.empty() &&
1641 "Didn't unmark var as having its initializer parsed");
1642
1643 if (!PP.isIncrementalProcessingEnabled())
1644 TUScope = nullptr;
1645
1646 checkExposure(Context.getTranslationUnitDecl());
1647}
1648
1649
1650//===----------------------------------------------------------------------===//
1651// Helper functions.
1652//===----------------------------------------------------------------------===//
1653
1655 DeclContext *DC = CurContext;
1656
1657 while (true) {
1658 if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC) ||
1660 DC = DC->getParent();
1661 } else if (!AllowLambda && isa<CXXMethodDecl>(DC) &&
1662 cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
1663 cast<CXXRecordDecl>(DC->getParent())->isLambda()) {
1664 DC = DC->getParent()->getParent();
1665 } else break;
1666 }
1667
1668 return DC;
1669}
1670
1671/// getCurFunctionDecl - If inside of a function body, this returns a pointer
1672/// to the function decl for the function being parsed. If we're currently
1673/// in a 'block', this returns the containing context.
1674FunctionDecl *Sema::getCurFunctionDecl(bool AllowLambda) const {
1675 DeclContext *DC = getFunctionLevelDeclContext(AllowLambda);
1676 return dyn_cast<FunctionDecl>(DC);
1677}
1678
1681 while (isa<RecordDecl>(DC))
1682 DC = DC->getParent();
1683 return dyn_cast<ObjCMethodDecl>(DC);
1684}
1685
1689 return cast<NamedDecl>(DC);
1690 return nullptr;
1691}
1692
1698
1699void Sema::EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB) {
1700 // FIXME: It doesn't make sense to me that DiagID is an incoming argument here
1701 // and yet we also use the current diag ID on the DiagnosticsEngine. This has
1702 // been made more painfully obvious by the refactor that introduced this
1703 // function, but it is possible that the incoming argument can be
1704 // eliminated. If it truly cannot be (for example, there is some reentrancy
1705 // issue I am not seeing yet), then there should at least be a clarifying
1706 // comment somewhere.
1707 Diagnostic DiagInfo(&Diags, DB);
1708 if (SFINAETrap *Trap = getSFINAEContext()) {
1709 sema::TemplateDeductionInfo *Info = Trap->getDeductionInfo();
1712 // We'll report the diagnostic below.
1713 break;
1714
1716 // Count this failure so that we know that template argument deduction
1717 // has failed.
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 return;
1729
1731 // Per C++ Core Issue 1170, access control is part of SFINAE.
1732 // Additionally, the WithAccessChecking flag can be used to temporarily
1733 // make access control a part of SFINAE for the purposes of checking
1734 // type traits.
1735 if (!Trap->withAccessChecking() && !getLangOpts().CPlusPlus11)
1736 break;
1737
1738 SourceLocation Loc = DiagInfo.getLocation();
1739
1740 // Suppress this diagnostic.
1741 Trap->setErrorOccurred();
1742
1743 // Make a copy of this suppressed diagnostic and store it with the
1744 // template-deduction information.
1745 if (Info && !Info->hasSFINAEDiagnostic())
1746 Info->addSFINAEDiagnostic(
1747 DiagInfo.getLocation(),
1748 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1749
1750 Diags.setLastDiagnosticIgnored(true);
1751
1752 // Now produce a C++98 compatibility warning.
1753 Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
1754
1755 // The last diagnostic which Sema produced was ignored. Suppress any
1756 // notes attached to it.
1757 Diags.setLastDiagnosticIgnored(true);
1758 return;
1759 }
1760
1762 if (DiagnosticsEngine::Level Level = getDiagnostics().getDiagnosticLevel(
1763 DiagInfo.getID(), DiagInfo.getLocation());
1765 return;
1766 // Make a copy of this suppressed diagnostic and store it with the
1767 // template-deduction information;
1768 if (Info) {
1770 DiagInfo.getLocation(),
1771 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1772 if (!Diags.getDiagnosticIDs()->isNote(DiagID))
1774 Info->addSuppressedDiagnostic(Loc, std::move(PD));
1775 });
1776 }
1777
1778 // Suppress this diagnostic.
1779 Diags.setLastDiagnosticIgnored(true);
1780 return;
1781 }
1782 }
1783
1784 // Copy the diagnostic printing policy over the ASTContext printing policy.
1785 // TODO: Stop doing that. See: https://reviews.llvm.org/D45093#1090292
1786 Context.setPrintingPolicy(getPrintingPolicy());
1787
1788 // Emit the diagnostic.
1789 if (!Diags.EmitDiagnostic(DB))
1790 return;
1791
1792 // If this is not a note, and we're in a template instantiation
1793 // that is different from the last template instantiation where
1794 // we emitted an error, print a template instantiation
1795 // backtrace.
1796 if (!Diags.getDiagnosticIDs()->isNote(DiagID))
1798}
1799
1802 return true;
1803 auto *FD = dyn_cast<FunctionDecl>(CurContext);
1804 if (!FD)
1805 return false;
1806 auto Loc = DeviceDeferredDiags.find(FD);
1807 if (Loc == DeviceDeferredDiags.end())
1808 return false;
1809 for (auto PDAt : Loc->second) {
1810 if (Diags.getDiagnosticIDs()->isDefaultMappingAsError(
1811 PDAt.second.getDiagID()))
1812 return true;
1813 }
1814 return false;
1815}
1816
1817// Print notes showing how we can reach FD starting from an a priori
1818// known-callable function.
1819static void emitCallStackNotes(Sema &S, const FunctionDecl *FD) {
1820 auto FnIt = S.CUDA().DeviceKnownEmittedFns.find(FD);
1821 while (FnIt != S.CUDA().DeviceKnownEmittedFns.end()) {
1822 // Respect error limit.
1824 return;
1825 DiagnosticBuilder Builder(
1826 S.Diags.Report(FnIt->second.Loc, diag::note_called_by));
1827 Builder << FnIt->second.FD;
1828 FnIt = S.CUDA().DeviceKnownEmittedFns.find(FnIt->second.FD);
1829 }
1830}
1831
1832namespace {
1833
1834/// Helper class that emits deferred diagnostic messages if an entity directly
1835/// or indirectly using the function that causes the deferred diagnostic
1836/// messages is known to be emitted.
1837///
1838/// During parsing of AST, certain diagnostic messages are recorded as deferred
1839/// diagnostics since it is unknown whether the functions containing such
1840/// diagnostics will be emitted. A list of potentially emitted functions and
1841/// variables that may potentially trigger emission of functions are also
1842/// recorded. DeferredDiagnosticsEmitter recursively visits used functions
1843/// by each function to emit deferred diagnostics.
1844///
1845/// During the visit, certain OpenMP directives or initializer of variables
1846/// with certain OpenMP attributes will cause subsequent visiting of any
1847/// functions enter a state which is called OpenMP device context in this
1848/// implementation. The state is exited when the directive or initializer is
1849/// exited. This state can change the emission states of subsequent uses
1850/// of functions.
1851///
1852/// Conceptually the functions or variables to be visited form a use graph
1853/// where the parent node uses the child node. At any point of the visit,
1854/// the tree nodes traversed from the tree root to the current node form a use
1855/// stack. The emission state of the current node depends on two factors:
1856/// 1. the emission state of the root node
1857/// 2. whether the current node is in OpenMP device context
1858/// If the function is decided to be emitted, its contained deferred diagnostics
1859/// are emitted, together with the information about the use stack.
1860///
1861class DeferredDiagnosticsEmitter
1862 : public UsedDeclVisitor<DeferredDiagnosticsEmitter> {
1863public:
1864 typedef UsedDeclVisitor<DeferredDiagnosticsEmitter> Inherited;
1865
1866 // Whether the function is already in the current use-path.
1867 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> InUsePath;
1868
1869 // The current use-path.
1870 llvm::SmallVector<CanonicalDeclPtr<FunctionDecl>, 4> UsePath;
1871
1872 // Whether the visiting of the function has been done. Done[0] is for the
1873 // case not in OpenMP device context. Done[1] is for the case in OpenMP
1874 // device context. We need two sets because diagnostics emission may be
1875 // different depending on whether it is in OpenMP device context.
1876 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> DoneMap[2];
1877
1878 // Emission state of the root node of the current use graph.
1879 bool ShouldEmitRootNode;
1880
1881 // Current OpenMP device context level. It is initialized to 0 and each
1882 // entering of device context increases it by 1 and each exit decreases
1883 // it by 1. Non-zero value indicates it is currently in device context.
1884 unsigned InOMPDeviceContext;
1885
1886 DeferredDiagnosticsEmitter(Sema &S)
1887 : Inherited(S), ShouldEmitRootNode(false), InOMPDeviceContext(0) {}
1888
1889 bool shouldVisitDiscardedStmt() const { return false; }
1890
1891 void VisitOMPTargetDirective(OMPTargetDirective *Node) {
1892 ++InOMPDeviceContext;
1893 Inherited::VisitOMPTargetDirective(Node);
1894 --InOMPDeviceContext;
1895 }
1896
1897 void visitUsedDecl(SourceLocation Loc, Decl *D) {
1898 if (isa<VarDecl>(D))
1899 return;
1900 if (auto *FD = dyn_cast<FunctionDecl>(D))
1901 checkFunc(Loc, FD);
1902 else
1903 Inherited::visitUsedDecl(Loc, D);
1904 }
1905
1906 // Visitor member and parent dtors called by this dtor.
1907 void VisitCalledDestructors(CXXDestructorDecl *DD) {
1908 const CXXRecordDecl *RD = DD->getParent();
1909
1910 // Visit the dtors of all members
1911 for (const FieldDecl *FD : RD->fields()) {
1912 QualType FT = FD->getType();
1913 if (const auto *ClassDecl = FT->getAsCXXRecordDecl();
1914 ClassDecl &&
1915 (ClassDecl->isBeingDefined() || ClassDecl->isCompleteDefinition()))
1916 if (CXXDestructorDecl *MemberDtor = ClassDecl->getDestructor())
1917 asImpl().visitUsedDecl(MemberDtor->getLocation(), MemberDtor);
1918 }
1919
1920 // Also visit base class dtors
1921 for (const auto &Base : RD->bases()) {
1922 QualType BaseType = Base.getType();
1923 if (const auto *BaseDecl = BaseType->getAsCXXRecordDecl();
1924 BaseDecl &&
1925 (BaseDecl->isBeingDefined() || BaseDecl->isCompleteDefinition()))
1926 if (CXXDestructorDecl *BaseDtor = BaseDecl->getDestructor())
1927 asImpl().visitUsedDecl(BaseDtor->getLocation(), BaseDtor);
1928 }
1929 }
1930
1931 void VisitDeclStmt(DeclStmt *DS) {
1932 // Visit dtors called by variables that need destruction
1933 for (auto *D : DS->decls())
1934 if (auto *VD = dyn_cast<VarDecl>(D))
1935 if (VD->isThisDeclarationADefinition() &&
1936 VD->needsDestruction(S.Context)) {
1937 QualType VT = VD->getType();
1938 if (const auto *ClassDecl = VT->getAsCXXRecordDecl();
1939 ClassDecl && (ClassDecl->isBeingDefined() ||
1940 ClassDecl->isCompleteDefinition()))
1941 if (CXXDestructorDecl *Dtor = ClassDecl->getDestructor())
1942 asImpl().visitUsedDecl(Dtor->getLocation(), Dtor);
1943 }
1944
1945 Inherited::VisitDeclStmt(DS);
1946 }
1947 void checkVar(VarDecl *VD) {
1948 assert(VD->isFileVarDecl() &&
1949 "Should only check file-scope variables");
1950 if (auto *Init = VD->getInit()) {
1951 auto DevTy = OMPDeclareTargetDeclAttr::getDeviceType(VD);
1952 bool IsDev = DevTy && (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost ||
1953 *DevTy == OMPDeclareTargetDeclAttr::DT_Any);
1954 if (IsDev)
1955 ++InOMPDeviceContext;
1956 this->Visit(Init);
1957 if (IsDev)
1958 --InOMPDeviceContext;
1959 }
1960 }
1961
1962 void checkFunc(SourceLocation Loc, FunctionDecl *FD) {
1963 auto &Done = DoneMap[InOMPDeviceContext > 0 ? 1 : 0];
1964 FunctionDecl *Caller = UsePath.empty() ? nullptr : UsePath.back();
1965 if ((!ShouldEmitRootNode && !S.getLangOpts().OpenMP && !Caller) ||
1966 S.shouldIgnoreInHostDeviceCheck(FD) || InUsePath.count(FD))
1967 return;
1968 // Finalize analysis of OpenMP-specific constructs.
1969 if (Caller && S.LangOpts.OpenMP && UsePath.size() == 1 &&
1970 (ShouldEmitRootNode || InOMPDeviceContext))
1971 S.OpenMP().finalizeOpenMPDelayedAnalysis(Caller, FD, Loc);
1972 if (Caller)
1973 S.CUDA().DeviceKnownEmittedFns[FD] = {Caller, Loc};
1974 // Always emit deferred diagnostics for the direct users. This does not
1975 // lead to explosion of diagnostics since each user is visited at most
1976 // twice.
1977 if (ShouldEmitRootNode || InOMPDeviceContext)
1978 emitDeferredDiags(FD, Caller);
1979 // Do not revisit a function if the function body has been completely
1980 // visited before.
1981 if (!Done.insert(FD).second)
1982 return;
1983 InUsePath.insert(FD);
1984 UsePath.push_back(FD);
1985 if (auto *S = FD->getBody()) {
1986 this->Visit(S);
1987 }
1988 if (CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(FD))
1989 asImpl().VisitCalledDestructors(Dtor);
1990 UsePath.pop_back();
1991 InUsePath.erase(FD);
1992 }
1993
1994 void checkRecordedDecl(Decl *D) {
1995 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
1996 ShouldEmitRootNode = S.getEmissionStatus(FD, /*Final=*/true) ==
1997 Sema::FunctionEmissionStatus::Emitted;
1998 checkFunc(SourceLocation(), FD);
1999 } else
2000 checkVar(cast<VarDecl>(D));
2001 }
2002
2003 // Emit any deferred diagnostics for FD
2004 void emitDeferredDiags(FunctionDecl *FD, bool ShowCallStack) {
2005 auto It = S.DeviceDeferredDiags.find(FD);
2006 if (It == S.DeviceDeferredDiags.end())
2007 return;
2008 bool HasWarningOrError = false;
2009 bool FirstDiag = true;
2010 for (PartialDiagnosticAt &PDAt : It->second) {
2011 // Respect error limit.
2012 if (S.Diags.hasFatalErrorOccurred())
2013 return;
2014 const SourceLocation &Loc = PDAt.first;
2015 const PartialDiagnostic &PD = PDAt.second;
2016 HasWarningOrError |=
2017 S.getDiagnostics().getDiagnosticLevel(PD.getDiagID(), Loc) >=
2019 {
2020 DiagnosticBuilder Builder(S.Diags.Report(Loc, PD.getDiagID()));
2021 PD.Emit(Builder);
2022 }
2023 // Emit the note on the first diagnostic in case too many diagnostics
2024 // cause the note not emitted.
2025 if (FirstDiag && HasWarningOrError && ShowCallStack) {
2026 emitCallStackNotes(S, FD);
2027 FirstDiag = false;
2028 }
2029 }
2030 }
2031};
2032} // namespace
2033
2035 if (ExternalSource)
2036 ExternalSource->ReadDeclsToCheckForDeferredDiags(
2038
2039 if ((DeviceDeferredDiags.empty() && !LangOpts.OpenMP) ||
2041 return;
2042
2043 DeferredDiagnosticsEmitter DDE(*this);
2044 for (auto *D : DeclsToCheckForDeferredDiags)
2045 DDE.checkRecordedDecl(D);
2046}
2047
2048// In CUDA, there are some constructs which may appear in semantically-valid
2049// code, but trigger errors if we ever generate code for the function in which
2050// they appear. Essentially every construct you're not allowed to use on the
2051// device falls into this category, because you are allowed to use these
2052// constructs in a __host__ __device__ function, but only if that function is
2053// never codegen'ed on the device.
2054//
2055// To handle semantic checking for these constructs, we keep track of the set of
2056// functions we know will be emitted, either because we could tell a priori that
2057// they would be emitted, or because they were transitively called by a
2058// known-emitted function.
2059//
2060// We also keep a partial call graph of which not-known-emitted functions call
2061// which other not-known-emitted functions.
2062//
2063// When we see something which is illegal if the current function is emitted
2064// (usually by way of DiagIfDeviceCode, DiagIfHostCode, or
2065// CheckCall), we first check if the current function is known-emitted. If
2066// so, we immediately output the diagnostic.
2067//
2068// Otherwise, we "defer" the diagnostic. It sits in Sema::DeviceDeferredDiags
2069// until we discover that the function is known-emitted, at which point we take
2070// it out of this map and emit the diagnostic.
2071
2072Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(Kind K, SourceLocation Loc,
2073 unsigned DiagID,
2074 const FunctionDecl *Fn,
2075 Sema &S)
2076 : S(S), Loc(Loc), DiagID(DiagID), Fn(Fn),
2077 ShowCallStack(K == K_ImmediateWithCallStack || K == K_Deferred) {
2078 switch (K) {
2079 case K_Nop:
2080 break;
2081 case K_Immediate:
2082 case K_ImmediateWithCallStack:
2083 ImmediateDiag.emplace(
2084 ImmediateDiagBuilder(S.Diags.Report(Loc, DiagID), S, DiagID));
2085 break;
2086 case K_Deferred:
2087 assert(Fn && "Must have a function to attach the deferred diag to.");
2088 auto &Diags = S.DeviceDeferredDiags[Fn];
2089 PartialDiagId.emplace(Diags.size());
2090 Diags.emplace_back(Loc, S.PDiag(DiagID));
2091 break;
2092 }
2093}
2094
2095Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(SemaDiagnosticBuilder &&D)
2096 : S(D.S), Loc(D.Loc), DiagID(D.DiagID), Fn(D.Fn),
2097 ShowCallStack(D.ShowCallStack), ImmediateDiag(D.ImmediateDiag),
2098 PartialDiagId(D.PartialDiagId) {
2099 // Clean the previous diagnostics.
2100 D.ShowCallStack = false;
2101 D.ImmediateDiag.reset();
2102 D.PartialDiagId.reset();
2103}
2104
2105Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
2106 if (ImmediateDiag) {
2107 // Emit our diagnostic and, if it was a warning or error, output a callstack
2108 // if Fn isn't a priori known-emitted.
2109 ImmediateDiag.reset(); // Emit the immediate diag.
2110
2111 if (ShowCallStack) {
2112 bool IsWarningOrError = S.getDiagnostics().getDiagnosticLevel(
2113 DiagID, Loc) >= DiagnosticsEngine::Warning;
2114 if (IsWarningOrError)
2115 emitCallStackNotes(S, Fn);
2116 }
2117 } else {
2118 assert((!PartialDiagId || ShowCallStack) &&
2119 "Must always show call stack for deferred diags.");
2120 }
2121}
2122
2123Sema::SemaDiagnosticBuilder
2124Sema::targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD) {
2125 FD = FD ? FD : getCurFunctionDecl();
2126 if (LangOpts.OpenMP)
2127 return LangOpts.OpenMPIsTargetDevice
2128 ? OpenMP().diagIfOpenMPDeviceCode(Loc, DiagID, FD)
2129 : OpenMP().diagIfOpenMPHostCode(Loc, DiagID, FD);
2130 if (getLangOpts().CUDA)
2131 return getLangOpts().CUDAIsDevice ? CUDA().DiagIfDeviceCode(Loc, DiagID)
2132 : CUDA().DiagIfHostCode(Loc, DiagID);
2133
2134 if (getLangOpts().SYCLIsDevice)
2135 return SYCL().DiagIfDeviceCode(Loc, DiagID);
2136
2138 FD, *this);
2139}
2140
2142 if (isUnevaluatedContext() || Ty.isNull())
2143 return;
2144
2145 // The original idea behind checkTypeSupport function is that unused
2146 // declarations can be replaced with an array of bytes of the same size during
2147 // codegen, such replacement doesn't seem to be possible for types without
2148 // constant byte size like zero length arrays. So, do a deep check for SYCL.
2149 if (D && LangOpts.SYCLIsDevice) {
2150 llvm::DenseSet<QualType> Visited;
2151 SYCL().deepTypeCheckForDevice(Loc, Visited, D);
2152 }
2153
2155
2156 // Memcpy operations for structs containing a member with unsupported type
2157 // are ok, though.
2158 if (const auto *MD = dyn_cast<CXXMethodDecl>(C)) {
2159 if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) &&
2160 MD->isTrivial())
2161 return;
2162
2163 if (const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD))
2164 if (Ctor->isCopyOrMoveConstructor() && Ctor->isTrivial())
2165 return;
2166 }
2167
2168 // Try to associate errors with the lexical context, if that is a function, or
2169 // the value declaration otherwise.
2170 const FunctionDecl *FD = isa<FunctionDecl>(C)
2172 : dyn_cast_or_null<FunctionDecl>(D);
2173
2174 auto CheckDeviceType = [&](QualType Ty) {
2175 if (Ty->isDependentType())
2176 return;
2177
2178 if (Ty->isBitIntType()) {
2179 if (!Context.getTargetInfo().hasBitIntType()) {
2180 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2181 if (D)
2182 PD << D;
2183 else
2184 PD << "expression";
2185 targetDiag(Loc, PD, FD)
2186 << false /*show bit size*/ << 0 /*bitsize*/ << false /*return*/
2187 << Ty << Context.getTargetInfo().getTriple().str();
2188 }
2189 return;
2190 }
2191
2192 // Check if we are dealing with two 'long double' but with different
2193 // semantics.
2194 bool LongDoubleMismatched = false;
2195 if (Ty->isRealFloatingType() && Context.getTypeSize(Ty) == 128) {
2196 const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(Ty);
2197 if ((&Sem != &llvm::APFloat::PPCDoubleDouble() &&
2198 !Context.getTargetInfo().hasFloat128Type()) ||
2199 (&Sem == &llvm::APFloat::PPCDoubleDouble() &&
2200 !Context.getTargetInfo().hasIbm128Type()))
2201 LongDoubleMismatched = true;
2202 }
2203
2204 if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) ||
2205 (Ty->isFloat128Type() && !Context.getTargetInfo().hasFloat128Type()) ||
2206 (Ty->isIbm128Type() && !Context.getTargetInfo().hasIbm128Type()) ||
2207 (Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 &&
2208 !Context.getTargetInfo().hasInt128Type()) ||
2209 (Ty->isBFloat16Type() && !Context.getTargetInfo().hasBFloat16Type() &&
2210 !LangOpts.CUDAIsDevice) ||
2211 LongDoubleMismatched) {
2212 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2213 if (D)
2214 PD << D;
2215 else
2216 PD << "expression";
2217
2218 if (targetDiag(Loc, PD, FD)
2219 << true /*show bit size*/
2220 << static_cast<unsigned>(Context.getTypeSize(Ty)) << Ty
2221 << false /*return*/ << Context.getTargetInfo().getTriple().str()) {
2222 if (D)
2223 D->setInvalidDecl();
2224 }
2225 if (D)
2226 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2227 }
2228 };
2229
2230 auto CheckType = [&](QualType Ty, bool IsRetTy = false) {
2231 if (LangOpts.SYCLIsDevice ||
2232 (LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice) ||
2233 LangOpts.CUDAIsDevice)
2234 CheckDeviceType(Ty);
2235
2237 const TargetInfo &TI = Context.getTargetInfo();
2238 if (!TI.hasLongDoubleType() && UnqualTy == Context.LongDoubleTy) {
2239 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2240 if (D)
2241 PD << D;
2242 else
2243 PD << "expression";
2244
2245 if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty
2246 << false /*return*/
2247 << TI.getTriple().str()) {
2248 if (D)
2249 D->setInvalidDecl();
2250 }
2251 if (D)
2252 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2253 }
2254
2255 bool IsDouble = UnqualTy == Context.DoubleTy;
2256 bool IsFloat = UnqualTy == Context.FloatTy;
2257 if (IsRetTy && !TI.hasFPReturn() && (IsDouble || IsFloat)) {
2258 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2259 if (D)
2260 PD << D;
2261 else
2262 PD << "expression";
2263
2264 if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty << true /*return*/
2265 << TI.getTriple().str()) {
2266 if (D)
2267 D->setInvalidDecl();
2268 }
2269 if (D)
2270 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2271 }
2272
2273 if (TI.hasRISCVVTypes() && Ty->isRVVSizelessBuiltinType() && FD) {
2274 llvm::StringMap<bool> CallerFeatureMap;
2275 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2276 RISCV().checkRVVTypeSupport(Ty, Loc, D, CallerFeatureMap);
2277 }
2278
2279 // Don't allow SVE types in functions without a SVE target.
2280 if (Ty->isSVESizelessBuiltinType() && FD) {
2281 llvm::StringMap<bool> CallerFeatureMap;
2282 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2283 ARM().checkSVETypeSupport(Ty, Loc, FD, CallerFeatureMap);
2284 }
2285
2286 if (auto *VT = Ty->getAs<VectorType>();
2287 VT && FD &&
2288 (VT->getVectorKind() == VectorKind::SveFixedLengthData ||
2289 VT->getVectorKind() == VectorKind::SveFixedLengthPredicate) &&
2290 (LangOpts.VScaleMin != LangOpts.VScaleStreamingMin ||
2291 LangOpts.VScaleMax != LangOpts.VScaleStreamingMax)) {
2292 if (IsArmStreamingFunction(FD, /*IncludeLocallyStreaming=*/true)) {
2293 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2294 << Ty << /*Streaming*/ 0;
2295 } else if (const auto *FTy = FD->getType()->getAs<FunctionProtoType>()) {
2296 if (FTy->getAArch64SMEAttributes() &
2298 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2299 << Ty << /*StreamingCompatible*/ 1;
2300 }
2301 }
2302 }
2303 };
2304
2305 CheckType(Ty);
2306 if (const auto *FPTy = dyn_cast<FunctionProtoType>(Ty)) {
2307 for (const auto &ParamTy : FPTy->param_types())
2308 CheckType(ParamTy);
2309 CheckType(FPTy->getReturnType(), /*IsRetTy=*/true);
2310 }
2311 if (const auto *FNPTy = dyn_cast<FunctionNoProtoType>(Ty))
2312 CheckType(FNPTy->getReturnType(), /*IsRetTy=*/true);
2313}
2314
2315bool Sema::findMacroSpelling(SourceLocation &locref, StringRef name) {
2316 SourceLocation loc = locref;
2317 if (!loc.isMacroID()) return false;
2318
2319 // There's no good way right now to look at the intermediate
2320 // expansions, so just jump to the expansion location.
2321 loc = getSourceManager().getExpansionLoc(loc);
2322
2323 // If that's written with the name, stop here.
2324 SmallString<16> buffer;
2325 if (getPreprocessor().getSpelling(loc, buffer) == name) {
2326 locref = loc;
2327 return true;
2328 }
2329 return false;
2330}
2331
2333
2334 if (!Ctx)
2335 return nullptr;
2336
2337 Ctx = Ctx->getPrimaryContext();
2338 for (Scope *S = getCurScope(); S; S = S->getParent()) {
2339 // Ignore scopes that cannot have declarations. This is important for
2340 // out-of-line definitions of static class members.
2341 if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))
2342 if (DeclContext *Entity = S->getEntity())
2343 if (Ctx == Entity->getPrimaryContext())
2344 return S;
2345 }
2346
2347 return nullptr;
2348}
2349
2350/// Enter a new function scope
2352 if (FunctionScopes.empty() && CachedFunctionScope) {
2353 // Use CachedFunctionScope to avoid allocating memory when possible.
2354 CachedFunctionScope->Clear();
2355 FunctionScopes.push_back(CachedFunctionScope.release());
2356 } else {
2358 }
2359 if (LangOpts.OpenMP)
2360 OpenMP().pushOpenMPFunctionRegion();
2361}
2362
2365 BlockScope, Block));
2367}
2368
2371 FunctionScopes.push_back(LSI);
2373 return LSI;
2374}
2375
2377 if (LambdaScopeInfo *const LSI = getCurLambda()) {
2378 LSI->AutoTemplateParameterDepth = Depth;
2379 return;
2380 }
2381 llvm_unreachable(
2382 "Remove assertion if intentionally called in a non-lambda context.");
2383}
2384
2385// Check that the type of the VarDecl has an accessible copy constructor and
2386// resolve its destructor's exception specification.
2387// This also performs initialization of block variables when they are moved
2388// to the heap. It uses the same rules as applicable for implicit moves
2389// according to the C++ standard in effect ([class.copy.elision]p3).
2390static void checkEscapingByref(VarDecl *VD, Sema &S) {
2391 QualType T = VD->getType();
2394 SourceLocation Loc = VD->getLocation();
2395 Expr *VarRef =
2396 new (S.Context) DeclRefExpr(S.Context, VD, false, T, VK_LValue, Loc);
2397 ExprResult Result;
2398 auto IE = InitializedEntity::InitializeBlock(Loc, T);
2399 if (S.getLangOpts().CPlusPlus23) {
2400 auto *E = ImplicitCastExpr::Create(S.Context, T, CK_NoOp, VarRef, nullptr,
2402 Result = S.PerformCopyInitialization(IE, SourceLocation(), E);
2403 } else {
2406 VarRef);
2407 }
2408
2409 if (!Result.isInvalid()) {
2410 Result = S.MaybeCreateExprWithCleanups(Result);
2411 Expr *Init = Result.getAs<Expr>();
2413 }
2414
2415 // The destructor's exception specification is needed when IRGen generates
2416 // block copy/destroy functions. Resolve it here.
2417 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
2418 if (CXXDestructorDecl *DD = RD->getDestructor()) {
2419 auto *FPT = DD->getType()->castAs<FunctionProtoType>();
2420 S.ResolveExceptionSpec(Loc, FPT);
2421 }
2422}
2423
2424static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S) {
2425 // Set the EscapingByref flag of __block variables captured by
2426 // escaping blocks.
2427 for (const BlockDecl *BD : FSI.Blocks) {
2428 for (const BlockDecl::Capture &BC : BD->captures()) {
2429 VarDecl *VD = BC.getVariable();
2430 if (VD->hasAttr<BlocksAttr>()) {
2431 // Nothing to do if this is a __block variable captured by a
2432 // non-escaping block.
2433 if (BD->doesNotEscape())
2434 continue;
2435 VD->setEscapingByref();
2436 }
2437 // Check whether the captured variable is or contains an object of
2438 // non-trivial C union type.
2439 QualType CapType = BC.getVariable()->getType();
2442 S.checkNonTrivialCUnion(BC.getVariable()->getType(),
2443 BD->getCaretLocation(),
2446 }
2447 }
2448
2449 for (VarDecl *VD : FSI.ByrefBlockVars) {
2450 // __block variables might require us to capture a copy-initializer.
2451 if (!VD->isEscapingByref())
2452 continue;
2453 // It's currently invalid to ever have a __block variable with an
2454 // array type; should we diagnose that here?
2455 // Regardless, we don't want to ignore array nesting when
2456 // constructing this copy.
2457 if (VD->getType()->isStructureOrClassType())
2458 checkEscapingByref(VD, S);
2459 }
2460}
2461
2464 QualType BlockType) {
2465 assert(!FunctionScopes.empty() && "mismatched push/pop!");
2466
2467 markEscapingByrefs(*FunctionScopes.back(), *this);
2468
2471
2472 if (LangOpts.OpenMP)
2473 OpenMP().popOpenMPFunctionRegion(Scope.get());
2474
2475 // Issue any analysis-based warnings.
2476 if (WP && D) {
2477 inferNoReturnAttr(*this, D);
2478 AnalysisWarnings.IssueWarnings(*WP, Scope.get(), D, BlockType);
2479 } else
2480 for (const auto &PUD : Scope->PossiblyUnreachableDiags)
2481 Diag(PUD.Loc, PUD.PD);
2482
2483 return Scope;
2484}
2485
2488 if (!Scope->isPlainFunction())
2489 Self->CapturingFunctionScopes--;
2490 // Stash the function scope for later reuse if it's for a normal function.
2491 if (Scope->isPlainFunction() && !Self->CachedFunctionScope)
2492 Self->CachedFunctionScope.reset(Scope);
2493 else
2494 delete Scope;
2495}
2496
2497void Sema::PushCompoundScope(bool IsStmtExpr) {
2498 getCurFunction()->CompoundScopes.push_back(
2499 CompoundScopeInfo(IsStmtExpr, getCurFPFeatures()));
2500}
2501
2503 FunctionScopeInfo *CurFunction = getCurFunction();
2504 assert(!CurFunction->CompoundScopes.empty() && "mismatched push/pop");
2505
2506 CurFunction->CompoundScopes.pop_back();
2507}
2508
2510 return getCurFunction()->hasUnrecoverableErrorOccurred();
2511}
2512
2514 if (!FunctionScopes.empty())
2515 FunctionScopes.back()->setHasBranchIntoScope();
2516}
2517
2519 if (!FunctionScopes.empty())
2520 FunctionScopes.back()->setHasBranchProtectedScope();
2521}
2522
2524 if (!FunctionScopes.empty())
2525 FunctionScopes.back()->setHasIndirectGoto();
2526}
2527
2529 if (!FunctionScopes.empty())
2530 FunctionScopes.back()->setHasMustTail();
2531}
2532
2534 if (FunctionScopes.empty())
2535 return nullptr;
2536
2537 auto CurBSI = dyn_cast<BlockScopeInfo>(FunctionScopes.back());
2538 if (CurBSI && CurBSI->TheDecl &&
2539 !CurBSI->TheDecl->Encloses(CurContext)) {
2540 // We have switched contexts due to template instantiation.
2541 assert(!CodeSynthesisContexts.empty());
2542 return nullptr;
2543 }
2544
2545 return CurBSI;
2546}
2547
2549 if (FunctionScopes.empty())
2550 return nullptr;
2551
2552 for (int e = FunctionScopes.size() - 1; e >= 0; --e) {
2554 continue;
2555 return FunctionScopes[e];
2556 }
2557 return nullptr;
2558}
2559
2561 for (auto *Scope : llvm::reverse(FunctionScopes)) {
2562 if (auto *CSI = dyn_cast<CapturingScopeInfo>(Scope)) {
2563 auto *LSI = dyn_cast<LambdaScopeInfo>(CSI);
2564 if (LSI && LSI->Lambda && !LSI->Lambda->Encloses(CurContext) &&
2565 LSI->AfterParameterList) {
2566 // We have switched contexts due to template instantiation.
2567 // FIXME: We should swap out the FunctionScopes during code synthesis
2568 // so that we don't need to check for this.
2569 assert(!CodeSynthesisContexts.empty());
2570 return nullptr;
2571 }
2572 return CSI;
2573 }
2574 }
2575 return nullptr;
2576}
2577
2578LambdaScopeInfo *Sema::getCurLambda(bool IgnoreNonLambdaCapturingScope) {
2579 if (FunctionScopes.empty())
2580 return nullptr;
2581
2582 auto I = FunctionScopes.rbegin();
2583 if (IgnoreNonLambdaCapturingScope) {
2584 auto E = FunctionScopes.rend();
2585 while (I != E && isa<CapturingScopeInfo>(*I) && !isa<LambdaScopeInfo>(*I))
2586 ++I;
2587 if (I == E)
2588 return nullptr;
2589 }
2590 auto *CurLSI = dyn_cast<LambdaScopeInfo>(*I);
2591 if (CurLSI && CurLSI->Lambda && CurLSI->CallOperator &&
2592 !CurLSI->Lambda->Encloses(CurContext) && CurLSI->AfterParameterList) {
2593 // We have switched contexts due to template instantiation.
2594 assert(!CodeSynthesisContexts.empty());
2595 return nullptr;
2596 }
2597
2598 return CurLSI;
2599}
2600
2601// We have a generic lambda if we parsed auto parameters, or we have
2602// an associated template parameter list.
2604 if (LambdaScopeInfo *LSI = getCurLambda()) {
2605 return (LSI->TemplateParams.size() ||
2606 LSI->GLTemplateParameterList) ? LSI : nullptr;
2607 }
2608 return nullptr;
2609}
2610
2611
2613 if (!LangOpts.RetainCommentsFromSystemHeaders &&
2614 SourceMgr.isInSystemHeader(Comment.getBegin()))
2615 return;
2616 RawComment RC(SourceMgr, Comment, LangOpts.CommentOpts, false);
2618 SourceRange MagicMarkerRange(Comment.getBegin(),
2619 Comment.getBegin().getLocWithOffset(3));
2620 StringRef MagicMarkerText;
2621 switch (RC.getKind()) {
2623 MagicMarkerText = "///<";
2624 break;
2626 MagicMarkerText = "/**<";
2627 break;
2629 // FIXME: are there other scenarios that could produce an invalid
2630 // raw comment here?
2631 Diag(Comment.getBegin(), diag::warn_splice_in_doxygen_comment);
2632 return;
2633 default:
2634 llvm_unreachable("if this is an almost Doxygen comment, "
2635 "it should be ordinary");
2636 }
2637 Diag(Comment.getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
2638 FixItHint::CreateReplacement(MagicMarkerRange, MagicMarkerText);
2639 }
2640 Context.addComment(RC);
2641}
2642
2643// Pin this vtable to this file.
2645char ExternalSemaSource::ID;
2646
2649
2653
2655 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {}
2656
2658 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &) {}
2659
2660bool Sema::tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
2662 ZeroArgCallReturnTy = QualType();
2663 OverloadSet.clear();
2664
2665 const OverloadExpr *Overloads = nullptr;
2666 bool IsMemExpr = false;
2667 if (E.getType() == Context.OverloadTy) {
2669
2670 // Ignore overloads that are pointer-to-member constants.
2672 return false;
2673
2674 Overloads = FR.Expression;
2675 } else if (E.getType() == Context.BoundMemberTy) {
2676 Overloads = dyn_cast<UnresolvedMemberExpr>(E.IgnoreParens());
2677 IsMemExpr = true;
2678 }
2679
2680 bool Ambiguous = false;
2681 bool IsMV = false;
2682
2683 if (Overloads) {
2684 for (OverloadExpr::decls_iterator it = Overloads->decls_begin(),
2685 DeclsEnd = Overloads->decls_end(); it != DeclsEnd; ++it) {
2686 OverloadSet.addDecl(*it);
2687
2688 // Check whether the function is a non-template, non-member which takes no
2689 // arguments.
2690 if (IsMemExpr)
2691 continue;
2692 if (const FunctionDecl *OverloadDecl
2693 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
2694 if (OverloadDecl->getMinRequiredArguments() == 0) {
2695 if (!ZeroArgCallReturnTy.isNull() && !Ambiguous &&
2696 (!IsMV || !(OverloadDecl->isCPUDispatchMultiVersion() ||
2697 OverloadDecl->isCPUSpecificMultiVersion()))) {
2698 ZeroArgCallReturnTy = QualType();
2699 Ambiguous = true;
2700 } else {
2701 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
2702 IsMV = OverloadDecl->isCPUDispatchMultiVersion() ||
2703 OverloadDecl->isCPUSpecificMultiVersion();
2704 }
2705 }
2706 }
2707 }
2708
2709 // If it's not a member, use better machinery to try to resolve the call
2710 if (!IsMemExpr)
2711 return !ZeroArgCallReturnTy.isNull();
2712 }
2713
2714 // Attempt to call the member with no arguments - this will correctly handle
2715 // member templates with defaults/deduction of template arguments, overloads
2716 // with default arguments, etc.
2717 if (IsMemExpr && !E.isTypeDependent()) {
2718 Sema::TentativeAnalysisScope Trap(*this);
2720 SourceLocation());
2721 if (R.isUsable()) {
2722 ZeroArgCallReturnTy = R.get()->getType();
2723 return true;
2724 }
2725 return false;
2726 }
2727
2728 if (const auto *DeclRef = dyn_cast<DeclRefExpr>(E.IgnoreParens())) {
2729 if (const auto *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
2730 if (Fun->getMinRequiredArguments() == 0)
2731 ZeroArgCallReturnTy = Fun->getReturnType();
2732 return true;
2733 }
2734 }
2735
2736 // We don't have an expression that's convenient to get a FunctionDecl from,
2737 // but we can at least check if the type is "function of 0 arguments".
2738 QualType ExprTy = E.getType();
2739 const FunctionType *FunTy = nullptr;
2740 QualType PointeeTy = ExprTy->getPointeeType();
2741 if (!PointeeTy.isNull())
2742 FunTy = PointeeTy->getAs<FunctionType>();
2743 if (!FunTy)
2744 FunTy = ExprTy->getAs<FunctionType>();
2745
2746 if (const auto *FPT = dyn_cast_if_present<FunctionProtoType>(FunTy)) {
2747 if (FPT->getNumParams() == 0)
2748 ZeroArgCallReturnTy = FunTy->getReturnType();
2749 return true;
2750 }
2751 return false;
2752}
2753
2754/// Give notes for a set of overloads.
2755///
2756/// A companion to tryExprAsCall. In cases when the name that the programmer
2757/// wrote was an overloaded function, we may be able to make some guesses about
2758/// plausible overloads based on their return types; such guesses can be handed
2759/// off to this method to be emitted as notes.
2760///
2761/// \param Overloads - The overloads to note.
2762/// \param FinalNoteLoc - If we've suppressed printing some overloads due to
2763/// -fshow-overloads=best, this is the location to attach to the note about too
2764/// many candidates. Typically this will be the location of the original
2765/// ill-formed expression.
2766static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads,
2767 const SourceLocation FinalNoteLoc) {
2768 unsigned ShownOverloads = 0;
2769 unsigned SuppressedOverloads = 0;
2770 for (UnresolvedSetImpl::iterator It = Overloads.begin(),
2771 DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
2772 if (ShownOverloads >= S.Diags.getNumOverloadCandidatesToShow()) {
2773 ++SuppressedOverloads;
2774 continue;
2775 }
2776
2777 const NamedDecl *Fn = (*It)->getUnderlyingDecl();
2778 // Don't print overloads for non-default multiversioned functions.
2779 if (const auto *FD = Fn->getAsFunction()) {
2780 if (FD->isMultiVersion() && FD->hasAttr<TargetAttr>() &&
2781 !FD->getAttr<TargetAttr>()->isDefaultVersion())
2782 continue;
2783 if (FD->isMultiVersion() && FD->hasAttr<TargetVersionAttr>() &&
2784 !FD->getAttr<TargetVersionAttr>()->isDefaultVersion())
2785 continue;
2786 }
2787 S.Diag(Fn->getLocation(), diag::note_possible_target_of_call);
2788 ++ShownOverloads;
2789 }
2790
2791 S.Diags.overloadCandidatesShown(ShownOverloads);
2792
2793 if (SuppressedOverloads)
2794 S.Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
2795 << SuppressedOverloads;
2796}
2797
2799 const UnresolvedSetImpl &Overloads,
2800 bool (*IsPlausibleResult)(QualType)) {
2801 if (!IsPlausibleResult)
2802 return noteOverloads(S, Overloads, Loc);
2803
2804 UnresolvedSet<2> PlausibleOverloads;
2805 for (OverloadExpr::decls_iterator It = Overloads.begin(),
2806 DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
2807 const auto *OverloadDecl = cast<FunctionDecl>(*It);
2808 QualType OverloadResultTy = OverloadDecl->getReturnType();
2809 if (IsPlausibleResult(OverloadResultTy))
2810 PlausibleOverloads.addDecl(It.getDecl());
2811 }
2812 noteOverloads(S, PlausibleOverloads, Loc);
2813}
2814
2815/// Determine whether the given expression can be called by just
2816/// putting parentheses after it. Notably, expressions with unary
2817/// operators can't be because the unary operator will start parsing
2818/// outside the call.
2819static bool IsCallableWithAppend(const Expr *E) {
2820 E = E->IgnoreImplicit();
2821 return (!isa<CStyleCastExpr>(E) &&
2822 !isa<UnaryOperator>(E) &&
2823 !isa<BinaryOperator>(E) &&
2825}
2826
2828 if (const auto *UO = dyn_cast<UnaryOperator>(E))
2829 E = UO->getSubExpr();
2830
2831 if (const auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
2832 if (ULE->getNumDecls() == 0)
2833 return false;
2834
2835 const NamedDecl *ND = *ULE->decls_begin();
2836 if (const auto *FD = dyn_cast<FunctionDecl>(ND))
2838 }
2839 return false;
2840}
2841
2843 bool ForceComplain,
2844 bool (*IsPlausibleResult)(QualType)) {
2845 SourceLocation Loc = E.get()->getExprLoc();
2846 SourceRange Range = E.get()->getSourceRange();
2847 UnresolvedSet<4> Overloads;
2848
2849 // If this is a SFINAE context, don't try anything that might trigger ADL
2850 // prematurely.
2851 if (!isSFINAEContext()) {
2852 QualType ZeroArgCallTy;
2853 if (tryExprAsCall(*E.get(), ZeroArgCallTy, Overloads) &&
2854 !ZeroArgCallTy.isNull() &&
2855 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
2856 // At this point, we know E is potentially callable with 0
2857 // arguments and that it returns something of a reasonable type,
2858 // so we can emit a fixit and carry on pretending that E was
2859 // actually a CallExpr.
2860 SourceLocation ParenInsertionLoc = getLocForEndOfToken(Range.getEnd());
2862 Diag(Loc, PD) << /*zero-arg*/ 1 << IsMV << Range
2863 << (IsCallableWithAppend(E.get())
2864 ? FixItHint::CreateInsertion(ParenInsertionLoc,
2865 "()")
2866 : FixItHint());
2867 if (!IsMV)
2868 notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
2869
2870 // FIXME: Try this before emitting the fixit, and suppress diagnostics
2871 // while doing so.
2872 E = BuildCallExpr(nullptr, E.get(), Range.getEnd(), {},
2873 Range.getEnd().getLocWithOffset(1));
2874 return true;
2875 }
2876 }
2877 if (!ForceComplain) return false;
2878
2880 Diag(Loc, PD) << /*not zero-arg*/ 0 << IsMV << Range;
2881 if (!IsMV)
2882 notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
2883 E = ExprError();
2884 return true;
2885}
2886
2888 if (!Ident_super)
2889 Ident_super = &Context.Idents.get("super");
2890 return Ident_super;
2891}
2892
2895 unsigned OpenMPCaptureLevel) {
2896 auto *CSI = new CapturedRegionScopeInfo(
2897 getDiagnostics(), S, CD, RD, CD->getContextParam(), K,
2898 (getLangOpts().OpenMP && K == CR_OpenMP)
2899 ? OpenMP().getOpenMPNestingLevel()
2900 : 0,
2901 OpenMPCaptureLevel);
2902 CSI->ReturnType = Context.VoidTy;
2903 FunctionScopes.push_back(CSI);
2905}
2906
2908 if (FunctionScopes.empty())
2909 return nullptr;
2910
2911 return dyn_cast<CapturedRegionScopeInfo>(FunctionScopes.back());
2912}
2913
2914const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
2918
2920 : S(S), OldFPFeaturesState(S.CurFPFeatures),
2921 OldOverrides(S.FpPragmaStack.CurrentValue),
2922 OldEvalMethod(S.PP.getCurrentFPEvalMethod()),
2923 OldFPPragmaLocation(S.PP.getLastFPEvalPragmaLocation()) {}
2924
2926 S.CurFPFeatures = OldFPFeaturesState;
2927 S.FpPragmaStack.CurrentValue = OldOverrides;
2928 S.PP.setCurrentFPEvalMethod(OldFPPragmaLocation, OldEvalMethod);
2929}
2930
2932 assert(D.getCXXScopeSpec().isSet() &&
2933 "can only be called for qualified names");
2934
2935 auto LR = LookupResult(*this, D.getIdentifier(), D.getBeginLoc(),
2939 if (!DC)
2940 return false;
2941
2942 LookupQualifiedName(LR, DC);
2943 bool Result = llvm::all_of(LR, [](Decl *Dcl) {
2944 if (NamedDecl *ND = dyn_cast<NamedDecl>(Dcl)) {
2945 ND = ND->getUnderlyingDecl();
2946 return isa<FunctionDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
2947 isa<UsingDecl>(ND);
2948 }
2949 return false;
2950 });
2951 return Result;
2952}
2953
2956
2957 auto *A = AnnotateAttr::Create(Context, Annot, Args.data(), Args.size(), CI);
2959 CI, MutableArrayRef<Expr *>(A->args_begin(), A->args_end()))) {
2960 return nullptr;
2961 }
2962 return A;
2963}
2964
2966 // Make sure that there is a string literal as the annotation's first
2967 // argument.
2968 StringRef Str;
2969 if (!checkStringLiteralArgumentAttr(AL, 0, Str))
2970 return nullptr;
2971
2973 Args.reserve(AL.getNumArgs() - 1);
2974 for (unsigned Idx = 1; Idx < AL.getNumArgs(); Idx++) {
2975 assert(!AL.isArgIdent(Idx));
2976 Args.push_back(AL.getArgAsExpr(Idx));
2977 }
2978
2979 return CreateAnnotationAttr(AL, Str, Args);
2980}
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:2390
static bool IsCPUDispatchCPUSpecificMultiVersion(const Expr *E)
Definition Sema.cpp:2827
llvm::DenseMap< const CXXRecordDecl *, bool > RecordCompleteMap
Definition Sema.cpp:1086
static bool IsCallableWithAppend(const Expr *E)
Determine whether the given expression can be called by just putting parentheses after it.
Definition Sema.cpp:2819
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:1093
static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads, const SourceLocation FinalNoteLoc)
Give notes for a set of overloads.
Definition Sema.cpp:2766
static bool isFunctionOrVarDeclExternC(const NamedDecl *ND)
Definition Sema.cpp:941
static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S)
Definition Sema.cpp:2424
static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D)
Used to prune the decls of Sema's UnusedFileScopedDecls vector.
Definition Sema.cpp:880
static void emitCallStackNotes(Sema &S, const FunctionDecl *FD)
Definition Sema.cpp:1819
static void notePlausibleOverloads(Sema &S, SourceLocation Loc, const UnresolvedSetImpl &Overloads, bool(*IsPlausibleResult)(QualType))
Definition Sema.cpp:2798
static void checkUndefinedButUsed(Sema &S)
checkUndefinedButUsed - Check for undefined objects with internal linkage or that are inline.
Definition Sema.cpp:1013
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:1135
Defines the SourceManager interface.
Allows QualTypes to be sorted and hence used in maps and sets.
TypePropertyCache< Private > Cache
Definition Type.cpp:4856
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:35
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:226
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:46
A class which contains all the information about a particular captured value.
Definition Decl.h:4680
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4674
ArrayRef< Capture > captures() const
Definition Decl.h:4801
SourceLocation getCaretLocation() const
Definition Decl.h:4747
bool doesNotEscape() const
Definition Decl.h:4825
Represents a C++ destructor within a class.
Definition DeclCXX.h:2875
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:2135
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2261
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:2127
friend_iterator friend_end() const
Definition DeclFriend.h:254
bool isSet() const
Deprecated.
Definition DeclSpec.h:199
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4946
ImplicitParamDecl * getContextParam() const
Retrieve the parameter containing captured variables.
Definition Decl.h:5004
static const char * getCastKindName(CastKind CK)
Definition Expr.cpp:1951
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:1273
FriendSpecified isFriendSpecified() const
Definition DeclSpec.h:826
decl_range decls()
Definition Stmt.h:1671
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:1921
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Definition DeclSpec.h:2068
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclSpec.h:2104
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
Definition DeclSpec.h:2083
const IdentifierInfo * getIdentifier() const
Definition DeclSpec.h:2351
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:785
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
Definition Diagnostic.h:770
Level
The level of the diagnostic, after it has been through mapping.
Definition Diagnostic.h:237
bool hasFatalErrorOccurred() const
Definition Diagnostic.h:887
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:3090
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3078
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3086
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:277
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:2648
virtual void ReadMethodPool(Selector Sel)
Load the contents of the global method pool for a given selector.
Definition Sema.cpp:2647
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:2654
~ExternalSemaSource() override
Definition Sema.cpp:2644
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:2650
virtual void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &)
Definition Sema.cpp:2657
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:3280
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
Definition Decl.cpp:3707
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:3703
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:4340
static FunctionEffectsRef get(QualType QT)
Extract the effects from a Type if it is a function, block, or member function pointer,...
Definition TypeBase.h:9284
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5276
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4472
QualType getReturnType() const
Definition TypeBase.h:4812
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:3856
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition Expr.cpp:2073
Represents a C array with an unspecified size.
Definition TypeBase.h:3917
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:1331
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:858
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:3129
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
Definition ExprCXX.h:3190
UnresolvedSetImpl::iterator decls_iterator
Definition ExprCXX.h:3220
decls_iterator decls_begin() const
Definition ExprCXX.h:3222
decls_iterator decls_end() const
Definition ExprCXX.h:3225
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:8401
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8443
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8422
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:4327
field_range fields() const
Definition Decl.h:4530
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 ActOnEndOfTranslationUnit(TranslationUnitDecl *TU)
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:1378
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1393
Custom deleter to allow FunctionScopeInfos to be kept alive for a short time after they've been poppe...
Definition Sema.h:1065
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2487
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12516
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Definition Sema.h:12560
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:868
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
Definition Sema.h:3615
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition SemaAttr.cpp:507
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13637
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13113
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2560
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1133
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
Definition Sema.h:10110
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1075
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:949
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition Sema.cpp:2660
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9381
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the pragma attribute stack.
Definition Sema.h:2132
OpaquePtr< QualType > TypeTy
Definition Sema.h:1293
void addImplicitTypedef(StringRef Name, QualType T)
Definition Sema.cpp:365
void PrintContextStack()
Definition Sema.h:13724
SemaOpenMP & OpenMP()
Definition Sema.h:1524
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6330
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
Definition Sema.h:1254
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Definition Sema.h:3597
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1166
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition Sema.h:6547
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
Definition Sema.h:1243
SemaCUDA & CUDA()
Definition Sema.h:1464
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:1236
Preprocessor & getPreprocessor() const
Definition Sema.h:938
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2332
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2067
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2061
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2513
void ActOnComment(SourceRange Comment)
Definition Sema.cpp:2612
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
Definition Sema.cpp:1245
FPOptionsOverride CurFPFeatureOverrides()
Definition Sema.h:2068
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:1549
IdentifierInfo * getSuperIdentifier() const
Definition Sema.cpp:2887
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:1674
void DiagnosePrecisionLossInComplexDivision()
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
Definition Sema.h:9321
ASTContext & Context
Definition Sema.h:1300
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
llvm::DenseMap< IdentifierInfo *, PendingPragmaInfo > PendingExportedNames
Definition Sema.h:2349
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:936
SemaObjC & ObjC()
Definition Sema.h:1509
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:2842
SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags
Diagnostics that are emitted only if we discover that the given function must be codegen'ed.
Definition Sema.h:1434
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:3190
PragmaStack< bool > StrictGuardStackCheckStack
Definition Sema.h:2064
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:3605
ASTContext & getASTContext() const
Definition Sema.h:939
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1073
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:6573
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:6657
PragmaStack< StringLiteral * > ConstSegStack
Definition Sema.h:2060
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:9324
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
Definition Sema.h:1226
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1204
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition Sema.cpp:1679
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Definition Sema.cpp:2603
void setFunctionHasIndirectGoto()
Definition Sema.cpp:2523
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition Sema.cpp:1693
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2351
FPOptions & getCurFPFeatures()
Definition Sema.h:934
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition Sema.h:8364
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:2369
void PopCompoundScope()
Definition Sema.cpp:2502
api_notes::APINotesManager APINotes
Definition Sema.h:1304
const LangOptions & getLangOpts() const
Definition Sema.h:932
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2463
SemaOpenACC & OpenACC()
Definition Sema.h:1514
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
ASTConsumer & getASTConsumer() const
Definition Sema.h:940
void * OpaqueParser
Definition Sema.h:1344
Preprocessor & PP
Definition Sema.h:1299
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:1339
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:2141
const LangOptions & LangOpts
Definition Sema.h:1298
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition Sema.h:1232
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2578
static const uint64_t MaximumAlignment
Definition Sema.h:1227
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition Sema.h:6551
SemaHLSL & HLSL()
Definition Sema.h:1474
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1230
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
Definition Sema.cpp:1185
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:1539
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:14055
void performFunctionEffectAnalysis(TranslationUnitDecl *TU)
PragmaStack< AlignPackInfo > AlignPackStack
Definition Sema.h:2049
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:6649
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2059
DeclContext * getCurLexicalContext() const
Definition Sema.h:1137
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
Definition Sema.cpp:1686
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Definition Sema.cpp:863
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
Definition Sema.h:4802
sema::FunctionScopeInfo * getCurFunction() const
Definition Sema.h:1333
void PushCompoundScope(bool IsStmtExpr)
Definition Sema.cpp:2497
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
Definition Sema.cpp:2931
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:2315
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2102
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9907
static bool isCast(CheckedConversionKind CCK)
Definition Sema.h:2563
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
Definition Sema.cpp:2533
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1437
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:6577
SemaOpenCL & OpenCL()
Definition Sema.h:1519
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8227
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1654
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:8423
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
Definition Sema.h:3619
bool MSStructPragmaOn
Definition Sema.h:1823
unsigned NonInstantiationEntries
The number of CodeSynthesisContexts that are not template instantiations and, therefore,...
Definition Sema.h:13668
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:14003
SourceManager & getSourceManager() const
Definition Sema.h:937
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:960
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:4129
@ NTCUK_Copy
Definition Sema.h:4130
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
Definition Sema.cpp:2363
PragmaStack< MSVtorDispMode > VtorDispStack
Whether to insert vtordisps prior to virtual bases in the Microsoft C++ ABI.
Definition Sema.h:2048
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2109
bool isSFINAEContext() const
Definition Sema.h:13736
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
Definition Sema.h:13692
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition Sema.cpp:2893
void emitDeferredDiags()
Definition Sema.cpp:2034
void setFunctionHasMustTail()
Definition Sema.cpp:2528
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition Sema.h:8419
void CheckCompleteVariableDeclaration(VarDecl *VD)
void setFunctionHasBranchProtectedScope()
Definition Sema.cpp:2518
RedeclarationKind forRedeclarationInCurContext() const
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
Definition Sema.cpp:1179
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition Sema.h:1575
ASTConsumer & Consumer
Definition Sema.h:1301
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
Definition Sema.h:4688
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1338
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
Definition Sema.cpp:1800
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:14051
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:6789
std::pair< SourceLocation, bool > DeleteExprLoc
Definition Sema.h:980
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
Definition Sema.cpp:2376
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:1259
void DiagnoseUnterminatedPragmaAttribute()
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
LateTemplateParserCB * LateTemplateParser
Definition Sema.h:1343
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:8430
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Definition Sema.h:3612
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:2915
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8367
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
SourceManager & SourceMgr
Definition Sema.h:1303
DiagnosticsEngine & Diags
Definition Sema.h:1302
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:593
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:933
FPOptions CurFPFeatures
Definition Sema.h:1296
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2058
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:2954
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
Definition Sema.h:6585
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:1821
llvm::BumpPtrAllocator BumpAlloc
Definition Sema.h:1245
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:6329
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:3587
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2124
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
Definition Sema.h:1357
sema::FunctionScopeInfo * getEnclosingFunction() const
Definition Sema.cpp:2548
sema::CapturedRegionScopeInfo * getCurCapturedRegion()
Retrieve the current captured region, if any.
Definition Sema.cpp:2907
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:1699
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:3510
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
Definition Sema.cpp:2509
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
SemaARM & ARM()
Definition Sema.h:1444
llvm::DenseSet< InstantiatingSpecializationsKey > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
Definition Sema.h:13640
ASTMutationListener * getASTMutationListener() const
Definition Sema.cpp:651
SFINAETrap * getSFINAEContext() const
Returns a pointer to the current SFINAE context, if any.
Definition Sema.h:13733
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:343
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:355
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3818
bool isUnion() const
Definition Decl.h:3928
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:735
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:739
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:8320
The base class of the type hierarchy.
Definition TypeBase.h:1839
bool isFloat16Type() const
Definition TypeBase.h:8961
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:8996
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
Definition Type.cpp:2617
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9246
bool isFloat128Type() const
Definition TypeBase.h:8981
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:753
bool isBitIntType() const
Definition TypeBase.h:8861
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2790
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
Definition Type.cpp:2406
bool isIbm128Type() const
Definition TypeBase.h:8985
bool isOverflowBehaviorType() const
Definition TypeBase.h:8757
bool isBFloat16Type() const
Definition TypeBase.h:8973
bool isStructureOrClassType() const
Definition Type.cpp:707
bool isRealFloatingType() const
Floating point categories.
Definition Type.cpp:2357
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
Definition Type.cpp:2638
Linkage getLinkage() const
Determine the linkage of this type.
Definition Type.cpp:4964
@ STK_FloatingComplex
Definition TypeBase.h:2772
@ STK_ObjCObjectPointer
Definition TypeBase.h:2766
@ STK_IntegralComplex
Definition TypeBase.h:2771
@ STK_MemberPointer
Definition TypeBase.h:2767
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9179
bool isNullPtrType() const
Definition TypeBase.h:8989
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition Type.cpp:5090
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:2822
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:2378
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:2357
@ 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:2710
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:4183
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
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:636
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
void inferNoReturnAttr(Sema &S, Decl *D)
@ 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
@ Template
We are parsing a template declaration.
Definition Parser.h:81
TUFragmentKind
Definition Sema.h:487
@ Private
The private module fragment, between 'module :private;' and the end of the translation unit.
Definition Sema.h:496
@ Global
The global module fragment, between 'module;' and a module-declaration.
Definition Sema.h:489
@ Normal
A normal translation unit fragment.
Definition Sema.h:493
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:581
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:150
bool isExternalFormalLinkage(Linkage L)
Definition Linkage.h:117
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
Definition TypeBase.h:4162
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
Definition TypeBase.h:4165
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5886
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition Decl.cpp:6100
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:438
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:13252
Information from a C++ pragma export, for a symbol that we haven't seen the declaration for yet.
Definition Sema.h:2344