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