clang 23.0.0git
Sema.cpp
Go to the documentation of this file.
1//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the actions class which performs semantic analysis and
10// builds an AST out of a parse stream.
11//
12//===----------------------------------------------------------------------===//
13
14#include "UsedDeclVisitor.h"
17#include "clang/AST/Decl.h"
18#include "clang/AST/DeclCXX.h"
20#include "clang/AST/DeclObjC.h"
21#include "clang/AST/Expr.h"
22#include "clang/AST/ExprCXX.h"
24#include "clang/AST/StmtCXX.h"
41#include "clang/Sema/Scope.h"
44#include "clang/Sema/SemaARM.h"
45#include "clang/Sema/SemaAVR.h"
46#include "clang/Sema/SemaBPF.h"
47#include "clang/Sema/SemaCUDA.h"
51#include "clang/Sema/SemaHLSL.h"
54#include "clang/Sema/SemaM68k.h"
55#include "clang/Sema/SemaMIPS.h"
58#include "clang/Sema/SemaObjC.h"
62#include "clang/Sema/SemaPPC.h"
66#include "clang/Sema/SemaSYCL.h"
69#include "clang/Sema/SemaWasm.h"
70#include "clang/Sema/SemaX86.h"
74#include "llvm/ADT/DenseMap.h"
75#include "llvm/ADT/STLExtras.h"
76#include "llvm/ADT/SmallPtrSet.h"
77#include "llvm/Support/TimeProfiler.h"
78#include <optional>
79
80using namespace clang;
81using namespace sema;
82
86
89 bool IncludeComments,
90 std::optional<tok::TokenKind> ExpectedToken) {
91 if (!Loc.isValid())
92 return SourceRange();
93 std::optional<Token> NextToken =
94 Lexer::findNextToken(Loc, SourceMgr, LangOpts, IncludeComments);
95 if (!NextToken)
96 return SourceRange();
97 if (ExpectedToken && NextToken->getKind() != *ExpectedToken)
98 return SourceRange();
99 SourceLocation TokenStart = NextToken->getLocation();
100 SourceLocation TokenEnd = NextToken->getLastLoc();
101 if (!TokenStart.isValid() || !TokenEnd.isValid())
102 return SourceRange();
103 if (!IncludeMacros && (TokenStart.isMacroID() || TokenEnd.isMacroID()))
104 return SourceRange();
105
106 return SourceRange(TokenStart, TokenEnd);
107}
108
109ModuleLoader &Sema::getModuleLoader() const { return PP.getModuleLoader(); }
110
113 StringRef Platform) {
115 if (!SDKInfo && !WarnedDarwinSDKInfoMissing) {
116 Diag(Loc, diag::warn_missing_sdksettings_for_availability_checking)
117 << Platform;
118 WarnedDarwinSDKInfoMissing = true;
119 }
120 return SDKInfo;
121}
122
124 if (CachedDarwinSDKInfo)
125 return CachedDarwinSDKInfo->get();
126 auto SDKInfo = parseDarwinSDKInfo(
127 PP.getFileManager().getVirtualFileSystem(),
128 PP.getHeaderSearchInfo().getHeaderSearchOpts().Sysroot);
129 if (SDKInfo && *SDKInfo) {
130 CachedDarwinSDKInfo = std::make_unique<DarwinSDKInfo>(std::move(**SDKInfo));
131 return CachedDarwinSDKInfo->get();
132 }
133 if (!SDKInfo)
134 llvm::consumeError(SDKInfo.takeError());
135 CachedDarwinSDKInfo = std::unique_ptr<DarwinSDKInfo>();
136 return nullptr;
137}
138
140 const IdentifierInfo *ParamName, unsigned int Index) {
141 std::string InventedName;
142 llvm::raw_string_ostream OS(InventedName);
143
144 if (!ParamName)
145 OS << "auto:" << Index + 1;
146 else
147 OS << ParamName->getName() << ":auto";
148
149 return &Context.Idents.get(OS.str());
150}
151
153 const Preprocessor &PP) {
154 PrintingPolicy Policy = Context.getPrintingPolicy();
155 // In diagnostics, we print _Bool as bool if the latter is defined as the
156 // former.
157 Policy.Bool = Context.getLangOpts().Bool;
158 if (!Policy.Bool) {
159 if (const MacroInfo *BoolMacro = PP.getMacroInfo(Context.getBoolName())) {
160 Policy.Bool = BoolMacro->isObjectLike() &&
161 BoolMacro->getNumTokens() == 1 &&
162 BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
163 }
164 }
165
166 // Shorten the data output if needed
167 Policy.EntireContentsOfLargeArray = false;
168
169 return Policy;
170}
171
173 TUScope = S;
174 PushDeclContext(S, Context.getTranslationUnitDecl());
175}
176
177namespace clang {
178namespace sema {
179
181 Sema *S = nullptr;
184
185public:
186 void set(Sema &S) { this->S = &S; }
187
188 void reset() { S = nullptr; }
189
192 FileID PrevFID) override {
193 if (!S)
194 return;
195 switch (Reason) {
196 case EnterFile: {
197 SourceManager &SM = S->getSourceManager();
198 SourceLocation IncludeLoc = SM.getIncludeLoc(SM.getFileID(Loc));
199 if (IncludeLoc.isValid()) {
200 if (llvm::timeTraceProfilerEnabled()) {
201 OptionalFileEntryRef FE = SM.getFileEntryRefForID(SM.getFileID(Loc));
202 ProfilerStack.push_back(llvm::timeTraceAsyncProfilerBegin(
203 "Source", FE ? FE->getName() : StringRef("<unknown>")));
204 }
205
206 IncludeStack.push_back(IncludeLoc);
207 S->DiagnoseNonDefaultPragmaAlignPack(
209 IncludeLoc);
210 }
211 break;
212 }
213 case ExitFile:
214 if (!IncludeStack.empty()) {
215 if (llvm::timeTraceProfilerEnabled())
216 llvm::timeTraceProfilerEnd(ProfilerStack.pop_back_val());
217
218 S->DiagnoseNonDefaultPragmaAlignPack(
220 IncludeStack.pop_back_val());
221 }
222 break;
223 default:
224 break;
225 }
226 }
227 void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace,
228 diag::Severity Mapping, StringRef Str) override {
229 // If one of the analysis-based diagnostics was enabled while processing
230 // a function, we want to note it in the analysis-based warnings so they
231 // can be run at the end of the function body even if the analysis warnings
232 // are disabled at that point.
234 diag::Flavor Flavor =
236 StringRef Group = Str.substr(2);
237
238 if (S->PP.getDiagnostics().getDiagnosticIDs()->getDiagnosticsInGroup(
239 Flavor, Group, GroupDiags))
240 return;
241
242 for (diag::kind K : GroupDiags) {
243 // Note: the cases in this switch should be kept in sync with the
244 // diagnostics in AnalysisBasedWarnings::getPolicyInEffectAt().
246 S->AnalysisWarnings.getPolicyOverrides();
247 switch (K) {
248 default: break;
249 case diag::warn_unreachable:
250 case diag::warn_unreachable_break:
251 case diag::warn_unreachable_return:
252 case diag::warn_unreachable_loop_increment:
253 Override.enableCheckUnreachable = true;
254 break;
255 case diag::warn_double_lock:
256 Override.enableThreadSafetyAnalysis = true;
257 break;
258 case diag::warn_use_in_invalid_state:
259 Override.enableConsumedAnalysis = true;
260 break;
261 }
262 }
263 }
264};
265
266} // end namespace sema
267} // end namespace clang
268
269const unsigned Sema::MaxAlignmentExponent;
271
276 Context(ctxt), Consumer(consumer), Diags(PP.getDiagnostics()),
280 ExternalSource(nullptr), StackHandler(Diags), CurScope(nullptr),
281 Ident_super(nullptr), AMDGPUPtr(std::make_unique<SemaAMDGPU>(*this)),
282 ARMPtr(std::make_unique<SemaARM>(*this)),
283 AVRPtr(std::make_unique<SemaAVR>(*this)),
284 BPFPtr(std::make_unique<SemaBPF>(*this)),
285 CodeCompletionPtr(
286 std::make_unique<SemaCodeCompletion>(*this, CodeCompleter)),
287 CUDAPtr(std::make_unique<SemaCUDA>(*this)),
288 DirectXPtr(std::make_unique<SemaDirectX>(*this)),
289 HLSLPtr(std::make_unique<SemaHLSL>(*this)),
290 HexagonPtr(std::make_unique<SemaHexagon>(*this)),
291 LoongArchPtr(std::make_unique<SemaLoongArch>(*this)),
292 M68kPtr(std::make_unique<SemaM68k>(*this)),
293 MIPSPtr(std::make_unique<SemaMIPS>(*this)),
294 MSP430Ptr(std::make_unique<SemaMSP430>(*this)),
295 NVPTXPtr(std::make_unique<SemaNVPTX>(*this)),
296 ObjCPtr(std::make_unique<SemaObjC>(*this)),
297 OpenACCPtr(std::make_unique<SemaOpenACC>(*this)),
298 OpenCLPtr(std::make_unique<SemaOpenCL>(*this)),
299 OpenMPPtr(std::make_unique<SemaOpenMP>(*this)),
300 PPCPtr(std::make_unique<SemaPPC>(*this)),
301 PseudoObjectPtr(std::make_unique<SemaPseudoObject>(*this)),
302 RISCVPtr(std::make_unique<SemaRISCV>(*this)),
303 SPIRVPtr(std::make_unique<SemaSPIRV>(*this)),
304 SYCLPtr(std::make_unique<SemaSYCL>(*this)),
305 SwiftPtr(std::make_unique<SemaSwift>(*this)),
306 SystemZPtr(std::make_unique<SemaSystemZ>(*this)),
307 WasmPtr(std::make_unique<SemaWasm>(*this)),
308 X86Ptr(std::make_unique<SemaX86>(*this)),
310 LangOpts.getMSPointerToMemberRepresentationMethod()),
311 MSStructPragmaOn(false), VtorDispStack(LangOpts.getVtorDispMode()),
320 FullyCheckedComparisonCategories(
321 static_cast<unsigned>(ComparisonCategoryType::Last) + 1),
326 ArgPackSubstIndex(std::nullopt), SatisfactionCache(Context) {
327 assert(pp.TUKind == TUKind);
328 TUScope = nullptr;
329
330 LoadedExternalKnownNamespaces = false;
331 for (unsigned I = 0; I != NSAPI::NumNSNumberLiteralMethods; ++I)
332 ObjC().NSNumberLiteralMethods[I] = nullptr;
333
334 if (getLangOpts().ObjC)
335 ObjC().NSAPIObj.reset(new NSAPI(Context));
336
339
340 // Tell diagnostics how to render things from the AST library.
341 Diags.SetArgToStringFn(&FormatASTNodeDiagnosticArgument, &Context);
342
343 // This evaluation context exists to ensure that there's always at least one
344 // valid evaluation context available. It is never removed from the
345 // evaluation stack.
346 ExprEvalContexts.emplace_back(
349
350 // Initialization of data sharing attributes stack for OpenMP
351 OpenMP().InitDataSharingAttributesStack();
352
353 std::unique_ptr<sema::SemaPPCallbacks> Callbacks =
354 std::make_unique<sema::SemaPPCallbacks>();
355 SemaPPCallbackHandler = Callbacks.get();
356 PP.addPPCallbacks(std::move(Callbacks));
357 SemaPPCallbackHandler->set(*this);
358
359 CurFPFeatures.setFPEvalMethod(PP.getCurrentFPEvalMethod());
360}
361
362// Anchor Sema's type info to this TU.
363void Sema::anchor() {}
364
365void Sema::addImplicitTypedef(StringRef Name, QualType T) {
366 DeclarationName DN = &Context.Idents.get(Name);
367 if (IdResolver.begin(DN) == IdResolver.end())
368 PushOnScopeChains(Context.buildImplicitTypedef(T, Name), TUScope);
369}
370
372 // Create BuiltinVaListDecl *before* ExternalSemaSource::InitializeSema(this)
373 // because during initialization ASTReader can emit globals that require
374 // name mangling. And the name mangling uses BuiltinVaListDecl.
375 if (Context.getTargetInfo().hasBuiltinMSVaList())
376 (void)Context.getBuiltinMSVaListDecl();
377 (void)Context.getBuiltinVaListDecl();
378
379 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
380 SC->InitializeSema(*this);
381
382 // Tell the external Sema source about this Sema object.
383 if (ExternalSemaSource *ExternalSema
384 = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
385 ExternalSema->InitializeSema(*this);
386
387 // This needs to happen after ExternalSemaSource::InitializeSema(this) or we
388 // will not be able to merge any duplicate __va_list_tag decls correctly.
389 VAListTagName = PP.getIdentifierInfo("__va_list_tag");
390
391 if (!TUScope)
392 return;
393
394 // Initialize predefined 128-bit integer types, if needed.
395 if (Context.getTargetInfo().hasInt128Type() ||
396 (Context.getAuxTargetInfo() &&
397 Context.getAuxTargetInfo()->hasInt128Type())) {
398 // If either of the 128-bit integer types are unavailable to name lookup,
399 // define them now.
400 DeclarationName Int128 = &Context.Idents.get("__int128_t");
401 if (IdResolver.begin(Int128) == IdResolver.end())
402 PushOnScopeChains(Context.getInt128Decl(), TUScope);
403
404 DeclarationName UInt128 = &Context.Idents.get("__uint128_t");
405 if (IdResolver.begin(UInt128) == IdResolver.end())
406 PushOnScopeChains(Context.getUInt128Decl(), TUScope);
407 }
408
409
410 // Initialize predefined Objective-C types:
411 if (getLangOpts().ObjC) {
412 // If 'SEL' does not yet refer to any declarations, make it refer to the
413 // predefined 'SEL'.
414 DeclarationName SEL = &Context.Idents.get("SEL");
415 if (IdResolver.begin(SEL) == IdResolver.end())
416 PushOnScopeChains(Context.getObjCSelDecl(), TUScope);
417
418 // If 'id' does not yet refer to any declarations, make it refer to the
419 // predefined 'id'.
420 DeclarationName Id = &Context.Idents.get("id");
421 if (IdResolver.begin(Id) == IdResolver.end())
422 PushOnScopeChains(Context.getObjCIdDecl(), TUScope);
423
424 // Create the built-in typedef for 'Class'.
425 DeclarationName Class = &Context.Idents.get("Class");
426 if (IdResolver.begin(Class) == IdResolver.end())
427 PushOnScopeChains(Context.getObjCClassDecl(), TUScope);
428
429 // Create the built-in forward declaratino for 'Protocol'.
430 DeclarationName Protocol = &Context.Idents.get("Protocol");
431 if (IdResolver.begin(Protocol) == IdResolver.end())
432 PushOnScopeChains(Context.getObjCProtocolDecl(), TUScope);
433 }
434
435 // Create the internal type for the *StringMakeConstantString builtins.
436 DeclarationName ConstantString = &Context.Idents.get("__NSConstantString");
437 if (IdResolver.begin(ConstantString) == IdResolver.end())
438 PushOnScopeChains(Context.getCFConstantStringDecl(), TUScope);
439
440 // Initialize Microsoft "predefined C++ types".
441 if (getLangOpts().MSVCCompat) {
442 if (getLangOpts().CPlusPlus &&
443 IdResolver.begin(&Context.Idents.get("type_info")) == IdResolver.end())
444 PushOnScopeChains(Context.getMSTypeInfoTagDecl(), TUScope);
445
446 addImplicitTypedef("size_t", Context.getSizeType());
447 }
448
449 // Initialize predefined OpenCL types and supported extensions and (optional)
450 // core features.
451 if (getLangOpts().OpenCL) {
453 Context.getTargetInfo().getSupportedOpenCLOpts(), getLangOpts());
454 addImplicitTypedef("sampler_t", Context.OCLSamplerTy);
455 addImplicitTypedef("event_t", Context.OCLEventTy);
456 auto OCLCompatibleVersion = getLangOpts().getOpenCLCompatibleVersion();
457 if (OCLCompatibleVersion >= 200) {
458 if (getLangOpts().OpenCLCPlusPlus || getLangOpts().Blocks) {
459 addImplicitTypedef("clk_event_t", Context.OCLClkEventTy);
460 addImplicitTypedef("queue_t", Context.OCLQueueTy);
461 }
462 if (getLangOpts().OpenCLPipes)
463 addImplicitTypedef("reserve_id_t", Context.OCLReserveIDTy);
464 addImplicitTypedef("atomic_int", Context.getAtomicType(Context.IntTy));
465 addImplicitTypedef("atomic_uint",
466 Context.getAtomicType(Context.UnsignedIntTy));
467 addImplicitTypedef("atomic_float",
468 Context.getAtomicType(Context.FloatTy));
469 // OpenCLC v2.0, s6.13.11.6 requires that atomic_flag is implemented as
470 // 32-bit integer and OpenCLC v2.0, s6.1.1 int is always 32-bit wide.
471 addImplicitTypedef("atomic_flag", Context.getAtomicType(Context.IntTy));
472
473
474 // OpenCL v2.0 s6.13.11.6:
475 // - The atomic_long and atomic_ulong types are supported if the
476 // cl_khr_int64_base_atomics and cl_khr_int64_extended_atomics
477 // extensions are supported.
478 // - The atomic_double type is only supported if double precision
479 // is supported and the cl_khr_int64_base_atomics and
480 // cl_khr_int64_extended_atomics extensions are supported.
481 // - If the device address space is 64-bits, the data types
482 // atomic_intptr_t, atomic_uintptr_t, atomic_size_t and
483 // atomic_ptrdiff_t are supported if the cl_khr_int64_base_atomics and
484 // cl_khr_int64_extended_atomics extensions are supported.
485
486 auto AddPointerSizeDependentTypes = [&]() {
487 auto AtomicSizeT = Context.getAtomicType(Context.getSizeType());
488 auto AtomicIntPtrT = Context.getAtomicType(Context.getIntPtrType());
489 auto AtomicUIntPtrT = Context.getAtomicType(Context.getUIntPtrType());
490 auto AtomicPtrDiffT =
491 Context.getAtomicType(Context.getPointerDiffType());
492 addImplicitTypedef("atomic_size_t", AtomicSizeT);
493 addImplicitTypedef("atomic_intptr_t", AtomicIntPtrT);
494 addImplicitTypedef("atomic_uintptr_t", AtomicUIntPtrT);
495 addImplicitTypedef("atomic_ptrdiff_t", AtomicPtrDiffT);
496 };
497
498 if (Context.getTypeSize(Context.getSizeType()) == 32) {
499 AddPointerSizeDependentTypes();
500 }
501
502 if (getOpenCLOptions().isSupported("cl_khr_fp16", getLangOpts())) {
503 auto AtomicHalfT = Context.getAtomicType(Context.HalfTy);
504 addImplicitTypedef("atomic_half", AtomicHalfT);
505 }
506
507 std::vector<QualType> Atomic64BitTypes;
508 if (getOpenCLOptions().isSupported("cl_khr_int64_base_atomics",
509 getLangOpts()) &&
510 getOpenCLOptions().isSupported("cl_khr_int64_extended_atomics",
511 getLangOpts())) {
512 if (getOpenCLOptions().isSupported("cl_khr_fp64", getLangOpts())) {
513 auto AtomicDoubleT = Context.getAtomicType(Context.DoubleTy);
514 addImplicitTypedef("atomic_double", AtomicDoubleT);
515 Atomic64BitTypes.push_back(AtomicDoubleT);
516 }
517 auto AtomicLongT = Context.getAtomicType(Context.LongTy);
518 auto AtomicULongT = Context.getAtomicType(Context.UnsignedLongTy);
519 addImplicitTypedef("atomic_long", AtomicLongT);
520 addImplicitTypedef("atomic_ulong", AtomicULongT);
521
522
523 if (Context.getTypeSize(Context.getSizeType()) == 64) {
524 AddPointerSizeDependentTypes();
525 }
526 }
527 }
528
529#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
530 if (getOpenCLOptions().isSupported(#Ext, getLangOpts())) { \
531 addImplicitTypedef(#ExtType, Context.Id##Ty); \
532 }
533#include "clang/Basic/OpenCLExtensionTypes.def"
534 }
535
536 if (Context.getTargetInfo().hasAArch64ACLETypes() ||
537 (Context.getAuxTargetInfo() &&
538 Context.getAuxTargetInfo()->hasAArch64ACLETypes())) {
539#define SVE_TYPE(Name, Id, SingletonId) \
540 addImplicitTypedef(#Name, Context.SingletonId);
541#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
542 addImplicitTypedef( \
543 #Name, Context.getVectorType(Context.BaseType, NumEls, VectorKind));
544#include "clang/Basic/AArch64ACLETypes.def"
545 }
546
547 if (Context.getTargetInfo().getTriple().isPPC64()) {
548#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
549 addImplicitTypedef(#Name, Context.Id##Ty);
550#include "clang/Basic/PPCTypes.def"
551#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
552 addImplicitTypedef(#Name, Context.Id##Ty);
553#include "clang/Basic/PPCTypes.def"
554 }
555
556 if (Context.getTargetInfo().hasRISCVVTypes()) {
557#define RVV_TYPE(Name, Id, SingletonId) \
558 addImplicitTypedef(Name, Context.SingletonId);
559#include "clang/Basic/RISCVVTypes.def"
560 }
561
562 if (Context.getTargetInfo().getTriple().isWasm() &&
563 Context.getTargetInfo().hasFeature("reference-types")) {
564#define WASM_TYPE(Name, Id, SingletonId) \
565 addImplicitTypedef(Name, Context.SingletonId);
566#include "clang/Basic/WebAssemblyReferenceTypes.def"
567 }
568
569 if (Context.getTargetInfo().getTriple().isAMDGPU() ||
570 (Context.getAuxTargetInfo() &&
571 Context.getAuxTargetInfo()->getTriple().isAMDGPU())) {
572#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
573 addImplicitTypedef(Name, Context.SingletonId);
574#include "clang/Basic/AMDGPUTypes.def"
575 }
576
577 if (Context.getTargetInfo().hasBuiltinMSVaList()) {
578 DeclarationName MSVaList = &Context.Idents.get("__builtin_ms_va_list");
579 if (IdResolver.begin(MSVaList) == IdResolver.end())
580 PushOnScopeChains(Context.getBuiltinMSVaListDecl(), TUScope);
581 }
582
583 DeclarationName BuiltinVaList = &Context.Idents.get("__builtin_va_list");
584 if (IdResolver.begin(BuiltinVaList) == IdResolver.end())
585 PushOnScopeChains(Context.getBuiltinVaListDecl(), TUScope);
586}
587
589 assert(InstantiatingSpecializations.empty() &&
590 "failed to clean up an InstantiatingTemplate?");
591
593
594 // Kill all the active scopes.
596 delete FSI;
597
598 // Tell the SemaConsumer to forget about us; we're going out of scope.
599 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
600 SC->ForgetSema();
601
602 // Detach from the external Sema source.
603 if (ExternalSemaSource *ExternalSema
604 = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
605 ExternalSema->ForgetSema();
606
607 // Delete cached satisfactions.
608 std::vector<ConstraintSatisfaction *> Satisfactions;
609 Satisfactions.reserve(SatisfactionCache.size());
610 for (auto &Node : SatisfactionCache)
611 Satisfactions.push_back(&Node);
612 for (auto *Node : Satisfactions)
613 delete Node;
614
616
617 // Destroys data sharing attributes stack for OpenMP
618 OpenMP().DestroyDataSharingAttributesStack();
619
620 // Detach from the PP callback handler which outlives Sema since it's owned
621 // by the preprocessor.
622 SemaPPCallbackHandler->reset();
623}
624
626 llvm::function_ref<void()> Fn) {
627 StackHandler.runWithSufficientStackSpace(Loc, Fn);
628}
629
631 UnavailableAttr::ImplicitReason reason) {
632 // If we're not in a function, it's an error.
633 FunctionDecl *fn = dyn_cast<FunctionDecl>(CurContext);
634 if (!fn) return false;
635
636 // If we're in template instantiation, it's an error.
638 return false;
639
640 // If that function's not in a system header, it's an error.
641 if (!Context.getSourceManager().isInSystemHeader(loc))
642 return false;
643
644 // If the function is already unavailable, it's not an error.
645 if (fn->hasAttr<UnavailableAttr>()) return true;
646
647 fn->addAttr(UnavailableAttr::CreateImplicit(Context, "", reason, loc));
648 return true;
649}
650
654
656 assert(E && "Cannot use with NULL ptr");
657
658 if (!ExternalSource) {
659 ExternalSource = std::move(E);
660 return;
661 }
662
663 if (auto *Ex = dyn_cast<MultiplexExternalSemaSource>(ExternalSource.get()))
664 Ex->AddSource(std::move(E));
665 else
666 ExternalSource = llvm::makeIntrusiveRefCnt<MultiplexExternalSemaSource>(
667 ExternalSource, std::move(E));
668}
669
670void Sema::PrintStats() const {
671 llvm::errs() << "\n*** Semantic Analysis Stats:\n";
672 if (SFINAETrap *Trap = getSFINAEContext())
673 llvm::errs() << int(Trap->hasErrorOccurred())
674 << " SFINAE diagnostics trapped.\n";
675
676 BumpAlloc.PrintStats();
677 AnalysisWarnings.PrintStats();
678}
679
681 QualType SrcType,
682 SourceLocation Loc) {
683 std::optional<NullabilityKind> ExprNullability = SrcType->getNullability();
684 if (!ExprNullability || (*ExprNullability != NullabilityKind::Nullable &&
685 *ExprNullability != NullabilityKind::NullableResult))
686 return;
687
688 std::optional<NullabilityKind> TypeNullability = DstType->getNullability();
689 if (!TypeNullability || *TypeNullability != NullabilityKind::NonNull)
690 return;
691
692 Diag(Loc, diag::warn_nullability_lost) << SrcType << DstType;
693}
694
695// Generate diagnostics when adding or removing effects in a type conversion.
697 SourceLocation Loc) {
698 const auto SrcFX = FunctionEffectsRef::get(SrcType);
699 const auto DstFX = FunctionEffectsRef::get(DstType);
700 if (SrcFX != DstFX) {
701 for (const auto &Diff : FunctionEffectDiffVector(SrcFX, DstFX)) {
702 if (Diff.shouldDiagnoseConversion(SrcType, SrcFX, DstType, DstFX))
703 Diag(Loc, diag::warn_invalid_add_func_effects) << Diff.effectName();
704 }
705 }
706}
707
709 // nullptr only exists from C++11 on, so don't warn on its absence earlier.
711 return;
712
713 if (Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
714 return;
715
716 const Expr *EStripped = E->IgnoreParenImpCasts();
717 if (EStripped->getType()->isNullPtrType())
718 return;
719 if (isa<GNUNullExpr>(EStripped))
720 return;
721
722 if (Diags.isIgnored(diag::warn_zero_as_null_pointer_constant,
723 E->getBeginLoc()))
724 return;
725
726 // Don't diagnose the conversion from a 0 literal to a null pointer argument
727 // in a synthesized call to operator<=>.
728 if (!CodeSynthesisContexts.empty() &&
729 CodeSynthesisContexts.back().Kind ==
731 return;
732
733 // Ignore null pointers in defaulted comparison operators.
735 if (FD && FD->isDefaulted()) {
736 return;
737 }
738
739 // If it is a macro from system header, and if the macro name is not "NULL",
740 // do not warn.
741 // Note that uses of "NULL" will be ignored above on systems that define it
742 // as __null.
743 SourceLocation MaybeMacroLoc = E->getBeginLoc();
744 if (Diags.getSuppressSystemWarnings() &&
745 SourceMgr.isInSystemMacro(MaybeMacroLoc) &&
746 !findMacroSpelling(MaybeMacroLoc, "NULL"))
747 return;
748
749 Diag(E->getBeginLoc(), diag::warn_zero_as_null_pointer_constant)
751}
752
753/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
754/// If there is already an implicit cast, merge into the existing one.
755/// The result is of the given category.
758 const CXXCastPath *BasePath,
760#ifndef NDEBUG
761 if (VK == VK_PRValue && !E->isPRValue()) {
762 switch (Kind) {
763 default:
764 llvm_unreachable(
765 ("can't implicitly cast glvalue to prvalue with this cast "
766 "kind: " +
767 std::string(CastExpr::getCastKindName(Kind)))
768 .c_str());
769 case CK_Dependent:
770 case CK_LValueToRValue:
771 case CK_ArrayToPointerDecay:
772 case CK_FunctionToPointerDecay:
773 case CK_ToVoid:
774 case CK_NonAtomicToAtomic:
775 case CK_HLSLArrayRValue:
776 case CK_HLSLAggregateSplatCast:
777 break;
778 }
779 }
780 assert((VK == VK_PRValue || Kind == CK_Dependent || !E->isPRValue()) &&
781 "can't cast prvalue to glvalue");
782#endif
783
786 if (Context.hasAnyFunctionEffects() && !isCast(CCK) &&
787 Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
789
790 QualType ExprTy = Context.getCanonicalType(E->getType());
791 QualType TypeTy = Context.getCanonicalType(Ty);
792
793 // This cast is used in place of a regular LValue to RValue cast for
794 // HLSL Array Parameter Types. It needs to be emitted even if
795 // ExprTy == TypeTy, except if E is an HLSLOutArgExpr
796 // Emitting a cast in that case will prevent HLSLOutArgExpr from
797 // being handled properly in EmitCallArg
798 if (Kind == CK_HLSLArrayRValue && !isa<HLSLOutArgExpr>(E))
799 return ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK,
801
802 if (ExprTy == TypeTy)
803 return E;
804
805 if (Kind == CK_ArrayToPointerDecay) {
806 // C++1z [conv.array]: The temporary materialization conversion is applied.
807 // We also use this to fuel C++ DR1213, which applies to C++11 onwards.
808 if (getLangOpts().CPlusPlus && E->isPRValue()) {
809 // The temporary is an lvalue in C++98 and an xvalue otherwise.
811 E->getType(), E, !getLangOpts().CPlusPlus11);
812 if (Materialized.isInvalid())
813 return ExprError();
814 E = Materialized.get();
815 }
816 // C17 6.7.1p6 footnote 124: The implementation can treat any register
817 // declaration simply as an auto declaration. However, whether or not
818 // addressable storage is actually used, the address of any part of an
819 // object declared with storage-class specifier register cannot be
820 // computed, either explicitly(by use of the unary & operator as discussed
821 // in 6.5.3.2) or implicitly(by converting an array name to a pointer as
822 // discussed in 6.3.2.1).Thus, the only operator that can be applied to an
823 // array declared with storage-class specifier register is sizeof.
824 if (VK == VK_PRValue && !getLangOpts().CPlusPlus && !E->isPRValue()) {
825 if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
826 if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
827 if (VD->getStorageClass() == SC_Register) {
828 Diag(E->getExprLoc(), diag::err_typecheck_address_of)
829 << /*register variable*/ 3 << E->getSourceRange();
830 return ExprError();
831 }
832 }
833 }
834 }
835 }
836
837 if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {
838 if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
839 ImpCast->setType(Ty);
840 ImpCast->setValueKind(VK);
841 return E;
842 }
843 }
844
845 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 // Visit all pending #pragma export.
1499 for (const PendingPragmaInfo &Exported : PendingExportedNames.values()) {
1500 if (!Exported.Used)
1501 Diag(Exported.NameLoc, diag::warn_failed_to_resolve_pragma) << "export";
1502 }
1503
1504 if (LangOpts.HLSL)
1505 HLSL().ActOnEndOfTranslationUnit(getASTContext().getTranslationUnitDecl());
1506 if (LangOpts.OpenACC)
1508 getASTContext().getTranslationUnitDecl());
1509
1510 // If there were errors, disable 'unused' warnings since they will mostly be
1511 // noise. Don't warn for a use from a module: either we should warn on all
1512 // file-scope declarations in modules or not at all, but whether the
1513 // declaration is used is immaterial.
1514 if (!Diags.hasErrorOccurred() && TUKind != TU_ClangModule) {
1515 // Output warning for unused file scoped decls.
1516 for (UnusedFileScopedDeclsType::iterator
1517 I = UnusedFileScopedDecls.begin(ExternalSource.get()),
1518 E = UnusedFileScopedDecls.end();
1519 I != E; ++I) {
1520 if (ShouldRemoveFromUnused(this, *I))
1521 continue;
1522
1523 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
1524 const FunctionDecl *DiagD;
1525 if (!FD->hasBody(DiagD))
1526 DiagD = FD;
1527 if (DiagD->isDeleted())
1528 continue; // Deleted functions are supposed to be unused.
1529 SourceRange DiagRange = DiagD->getLocation();
1530 if (const ASTTemplateArgumentListInfo *ASTTAL =
1532 DiagRange.setEnd(ASTTAL->RAngleLoc);
1533 if (DiagD->isReferenced()) {
1534 if (isa<CXXMethodDecl>(DiagD))
1535 Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)
1536 << DiagD << DiagRange;
1537 else {
1538 if (FD->getStorageClass() == SC_Static &&
1539 !FD->isInlineSpecified() &&
1540 !SourceMgr.isInMainFile(
1541 SourceMgr.getExpansionLoc(FD->getLocation())))
1542 Diag(DiagD->getLocation(),
1543 diag::warn_unneeded_static_internal_decl)
1544 << DiagD << DiagRange;
1545 else
1546 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
1547 << /*function=*/0 << DiagD << DiagRange;
1548 }
1549 } else if (!FD->isTargetMultiVersion() ||
1550 FD->isTargetMultiVersionDefault()) {
1551 if (FD->getDescribedFunctionTemplate())
1552 Diag(DiagD->getLocation(), diag::warn_unused_template)
1553 << /*function=*/0 << DiagD << DiagRange;
1554 else
1555 Diag(DiagD->getLocation(), isa<CXXMethodDecl>(DiagD)
1556 ? diag::warn_unused_member_function
1557 : diag::warn_unused_function)
1558 << DiagD << DiagRange;
1559 }
1560 } else {
1561 const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition();
1562 if (!DiagD)
1563 DiagD = cast<VarDecl>(*I);
1564 SourceRange DiagRange = DiagD->getLocation();
1565 if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(DiagD)) {
1566 if (const ASTTemplateArgumentListInfo *ASTTAL =
1567 VTSD->getTemplateArgsAsWritten())
1568 DiagRange.setEnd(ASTTAL->RAngleLoc);
1569 }
1570 if (DiagD->isReferenced()) {
1571 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
1572 << /*variable=*/1 << DiagD << DiagRange;
1573 } else if (DiagD->getDescribedVarTemplate()) {
1574 Diag(DiagD->getLocation(), diag::warn_unused_template)
1575 << /*variable=*/1 << DiagD << DiagRange;
1576 } else if (DiagD->getType().isConstQualified()) {
1577 const SourceManager &SM = SourceMgr;
1578 if (SM.getMainFileID() != SM.getFileID(DiagD->getLocation()) ||
1579 !PP.getLangOpts().IsHeaderFile)
1580 Diag(DiagD->getLocation(), diag::warn_unused_const_variable)
1581 << DiagD << DiagRange;
1582 } else {
1583 Diag(DiagD->getLocation(), diag::warn_unused_variable)
1584 << DiagD << DiagRange;
1585 }
1586 }
1587 }
1588
1590 }
1591
1592 if (!Diags.isIgnored(diag::warn_unused_private_field, SourceLocation())) {
1593 // FIXME: Load additional unused private field candidates from the external
1594 // source.
1595 RecordCompleteMap RecordsComplete;
1596 RecordCompleteMap MNCComplete;
1597 for (const NamedDecl *D : UnusedPrivateFields) {
1598 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());
1599 if (RD && !RD->isUnion() &&
1600 IsRecordFullyDefined(RD, RecordsComplete, MNCComplete)) {
1601 Diag(D->getLocation(), diag::warn_unused_private_field)
1602 << D->getDeclName();
1603 }
1604 }
1605 }
1606
1607 if (!Diags.isIgnored(diag::warn_mismatched_delete_new, SourceLocation())) {
1608 if (ExternalSource)
1609 ExternalSource->ReadMismatchingDeleteExpressions(DeleteExprs);
1610 for (const auto &DeletedFieldInfo : DeleteExprs) {
1611 for (const auto &DeleteExprLoc : DeletedFieldInfo.second) {
1612 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first, DeleteExprLoc.first,
1613 DeleteExprLoc.second);
1614 }
1615 }
1616 }
1617
1618 AnalysisWarnings.IssueWarnings(Context.getTranslationUnitDecl());
1619
1620 if (Context.hasAnyFunctionEffects())
1621 performFunctionEffectAnalysis(Context.getTranslationUnitDecl());
1622
1623 // Check we've noticed that we're no longer parsing the initializer for every
1624 // variable. If we miss cases, then at best we have a performance issue and
1625 // at worst a rejects-valid bug.
1626 assert(ParsingInitForAutoVars.empty() &&
1627 "Didn't unmark var as having its initializer parsed");
1628
1629 if (!PP.isIncrementalProcessingEnabled())
1630 TUScope = nullptr;
1631
1632 checkExposure(Context.getTranslationUnitDecl());
1633}
1634
1635
1636//===----------------------------------------------------------------------===//
1637// Helper functions.
1638//===----------------------------------------------------------------------===//
1639
1641 DeclContext *DC = CurContext;
1642
1643 while (true) {
1644 if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC) ||
1646 DC = DC->getParent();
1647 } else if (!AllowLambda && isa<CXXMethodDecl>(DC) &&
1648 cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
1649 cast<CXXRecordDecl>(DC->getParent())->isLambda()) {
1650 DC = DC->getParent()->getParent();
1651 } else break;
1652 }
1653
1654 return DC;
1655}
1656
1657/// getCurFunctionDecl - If inside of a function body, this returns a pointer
1658/// to the function decl for the function being parsed. If we're currently
1659/// in a 'block', this returns the containing context.
1660FunctionDecl *Sema::getCurFunctionDecl(bool AllowLambda) const {
1661 DeclContext *DC = getFunctionLevelDeclContext(AllowLambda);
1662 return dyn_cast<FunctionDecl>(DC);
1663}
1664
1667 while (isa<RecordDecl>(DC))
1668 DC = DC->getParent();
1669 return dyn_cast<ObjCMethodDecl>(DC);
1670}
1671
1675 return cast<NamedDecl>(DC);
1676 return nullptr;
1677}
1678
1684
1685void Sema::EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB) {
1686 // FIXME: It doesn't make sense to me that DiagID is an incoming argument here
1687 // and yet we also use the current diag ID on the DiagnosticsEngine. This has
1688 // been made more painfully obvious by the refactor that introduced this
1689 // function, but it is possible that the incoming argument can be
1690 // eliminated. If it truly cannot be (for example, there is some reentrancy
1691 // issue I am not seeing yet), then there should at least be a clarifying
1692 // comment somewhere.
1693 Diagnostic DiagInfo(&Diags, DB);
1694 if (SFINAETrap *Trap = getSFINAEContext()) {
1695 sema::TemplateDeductionInfo *Info = Trap->getDeductionInfo();
1698 // We'll report the diagnostic below.
1699 break;
1700
1702 // Count this failure so that we know that template argument deduction
1703 // has failed.
1704 Trap->setErrorOccurred();
1705
1706 // Make a copy of this suppressed diagnostic and store it with the
1707 // template-deduction information.
1708 if (Info && !Info->hasSFINAEDiagnostic())
1709 Info->addSFINAEDiagnostic(
1710 DiagInfo.getLocation(),
1711 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1712
1713 Diags.setLastDiagnosticIgnored(true);
1714 return;
1715
1717 // Per C++ Core Issue 1170, access control is part of SFINAE.
1718 // Additionally, the WithAccessChecking flag can be used to temporarily
1719 // make access control a part of SFINAE for the purposes of checking
1720 // type traits.
1721 if (!Trap->withAccessChecking() && !getLangOpts().CPlusPlus11)
1722 break;
1723
1724 SourceLocation Loc = DiagInfo.getLocation();
1725
1726 // Suppress this diagnostic.
1727 Trap->setErrorOccurred();
1728
1729 // Make a copy of this suppressed diagnostic and store it with the
1730 // template-deduction information.
1731 if (Info && !Info->hasSFINAEDiagnostic())
1732 Info->addSFINAEDiagnostic(
1733 DiagInfo.getLocation(),
1734 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1735
1736 Diags.setLastDiagnosticIgnored(true);
1737
1738 // Now produce a C++98 compatibility warning.
1739 Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
1740
1741 // The last diagnostic which Sema produced was ignored. Suppress any
1742 // notes attached to it.
1743 Diags.setLastDiagnosticIgnored(true);
1744 return;
1745 }
1746
1748 if (DiagnosticsEngine::Level Level = getDiagnostics().getDiagnosticLevel(
1749 DiagInfo.getID(), DiagInfo.getLocation());
1751 return;
1752 // Make a copy of this suppressed diagnostic and store it with the
1753 // template-deduction information;
1754 if (Info) {
1756 DiagInfo.getLocation(),
1757 PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
1758 if (!Diags.getDiagnosticIDs()->isNote(DiagID))
1760 Info->addSuppressedDiagnostic(Loc, std::move(PD));
1761 });
1762 }
1763
1764 // Suppress this diagnostic.
1765 Diags.setLastDiagnosticIgnored(true);
1766 return;
1767 }
1768 }
1769
1770 // Copy the diagnostic printing policy over the ASTContext printing policy.
1771 // TODO: Stop doing that. See: https://reviews.llvm.org/D45093#1090292
1772 Context.setPrintingPolicy(getPrintingPolicy());
1773
1774 // Emit the diagnostic.
1775 if (!Diags.EmitDiagnostic(DB))
1776 return;
1777
1778 // If this is not a note, and we're in a template instantiation
1779 // that is different from the last template instantiation where
1780 // we emitted an error, print a template instantiation
1781 // backtrace.
1782 if (!Diags.getDiagnosticIDs()->isNote(DiagID))
1784}
1785
1788 return true;
1789 auto *FD = dyn_cast<FunctionDecl>(CurContext);
1790 if (!FD)
1791 return false;
1792 auto Loc = DeviceDeferredDiags.find(FD);
1793 if (Loc == DeviceDeferredDiags.end())
1794 return false;
1795 for (auto PDAt : Loc->second) {
1796 if (Diags.getDiagnosticIDs()->isDefaultMappingAsError(
1797 PDAt.second.getDiagID()))
1798 return true;
1799 }
1800 return false;
1801}
1802
1803// Print notes showing how we can reach FD starting from an a priori
1804// known-callable function.
1805static void emitCallStackNotes(Sema &S, const FunctionDecl *FD) {
1806 auto FnIt = S.CUDA().DeviceKnownEmittedFns.find(FD);
1807 while (FnIt != S.CUDA().DeviceKnownEmittedFns.end()) {
1808 // Respect error limit.
1810 return;
1811 DiagnosticBuilder Builder(
1812 S.Diags.Report(FnIt->second.Loc, diag::note_called_by));
1813 Builder << FnIt->second.FD;
1814 FnIt = S.CUDA().DeviceKnownEmittedFns.find(FnIt->second.FD);
1815 }
1816}
1817
1818namespace {
1819
1820/// Helper class that emits deferred diagnostic messages if an entity directly
1821/// or indirectly using the function that causes the deferred diagnostic
1822/// messages is known to be emitted.
1823///
1824/// During parsing of AST, certain diagnostic messages are recorded as deferred
1825/// diagnostics since it is unknown whether the functions containing such
1826/// diagnostics will be emitted. A list of potentially emitted functions and
1827/// variables that may potentially trigger emission of functions are also
1828/// recorded. DeferredDiagnosticsEmitter recursively visits used functions
1829/// by each function to emit deferred diagnostics.
1830///
1831/// During the visit, certain OpenMP directives or initializer of variables
1832/// with certain OpenMP attributes will cause subsequent visiting of any
1833/// functions enter a state which is called OpenMP device context in this
1834/// implementation. The state is exited when the directive or initializer is
1835/// exited. This state can change the emission states of subsequent uses
1836/// of functions.
1837///
1838/// Conceptually the functions or variables to be visited form a use graph
1839/// where the parent node uses the child node. At any point of the visit,
1840/// the tree nodes traversed from the tree root to the current node form a use
1841/// stack. The emission state of the current node depends on two factors:
1842/// 1. the emission state of the root node
1843/// 2. whether the current node is in OpenMP device context
1844/// If the function is decided to be emitted, its contained deferred diagnostics
1845/// are emitted, together with the information about the use stack.
1846///
1847class DeferredDiagnosticsEmitter
1848 : public UsedDeclVisitor<DeferredDiagnosticsEmitter> {
1849public:
1850 typedef UsedDeclVisitor<DeferredDiagnosticsEmitter> Inherited;
1851
1852 // Whether the function is already in the current use-path.
1853 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> InUsePath;
1854
1855 // The current use-path.
1856 llvm::SmallVector<CanonicalDeclPtr<FunctionDecl>, 4> UsePath;
1857
1858 // Whether the visiting of the function has been done. Done[0] is for the
1859 // case not in OpenMP device context. Done[1] is for the case in OpenMP
1860 // device context. We need two sets because diagnostics emission may be
1861 // different depending on whether it is in OpenMP device context.
1862 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> DoneMap[2];
1863
1864 // Emission state of the root node of the current use graph.
1865 bool ShouldEmitRootNode;
1866
1867 // Current OpenMP device context level. It is initialized to 0 and each
1868 // entering of device context increases it by 1 and each exit decreases
1869 // it by 1. Non-zero value indicates it is currently in device context.
1870 unsigned InOMPDeviceContext;
1871
1872 DeferredDiagnosticsEmitter(Sema &S)
1873 : Inherited(S), ShouldEmitRootNode(false), InOMPDeviceContext(0) {}
1874
1875 bool shouldVisitDiscardedStmt() const { return false; }
1876
1877 void VisitOMPTargetDirective(OMPTargetDirective *Node) {
1878 ++InOMPDeviceContext;
1879 Inherited::VisitOMPTargetDirective(Node);
1880 --InOMPDeviceContext;
1881 }
1882
1883 void visitUsedDecl(SourceLocation Loc, Decl *D) {
1884 if (isa<VarDecl>(D))
1885 return;
1886 if (auto *FD = dyn_cast<FunctionDecl>(D))
1887 checkFunc(Loc, FD);
1888 else
1889 Inherited::visitUsedDecl(Loc, D);
1890 }
1891
1892 // Visitor member and parent dtors called by this dtor.
1893 void VisitCalledDestructors(CXXDestructorDecl *DD) {
1894 const CXXRecordDecl *RD = DD->getParent();
1895
1896 // Visit the dtors of all members
1897 for (const FieldDecl *FD : RD->fields()) {
1898 QualType FT = FD->getType();
1899 if (const auto *ClassDecl = FT->getAsCXXRecordDecl();
1900 ClassDecl &&
1901 (ClassDecl->isBeingDefined() || ClassDecl->isCompleteDefinition()))
1902 if (CXXDestructorDecl *MemberDtor = ClassDecl->getDestructor())
1903 asImpl().visitUsedDecl(MemberDtor->getLocation(), MemberDtor);
1904 }
1905
1906 // Also visit base class dtors
1907 for (const auto &Base : RD->bases()) {
1908 QualType BaseType = Base.getType();
1909 if (const auto *BaseDecl = BaseType->getAsCXXRecordDecl();
1910 BaseDecl &&
1911 (BaseDecl->isBeingDefined() || BaseDecl->isCompleteDefinition()))
1912 if (CXXDestructorDecl *BaseDtor = BaseDecl->getDestructor())
1913 asImpl().visitUsedDecl(BaseDtor->getLocation(), BaseDtor);
1914 }
1915 }
1916
1917 void VisitDeclStmt(DeclStmt *DS) {
1918 // Visit dtors called by variables that need destruction
1919 for (auto *D : DS->decls())
1920 if (auto *VD = dyn_cast<VarDecl>(D))
1921 if (VD->isThisDeclarationADefinition() &&
1922 VD->needsDestruction(S.Context)) {
1923 QualType VT = VD->getType();
1924 if (const auto *ClassDecl = VT->getAsCXXRecordDecl();
1925 ClassDecl && (ClassDecl->isBeingDefined() ||
1926 ClassDecl->isCompleteDefinition()))
1927 if (CXXDestructorDecl *Dtor = ClassDecl->getDestructor())
1928 asImpl().visitUsedDecl(Dtor->getLocation(), Dtor);
1929 }
1930
1931 Inherited::VisitDeclStmt(DS);
1932 }
1933 void checkVar(VarDecl *VD) {
1934 assert(VD->isFileVarDecl() &&
1935 "Should only check file-scope variables");
1936 if (auto *Init = VD->getInit()) {
1937 auto DevTy = OMPDeclareTargetDeclAttr::getDeviceType(VD);
1938 bool IsDev = DevTy && (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost ||
1939 *DevTy == OMPDeclareTargetDeclAttr::DT_Any);
1940 if (IsDev)
1941 ++InOMPDeviceContext;
1942 this->Visit(Init);
1943 if (IsDev)
1944 --InOMPDeviceContext;
1945 }
1946 }
1947
1948 void checkFunc(SourceLocation Loc, FunctionDecl *FD) {
1949 auto &Done = DoneMap[InOMPDeviceContext > 0 ? 1 : 0];
1950 FunctionDecl *Caller = UsePath.empty() ? nullptr : UsePath.back();
1951 if ((!ShouldEmitRootNode && !S.getLangOpts().OpenMP && !Caller) ||
1952 S.shouldIgnoreInHostDeviceCheck(FD) || InUsePath.count(FD))
1953 return;
1954 // Finalize analysis of OpenMP-specific constructs.
1955 if (Caller && S.LangOpts.OpenMP && UsePath.size() == 1 &&
1956 (ShouldEmitRootNode || InOMPDeviceContext))
1957 S.OpenMP().finalizeOpenMPDelayedAnalysis(Caller, FD, Loc);
1958 if (Caller)
1959 S.CUDA().DeviceKnownEmittedFns[FD] = {Caller, Loc};
1960 // Always emit deferred diagnostics for the direct users. This does not
1961 // lead to explosion of diagnostics since each user is visited at most
1962 // twice.
1963 if (ShouldEmitRootNode || InOMPDeviceContext)
1964 emitDeferredDiags(FD, Caller);
1965 // Do not revisit a function if the function body has been completely
1966 // visited before.
1967 if (!Done.insert(FD).second)
1968 return;
1969 InUsePath.insert(FD);
1970 UsePath.push_back(FD);
1971 if (auto *S = FD->getBody()) {
1972 this->Visit(S);
1973 }
1974 if (CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(FD))
1975 asImpl().VisitCalledDestructors(Dtor);
1976 UsePath.pop_back();
1977 InUsePath.erase(FD);
1978 }
1979
1980 void checkRecordedDecl(Decl *D) {
1981 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
1982 ShouldEmitRootNode = S.getEmissionStatus(FD, /*Final=*/true) ==
1983 Sema::FunctionEmissionStatus::Emitted;
1984 checkFunc(SourceLocation(), FD);
1985 } else
1986 checkVar(cast<VarDecl>(D));
1987 }
1988
1989 // Emit any deferred diagnostics for FD
1990 void emitDeferredDiags(FunctionDecl *FD, bool ShowCallStack) {
1991 auto It = S.DeviceDeferredDiags.find(FD);
1992 if (It == S.DeviceDeferredDiags.end())
1993 return;
1994 bool HasWarningOrError = false;
1995 bool FirstDiag = true;
1996 for (PartialDiagnosticAt &PDAt : It->second) {
1997 // Respect error limit.
1998 if (S.Diags.hasFatalErrorOccurred())
1999 return;
2000 const SourceLocation &Loc = PDAt.first;
2001 const PartialDiagnostic &PD = PDAt.second;
2002 HasWarningOrError |=
2003 S.getDiagnostics().getDiagnosticLevel(PD.getDiagID(), Loc) >=
2005 {
2006 DiagnosticBuilder Builder(S.Diags.Report(Loc, PD.getDiagID()));
2007 PD.Emit(Builder);
2008 }
2009 // Emit the note on the first diagnostic in case too many diagnostics
2010 // cause the note not emitted.
2011 if (FirstDiag && HasWarningOrError && ShowCallStack) {
2012 emitCallStackNotes(S, FD);
2013 FirstDiag = false;
2014 }
2015 }
2016 }
2017};
2018} // namespace
2019
2021 if (ExternalSource)
2022 ExternalSource->ReadDeclsToCheckForDeferredDiags(
2024
2025 if ((DeviceDeferredDiags.empty() && !LangOpts.OpenMP) ||
2027 return;
2028
2029 DeferredDiagnosticsEmitter DDE(*this);
2030 for (auto *D : DeclsToCheckForDeferredDiags)
2031 DDE.checkRecordedDecl(D);
2032}
2033
2034// In CUDA, there are some constructs which may appear in semantically-valid
2035// code, but trigger errors if we ever generate code for the function in which
2036// they appear. Essentially every construct you're not allowed to use on the
2037// device falls into this category, because you are allowed to use these
2038// constructs in a __host__ __device__ function, but only if that function is
2039// never codegen'ed on the device.
2040//
2041// To handle semantic checking for these constructs, we keep track of the set of
2042// functions we know will be emitted, either because we could tell a priori that
2043// they would be emitted, or because they were transitively called by a
2044// known-emitted function.
2045//
2046// We also keep a partial call graph of which not-known-emitted functions call
2047// which other not-known-emitted functions.
2048//
2049// When we see something which is illegal if the current function is emitted
2050// (usually by way of DiagIfDeviceCode, DiagIfHostCode, or
2051// CheckCall), we first check if the current function is known-emitted. If
2052// so, we immediately output the diagnostic.
2053//
2054// Otherwise, we "defer" the diagnostic. It sits in Sema::DeviceDeferredDiags
2055// until we discover that the function is known-emitted, at which point we take
2056// it out of this map and emit the diagnostic.
2057
2058Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(Kind K, SourceLocation Loc,
2059 unsigned DiagID,
2060 const FunctionDecl *Fn,
2061 Sema &S)
2062 : S(S), Loc(Loc), DiagID(DiagID), Fn(Fn),
2063 ShowCallStack(K == K_ImmediateWithCallStack || K == K_Deferred) {
2064 switch (K) {
2065 case K_Nop:
2066 break;
2067 case K_Immediate:
2068 case K_ImmediateWithCallStack:
2069 ImmediateDiag.emplace(
2070 ImmediateDiagBuilder(S.Diags.Report(Loc, DiagID), S, DiagID));
2071 break;
2072 case K_Deferred:
2073 assert(Fn && "Must have a function to attach the deferred diag to.");
2074 auto &Diags = S.DeviceDeferredDiags[Fn];
2075 PartialDiagId.emplace(Diags.size());
2076 Diags.emplace_back(Loc, S.PDiag(DiagID));
2077 break;
2078 }
2079}
2080
2081Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(SemaDiagnosticBuilder &&D)
2082 : S(D.S), Loc(D.Loc), DiagID(D.DiagID), Fn(D.Fn),
2083 ShowCallStack(D.ShowCallStack), ImmediateDiag(D.ImmediateDiag),
2084 PartialDiagId(D.PartialDiagId) {
2085 // Clean the previous diagnostics.
2086 D.ShowCallStack = false;
2087 D.ImmediateDiag.reset();
2088 D.PartialDiagId.reset();
2089}
2090
2091Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
2092 if (ImmediateDiag) {
2093 // Emit our diagnostic and, if it was a warning or error, output a callstack
2094 // if Fn isn't a priori known-emitted.
2095 ImmediateDiag.reset(); // Emit the immediate diag.
2096
2097 if (ShowCallStack) {
2098 bool IsWarningOrError = S.getDiagnostics().getDiagnosticLevel(
2099 DiagID, Loc) >= DiagnosticsEngine::Warning;
2100 if (IsWarningOrError)
2101 emitCallStackNotes(S, Fn);
2102 }
2103 } else {
2104 assert((!PartialDiagId || ShowCallStack) &&
2105 "Must always show call stack for deferred diags.");
2106 }
2107}
2108
2109Sema::SemaDiagnosticBuilder
2110Sema::targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD) {
2111 FD = FD ? FD : getCurFunctionDecl();
2112 if (LangOpts.OpenMP)
2113 return LangOpts.OpenMPIsTargetDevice
2114 ? OpenMP().diagIfOpenMPDeviceCode(Loc, DiagID, FD)
2115 : OpenMP().diagIfOpenMPHostCode(Loc, DiagID, FD);
2116 if (getLangOpts().CUDA)
2117 return getLangOpts().CUDAIsDevice ? CUDA().DiagIfDeviceCode(Loc, DiagID)
2118 : CUDA().DiagIfHostCode(Loc, DiagID);
2119
2120 if (getLangOpts().SYCLIsDevice)
2121 return SYCL().DiagIfDeviceCode(Loc, DiagID);
2122
2124 FD, *this);
2125}
2126
2128 if (isUnevaluatedContext() || Ty.isNull())
2129 return;
2130
2131 // The original idea behind checkTypeSupport function is that unused
2132 // declarations can be replaced with an array of bytes of the same size during
2133 // codegen, such replacement doesn't seem to be possible for types without
2134 // constant byte size like zero length arrays. So, do a deep check for SYCL.
2135 if (D && LangOpts.SYCLIsDevice) {
2136 llvm::DenseSet<QualType> Visited;
2137 SYCL().deepTypeCheckForDevice(Loc, Visited, D);
2138 }
2139
2141
2142 // Memcpy operations for structs containing a member with unsupported type
2143 // are ok, though.
2144 if (const auto *MD = dyn_cast<CXXMethodDecl>(C)) {
2145 if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) &&
2146 MD->isTrivial())
2147 return;
2148
2149 if (const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD))
2150 if (Ctor->isCopyOrMoveConstructor() && Ctor->isTrivial())
2151 return;
2152 }
2153
2154 // Try to associate errors with the lexical context, if that is a function, or
2155 // the value declaration otherwise.
2156 const FunctionDecl *FD = isa<FunctionDecl>(C)
2158 : dyn_cast_or_null<FunctionDecl>(D);
2159
2160 auto CheckDeviceType = [&](QualType Ty) {
2161 if (Ty->isDependentType())
2162 return;
2163
2164 if (Ty->isBitIntType()) {
2165 if (!Context.getTargetInfo().hasBitIntType()) {
2166 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2167 if (D)
2168 PD << D;
2169 else
2170 PD << "expression";
2171 targetDiag(Loc, PD, FD)
2172 << false /*show bit size*/ << 0 /*bitsize*/ << false /*return*/
2173 << Ty << Context.getTargetInfo().getTriple().str();
2174 }
2175 return;
2176 }
2177
2178 // Check if we are dealing with two 'long double' but with different
2179 // semantics.
2180 bool LongDoubleMismatched = false;
2181 if (Ty->isRealFloatingType() && Context.getTypeSize(Ty) == 128) {
2182 const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(Ty);
2183 if ((&Sem != &llvm::APFloat::PPCDoubleDouble() &&
2184 !Context.getTargetInfo().hasFloat128Type()) ||
2185 (&Sem == &llvm::APFloat::PPCDoubleDouble() &&
2186 !Context.getTargetInfo().hasIbm128Type()))
2187 LongDoubleMismatched = true;
2188 }
2189
2190 if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) ||
2191 (Ty->isFloat128Type() && !Context.getTargetInfo().hasFloat128Type()) ||
2192 (Ty->isIbm128Type() && !Context.getTargetInfo().hasIbm128Type()) ||
2193 (Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 &&
2194 !Context.getTargetInfo().hasInt128Type()) ||
2195 (Ty->isBFloat16Type() && !Context.getTargetInfo().hasBFloat16Type() &&
2196 !LangOpts.CUDAIsDevice) ||
2197 LongDoubleMismatched) {
2198 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2199 if (D)
2200 PD << D;
2201 else
2202 PD << "expression";
2203
2204 if (targetDiag(Loc, PD, FD)
2205 << true /*show bit size*/
2206 << static_cast<unsigned>(Context.getTypeSize(Ty)) << Ty
2207 << false /*return*/ << Context.getTargetInfo().getTriple().str()) {
2208 if (D)
2209 D->setInvalidDecl();
2210 }
2211 if (D)
2212 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2213 }
2214 };
2215
2216 auto CheckType = [&](QualType Ty, bool IsRetTy = false) {
2217 if (LangOpts.SYCLIsDevice ||
2218 (LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice) ||
2219 LangOpts.CUDAIsDevice)
2220 CheckDeviceType(Ty);
2221
2223 const TargetInfo &TI = Context.getTargetInfo();
2224 if (!TI.hasLongDoubleType() && UnqualTy == Context.LongDoubleTy) {
2225 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2226 if (D)
2227 PD << D;
2228 else
2229 PD << "expression";
2230
2231 if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty
2232 << false /*return*/
2233 << TI.getTriple().str()) {
2234 if (D)
2235 D->setInvalidDecl();
2236 }
2237 if (D)
2238 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2239 }
2240
2241 bool IsDouble = UnqualTy == Context.DoubleTy;
2242 bool IsFloat = UnqualTy == Context.FloatTy;
2243 if (IsRetTy && !TI.hasFPReturn() && (IsDouble || IsFloat)) {
2244 PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
2245 if (D)
2246 PD << D;
2247 else
2248 PD << "expression";
2249
2250 if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty << true /*return*/
2251 << TI.getTriple().str()) {
2252 if (D)
2253 D->setInvalidDecl();
2254 }
2255 if (D)
2256 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2257 }
2258
2259 if (TI.hasRISCVVTypes() && Ty->isRVVSizelessBuiltinType() && FD) {
2260 llvm::StringMap<bool> CallerFeatureMap;
2261 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2262 RISCV().checkRVVTypeSupport(Ty, Loc, D, CallerFeatureMap);
2263 }
2264
2265 // Don't allow SVE types in functions without a SVE target.
2266 if (Ty->isSVESizelessBuiltinType() && FD) {
2267 llvm::StringMap<bool> CallerFeatureMap;
2268 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2269 ARM().checkSVETypeSupport(Ty, Loc, FD, CallerFeatureMap);
2270 }
2271
2272 if (auto *VT = Ty->getAs<VectorType>();
2273 VT && FD &&
2274 (VT->getVectorKind() == VectorKind::SveFixedLengthData ||
2275 VT->getVectorKind() == VectorKind::SveFixedLengthPredicate) &&
2276 (LangOpts.VScaleMin != LangOpts.VScaleStreamingMin ||
2277 LangOpts.VScaleMax != LangOpts.VScaleStreamingMax)) {
2278 if (IsArmStreamingFunction(FD, /*IncludeLocallyStreaming=*/true)) {
2279 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2280 << Ty << /*Streaming*/ 0;
2281 } else if (const auto *FTy = FD->getType()->getAs<FunctionProtoType>()) {
2282 if (FTy->getAArch64SMEAttributes() &
2284 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2285 << Ty << /*StreamingCompatible*/ 1;
2286 }
2287 }
2288 }
2289 };
2290
2291 CheckType(Ty);
2292 if (const auto *FPTy = dyn_cast<FunctionProtoType>(Ty)) {
2293 for (const auto &ParamTy : FPTy->param_types())
2294 CheckType(ParamTy);
2295 CheckType(FPTy->getReturnType(), /*IsRetTy=*/true);
2296 }
2297 if (const auto *FNPTy = dyn_cast<FunctionNoProtoType>(Ty))
2298 CheckType(FNPTy->getReturnType(), /*IsRetTy=*/true);
2299}
2300
2301bool Sema::findMacroSpelling(SourceLocation &locref, StringRef name) {
2302 SourceLocation loc = locref;
2303 if (!loc.isMacroID()) return false;
2304
2305 // There's no good way right now to look at the intermediate
2306 // expansions, so just jump to the expansion location.
2307 loc = getSourceManager().getExpansionLoc(loc);
2308
2309 // If that's written with the name, stop here.
2310 SmallString<16> buffer;
2311 if (getPreprocessor().getSpelling(loc, buffer) == name) {
2312 locref = loc;
2313 return true;
2314 }
2315 return false;
2316}
2317
2319
2320 if (!Ctx)
2321 return nullptr;
2322
2323 Ctx = Ctx->getPrimaryContext();
2324 for (Scope *S = getCurScope(); S; S = S->getParent()) {
2325 // Ignore scopes that cannot have declarations. This is important for
2326 // out-of-line definitions of static class members.
2327 if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))
2328 if (DeclContext *Entity = S->getEntity())
2329 if (Ctx == Entity->getPrimaryContext())
2330 return S;
2331 }
2332
2333 return nullptr;
2334}
2335
2336/// Enter a new function scope
2338 if (FunctionScopes.empty() && CachedFunctionScope) {
2339 // Use CachedFunctionScope to avoid allocating memory when possible.
2340 CachedFunctionScope->Clear();
2341 FunctionScopes.push_back(CachedFunctionScope.release());
2342 } else {
2344 }
2345 if (LangOpts.OpenMP)
2346 OpenMP().pushOpenMPFunctionRegion();
2347}
2348
2351 BlockScope, Block));
2353}
2354
2357 FunctionScopes.push_back(LSI);
2359 return LSI;
2360}
2361
2363 if (LambdaScopeInfo *const LSI = getCurLambda()) {
2364 LSI->AutoTemplateParameterDepth = Depth;
2365 return;
2366 }
2367 llvm_unreachable(
2368 "Remove assertion if intentionally called in a non-lambda context.");
2369}
2370
2371// Check that the type of the VarDecl has an accessible copy constructor and
2372// resolve its destructor's exception specification.
2373// This also performs initialization of block variables when they are moved
2374// to the heap. It uses the same rules as applicable for implicit moves
2375// according to the C++ standard in effect ([class.copy.elision]p3).
2376static void checkEscapingByref(VarDecl *VD, Sema &S) {
2377 QualType T = VD->getType();
2380 SourceLocation Loc = VD->getLocation();
2381 Expr *VarRef =
2382 new (S.Context) DeclRefExpr(S.Context, VD, false, T, VK_LValue, Loc);
2383 ExprResult Result;
2384 auto IE = InitializedEntity::InitializeBlock(Loc, T);
2385 if (S.getLangOpts().CPlusPlus23) {
2386 auto *E = ImplicitCastExpr::Create(S.Context, T, CK_NoOp, VarRef, nullptr,
2388 Result = S.PerformCopyInitialization(IE, SourceLocation(), E);
2389 } else {
2392 VarRef);
2393 }
2394
2395 if (!Result.isInvalid()) {
2396 Result = S.MaybeCreateExprWithCleanups(Result);
2397 Expr *Init = Result.getAs<Expr>();
2399 }
2400
2401 // The destructor's exception specification is needed when IRGen generates
2402 // block copy/destroy functions. Resolve it here.
2403 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
2404 if (CXXDestructorDecl *DD = RD->getDestructor()) {
2405 auto *FPT = DD->getType()->castAs<FunctionProtoType>();
2406 S.ResolveExceptionSpec(Loc, FPT);
2407 }
2408}
2409
2410static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S) {
2411 // Set the EscapingByref flag of __block variables captured by
2412 // escaping blocks.
2413 for (const BlockDecl *BD : FSI.Blocks) {
2414 for (const BlockDecl::Capture &BC : BD->captures()) {
2415 VarDecl *VD = BC.getVariable();
2416 if (VD->hasAttr<BlocksAttr>()) {
2417 // Nothing to do if this is a __block variable captured by a
2418 // non-escaping block.
2419 if (BD->doesNotEscape())
2420 continue;
2421 VD->setEscapingByref();
2422 }
2423 // Check whether the captured variable is or contains an object of
2424 // non-trivial C union type.
2425 QualType CapType = BC.getVariable()->getType();
2428 S.checkNonTrivialCUnion(BC.getVariable()->getType(),
2429 BD->getCaretLocation(),
2432 }
2433 }
2434
2435 for (VarDecl *VD : FSI.ByrefBlockVars) {
2436 // __block variables might require us to capture a copy-initializer.
2437 if (!VD->isEscapingByref())
2438 continue;
2439 // It's currently invalid to ever have a __block variable with an
2440 // array type; should we diagnose that here?
2441 // Regardless, we don't want to ignore array nesting when
2442 // constructing this copy.
2443 if (VD->getType()->isStructureOrClassType())
2444 checkEscapingByref(VD, S);
2445 }
2446}
2447
2450 QualType BlockType) {
2451 assert(!FunctionScopes.empty() && "mismatched push/pop!");
2452
2453 markEscapingByrefs(*FunctionScopes.back(), *this);
2454
2457
2458 if (LangOpts.OpenMP)
2459 OpenMP().popOpenMPFunctionRegion(Scope.get());
2460
2461 // Issue any analysis-based warnings.
2462 if (WP && D) {
2463 inferNoReturnAttr(*this, D);
2464 AnalysisWarnings.IssueWarnings(*WP, Scope.get(), D, BlockType);
2465 } else
2466 for (const auto &PUD : Scope->PossiblyUnreachableDiags)
2467 Diag(PUD.Loc, PUD.PD);
2468
2469 return Scope;
2470}
2471
2474 if (!Scope->isPlainFunction())
2475 Self->CapturingFunctionScopes--;
2476 // Stash the function scope for later reuse if it's for a normal function.
2477 if (Scope->isPlainFunction() && !Self->CachedFunctionScope)
2478 Self->CachedFunctionScope.reset(Scope);
2479 else
2480 delete Scope;
2481}
2482
2483void Sema::PushCompoundScope(bool IsStmtExpr) {
2484 getCurFunction()->CompoundScopes.push_back(
2485 CompoundScopeInfo(IsStmtExpr, getCurFPFeatures()));
2486}
2487
2489 FunctionScopeInfo *CurFunction = getCurFunction();
2490 assert(!CurFunction->CompoundScopes.empty() && "mismatched push/pop");
2491
2492 CurFunction->CompoundScopes.pop_back();
2493}
2494
2496 return getCurFunction()->hasUnrecoverableErrorOccurred();
2497}
2498
2500 if (!FunctionScopes.empty())
2501 FunctionScopes.back()->setHasBranchIntoScope();
2502}
2503
2505 if (!FunctionScopes.empty())
2506 FunctionScopes.back()->setHasBranchProtectedScope();
2507}
2508
2510 if (!FunctionScopes.empty())
2511 FunctionScopes.back()->setHasIndirectGoto();
2512}
2513
2515 if (!FunctionScopes.empty())
2516 FunctionScopes.back()->setHasMustTail();
2517}
2518
2520 if (FunctionScopes.empty())
2521 return nullptr;
2522
2523 auto CurBSI = dyn_cast<BlockScopeInfo>(FunctionScopes.back());
2524 if (CurBSI && CurBSI->TheDecl &&
2525 !CurBSI->TheDecl->Encloses(CurContext)) {
2526 // We have switched contexts due to template instantiation.
2527 assert(!CodeSynthesisContexts.empty());
2528 return nullptr;
2529 }
2530
2531 return CurBSI;
2532}
2533
2535 if (FunctionScopes.empty())
2536 return nullptr;
2537
2538 for (int e = FunctionScopes.size() - 1; e >= 0; --e) {
2540 continue;
2541 return FunctionScopes[e];
2542 }
2543 return nullptr;
2544}
2545
2547 for (auto *Scope : llvm::reverse(FunctionScopes)) {
2548 if (auto *CSI = dyn_cast<CapturingScopeInfo>(Scope)) {
2549 auto *LSI = dyn_cast<LambdaScopeInfo>(CSI);
2550 if (LSI && LSI->Lambda && !LSI->Lambda->Encloses(CurContext) &&
2551 LSI->AfterParameterList) {
2552 // We have switched contexts due to template instantiation.
2553 // FIXME: We should swap out the FunctionScopes during code synthesis
2554 // so that we don't need to check for this.
2555 assert(!CodeSynthesisContexts.empty());
2556 return nullptr;
2557 }
2558 return CSI;
2559 }
2560 }
2561 return nullptr;
2562}
2563
2564LambdaScopeInfo *Sema::getCurLambda(bool IgnoreNonLambdaCapturingScope) {
2565 if (FunctionScopes.empty())
2566 return nullptr;
2567
2568 auto I = FunctionScopes.rbegin();
2569 if (IgnoreNonLambdaCapturingScope) {
2570 auto E = FunctionScopes.rend();
2571 while (I != E && isa<CapturingScopeInfo>(*I) && !isa<LambdaScopeInfo>(*I))
2572 ++I;
2573 if (I == E)
2574 return nullptr;
2575 }
2576 auto *CurLSI = dyn_cast<LambdaScopeInfo>(*I);
2577 if (CurLSI && CurLSI->Lambda && CurLSI->CallOperator &&
2578 !CurLSI->Lambda->Encloses(CurContext) && CurLSI->AfterParameterList) {
2579 // We have switched contexts due to template instantiation.
2580 assert(!CodeSynthesisContexts.empty());
2581 return nullptr;
2582 }
2583
2584 return CurLSI;
2585}
2586
2587// We have a generic lambda if we parsed auto parameters, or we have
2588// an associated template parameter list.
2590 if (LambdaScopeInfo *LSI = getCurLambda()) {
2591 return (LSI->TemplateParams.size() ||
2592 LSI->GLTemplateParameterList) ? LSI : nullptr;
2593 }
2594 return nullptr;
2595}
2596
2597
2599 if (!LangOpts.RetainCommentsFromSystemHeaders &&
2600 SourceMgr.isInSystemHeader(Comment.getBegin()))
2601 return;
2602 RawComment RC(SourceMgr, Comment, LangOpts.CommentOpts, false);
2604 SourceRange MagicMarkerRange(Comment.getBegin(),
2605 Comment.getBegin().getLocWithOffset(3));
2606 StringRef MagicMarkerText;
2607 switch (RC.getKind()) {
2609 MagicMarkerText = "///<";
2610 break;
2612 MagicMarkerText = "/**<";
2613 break;
2615 // FIXME: are there other scenarios that could produce an invalid
2616 // raw comment here?
2617 Diag(Comment.getBegin(), diag::warn_splice_in_doxygen_comment);
2618 return;
2619 default:
2620 llvm_unreachable("if this is an almost Doxygen comment, "
2621 "it should be ordinary");
2622 }
2623 Diag(Comment.getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
2624 FixItHint::CreateReplacement(MagicMarkerRange, MagicMarkerText);
2625 }
2626 Context.addComment(RC);
2627}
2628
2629// Pin this vtable to this file.
2631char ExternalSemaSource::ID;
2632
2635
2639
2641 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {}
2642
2644 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &) {}
2645
2646bool Sema::tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
2648 ZeroArgCallReturnTy = QualType();
2649 OverloadSet.clear();
2650
2651 const OverloadExpr *Overloads = nullptr;
2652 bool IsMemExpr = false;
2653 if (E.getType() == Context.OverloadTy) {
2655
2656 // Ignore overloads that are pointer-to-member constants.
2658 return false;
2659
2660 Overloads = FR.Expression;
2661 } else if (E.getType() == Context.BoundMemberTy) {
2662 Overloads = dyn_cast<UnresolvedMemberExpr>(E.IgnoreParens());
2663 IsMemExpr = true;
2664 }
2665
2666 bool Ambiguous = false;
2667 bool IsMV = false;
2668
2669 if (Overloads) {
2670 for (OverloadExpr::decls_iterator it = Overloads->decls_begin(),
2671 DeclsEnd = Overloads->decls_end(); it != DeclsEnd; ++it) {
2672 OverloadSet.addDecl(*it);
2673
2674 // Check whether the function is a non-template, non-member which takes no
2675 // arguments.
2676 if (IsMemExpr)
2677 continue;
2678 if (const FunctionDecl *OverloadDecl
2679 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
2680 if (OverloadDecl->getMinRequiredArguments() == 0) {
2681 if (!ZeroArgCallReturnTy.isNull() && !Ambiguous &&
2682 (!IsMV || !(OverloadDecl->isCPUDispatchMultiVersion() ||
2683 OverloadDecl->isCPUSpecificMultiVersion()))) {
2684 ZeroArgCallReturnTy = QualType();
2685 Ambiguous = true;
2686 } else {
2687 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
2688 IsMV = OverloadDecl->isCPUDispatchMultiVersion() ||
2689 OverloadDecl->isCPUSpecificMultiVersion();
2690 }
2691 }
2692 }
2693 }
2694
2695 // If it's not a member, use better machinery to try to resolve the call
2696 if (!IsMemExpr)
2697 return !ZeroArgCallReturnTy.isNull();
2698 }
2699
2700 // Attempt to call the member with no arguments - this will correctly handle
2701 // member templates with defaults/deduction of template arguments, overloads
2702 // with default arguments, etc.
2703 if (IsMemExpr && !E.isTypeDependent()) {
2704 Sema::TentativeAnalysisScope Trap(*this);
2706 SourceLocation());
2707 if (R.isUsable()) {
2708 ZeroArgCallReturnTy = R.get()->getType();
2709 return true;
2710 }
2711 return false;
2712 }
2713
2714 if (const auto *DeclRef = dyn_cast<DeclRefExpr>(E.IgnoreParens())) {
2715 if (const auto *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
2716 if (Fun->getMinRequiredArguments() == 0)
2717 ZeroArgCallReturnTy = Fun->getReturnType();
2718 return true;
2719 }
2720 }
2721
2722 // We don't have an expression that's convenient to get a FunctionDecl from,
2723 // but we can at least check if the type is "function of 0 arguments".
2724 QualType ExprTy = E.getType();
2725 const FunctionType *FunTy = nullptr;
2726 QualType PointeeTy = ExprTy->getPointeeType();
2727 if (!PointeeTy.isNull())
2728 FunTy = PointeeTy->getAs<FunctionType>();
2729 if (!FunTy)
2730 FunTy = ExprTy->getAs<FunctionType>();
2731
2732 if (const auto *FPT = dyn_cast_if_present<FunctionProtoType>(FunTy)) {
2733 if (FPT->getNumParams() == 0)
2734 ZeroArgCallReturnTy = FunTy->getReturnType();
2735 return true;
2736 }
2737 return false;
2738}
2739
2740/// Give notes for a set of overloads.
2741///
2742/// A companion to tryExprAsCall. In cases when the name that the programmer
2743/// wrote was an overloaded function, we may be able to make some guesses about
2744/// plausible overloads based on their return types; such guesses can be handed
2745/// off to this method to be emitted as notes.
2746///
2747/// \param Overloads - The overloads to note.
2748/// \param FinalNoteLoc - If we've suppressed printing some overloads due to
2749/// -fshow-overloads=best, this is the location to attach to the note about too
2750/// many candidates. Typically this will be the location of the original
2751/// ill-formed expression.
2752static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads,
2753 const SourceLocation FinalNoteLoc) {
2754 unsigned ShownOverloads = 0;
2755 unsigned SuppressedOverloads = 0;
2756 for (UnresolvedSetImpl::iterator It = Overloads.begin(),
2757 DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
2758 if (ShownOverloads >= S.Diags.getNumOverloadCandidatesToShow()) {
2759 ++SuppressedOverloads;
2760 continue;
2761 }
2762
2763 const NamedDecl *Fn = (*It)->getUnderlyingDecl();
2764 // Don't print overloads for non-default multiversioned functions.
2765 if (const auto *FD = Fn->getAsFunction()) {
2766 if (FD->isMultiVersion() && FD->hasAttr<TargetAttr>() &&
2767 !FD->getAttr<TargetAttr>()->isDefaultVersion())
2768 continue;
2769 if (FD->isMultiVersion() && FD->hasAttr<TargetVersionAttr>() &&
2770 !FD->getAttr<TargetVersionAttr>()->isDefaultVersion())
2771 continue;
2772 }
2773 S.Diag(Fn->getLocation(), diag::note_possible_target_of_call);
2774 ++ShownOverloads;
2775 }
2776
2777 S.Diags.overloadCandidatesShown(ShownOverloads);
2778
2779 if (SuppressedOverloads)
2780 S.Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
2781 << SuppressedOverloads;
2782}
2783
2785 const UnresolvedSetImpl &Overloads,
2786 bool (*IsPlausibleResult)(QualType)) {
2787 if (!IsPlausibleResult)
2788 return noteOverloads(S, Overloads, Loc);
2789
2790 UnresolvedSet<2> PlausibleOverloads;
2791 for (OverloadExpr::decls_iterator It = Overloads.begin(),
2792 DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
2793 const auto *OverloadDecl = cast<FunctionDecl>(*It);
2794 QualType OverloadResultTy = OverloadDecl->getReturnType();
2795 if (IsPlausibleResult(OverloadResultTy))
2796 PlausibleOverloads.addDecl(It.getDecl());
2797 }
2798 noteOverloads(S, PlausibleOverloads, Loc);
2799}
2800
2801/// Determine whether the given expression can be called by just
2802/// putting parentheses after it. Notably, expressions with unary
2803/// operators can't be because the unary operator will start parsing
2804/// outside the call.
2805static bool IsCallableWithAppend(const Expr *E) {
2806 E = E->IgnoreImplicit();
2807 return (!isa<CStyleCastExpr>(E) &&
2808 !isa<UnaryOperator>(E) &&
2809 !isa<BinaryOperator>(E) &&
2811}
2812
2814 if (const auto *UO = dyn_cast<UnaryOperator>(E))
2815 E = UO->getSubExpr();
2816
2817 if (const auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
2818 if (ULE->getNumDecls() == 0)
2819 return false;
2820
2821 const NamedDecl *ND = *ULE->decls_begin();
2822 if (const auto *FD = dyn_cast<FunctionDecl>(ND))
2824 }
2825 return false;
2826}
2827
2829 bool ForceComplain,
2830 bool (*IsPlausibleResult)(QualType)) {
2831 SourceLocation Loc = E.get()->getExprLoc();
2832 SourceRange Range = E.get()->getSourceRange();
2833 UnresolvedSet<4> Overloads;
2834
2835 // If this is a SFINAE context, don't try anything that might trigger ADL
2836 // prematurely.
2837 if (!isSFINAEContext()) {
2838 QualType ZeroArgCallTy;
2839 if (tryExprAsCall(*E.get(), ZeroArgCallTy, Overloads) &&
2840 !ZeroArgCallTy.isNull() &&
2841 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
2842 // At this point, we know E is potentially callable with 0
2843 // arguments and that it returns something of a reasonable type,
2844 // so we can emit a fixit and carry on pretending that E was
2845 // actually a CallExpr.
2846 SourceLocation ParenInsertionLoc = getLocForEndOfToken(Range.getEnd());
2848 Diag(Loc, PD) << /*zero-arg*/ 1 << IsMV << Range
2849 << (IsCallableWithAppend(E.get())
2850 ? FixItHint::CreateInsertion(ParenInsertionLoc,
2851 "()")
2852 : FixItHint());
2853 if (!IsMV)
2854 notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
2855
2856 // FIXME: Try this before emitting the fixit, and suppress diagnostics
2857 // while doing so.
2858 E = BuildCallExpr(nullptr, E.get(), Range.getEnd(), {},
2859 Range.getEnd().getLocWithOffset(1));
2860 return true;
2861 }
2862 }
2863 if (!ForceComplain) return false;
2864
2866 Diag(Loc, PD) << /*not zero-arg*/ 0 << IsMV << Range;
2867 if (!IsMV)
2868 notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
2869 E = ExprError();
2870 return true;
2871}
2872
2874 if (!Ident_super)
2875 Ident_super = &Context.Idents.get("super");
2876 return Ident_super;
2877}
2878
2881 unsigned OpenMPCaptureLevel) {
2882 auto *CSI = new CapturedRegionScopeInfo(
2883 getDiagnostics(), S, CD, RD, CD->getContextParam(), K,
2884 (getLangOpts().OpenMP && K == CR_OpenMP)
2885 ? OpenMP().getOpenMPNestingLevel()
2886 : 0,
2887 OpenMPCaptureLevel);
2888 CSI->ReturnType = Context.VoidTy;
2889 FunctionScopes.push_back(CSI);
2891}
2892
2894 if (FunctionScopes.empty())
2895 return nullptr;
2896
2897 return dyn_cast<CapturedRegionScopeInfo>(FunctionScopes.back());
2898}
2899
2900const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
2904
2906 : S(S), OldFPFeaturesState(S.CurFPFeatures),
2907 OldOverrides(S.FpPragmaStack.CurrentValue),
2908 OldEvalMethod(S.PP.getCurrentFPEvalMethod()),
2909 OldFPPragmaLocation(S.PP.getLastFPEvalPragmaLocation()) {}
2910
2912 S.CurFPFeatures = OldFPFeaturesState;
2913 S.FpPragmaStack.CurrentValue = OldOverrides;
2914 S.PP.setCurrentFPEvalMethod(OldFPPragmaLocation, OldEvalMethod);
2915}
2916
2918 assert(D.getCXXScopeSpec().isSet() &&
2919 "can only be called for qualified names");
2920
2921 auto LR = LookupResult(*this, D.getIdentifier(), D.getBeginLoc(),
2925 if (!DC)
2926 return false;
2927
2928 LookupQualifiedName(LR, DC);
2929 bool Result = llvm::all_of(LR, [](Decl *Dcl) {
2930 if (NamedDecl *ND = dyn_cast<NamedDecl>(Dcl)) {
2931 ND = ND->getUnderlyingDecl();
2932 return isa<FunctionDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
2933 isa<UsingDecl>(ND);
2934 }
2935 return false;
2936 });
2937 return Result;
2938}
2939
2942
2943 auto *A = AnnotateAttr::Create(Context, Annot, Args.data(), Args.size(), CI);
2945 CI, MutableArrayRef<Expr *>(A->args_begin(), A->args_end()))) {
2946 return nullptr;
2947 }
2948 return A;
2949}
2950
2952 // Make sure that there is a string literal as the annotation's first
2953 // argument.
2954 StringRef Str;
2955 if (!checkStringLiteralArgumentAttr(AL, 0, Str))
2956 return nullptr;
2957
2959 Args.reserve(AL.getNumArgs() - 1);
2960 for (unsigned Idx = 1; Idx < AL.getNumArgs(); Idx++) {
2961 assert(!AL.isArgIdent(Idx));
2962 Args.push_back(AL.getArgAsExpr(Idx));
2963 }
2964
2965 return CreateAnnotationAttr(AL, Str, Args);
2966}
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:2376
static bool IsCPUDispatchCPUSpecificMultiVersion(const Expr *E)
Definition Sema.cpp:2813
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:2805
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:2752
static bool isFunctionOrVarDeclExternC(const NamedDecl *ND)
Definition Sema.cpp:927
static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S)
Definition Sema.cpp:2410
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:1805
static void notePlausibleOverloads(Sema &S, SourceLocation Loc, const UnresolvedSetImpl &Overloads, bool(*IsPlausibleResult)(QualType))
Definition Sema.cpp:2784
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:4786
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:46
A class which contains all the information about a particular captured value.
Definition Decl.h:4677
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4671
ArrayRef< Capture > captures() const
Definition Decl.h:4798
SourceLocation getCaretLocation() const
Definition Decl.h:4744
bool doesNotEscape() const
Definition Decl.h:4822
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:4943
ImplicitParamDecl * getContextParam() const
Retrieve the parameter containing captured variables.
Definition Decl.h:5001
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:1671
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
T * getAttr() const
Definition DeclBase.h:573
void addAttr(Attr *A)
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
bool isReferenced() const
Whether any declaration of this entity was referenced.
Definition DeclBase.cpp:600
bool isInvalidDecl() const
Definition DeclBase.h:588
SourceLocation getLocation() const
Definition DeclBase.h:439
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition DeclBase.cpp:575
bool hasAttr() const
Definition DeclBase.h:577
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h: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:2634
virtual void ReadMethodPool(Selector Sel)
Load the contents of the global method pool for a given selector.
Definition Sema.cpp:2633
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:2640
~ExternalSemaSource() override
Definition Sema.cpp:2630
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:2636
virtual void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &)
Definition Sema.cpp:2643
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:3279
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
Definition Decl.cpp:3706
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:3702
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:4339
static FunctionEffectsRef get(QualType QT)
Extract the effects from a Type if it is a function, block, or member function pointer,...
Definition TypeBase.h:9216
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5269
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4465
QualType getReturnType() const
Definition TypeBase.h:4805
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:3853
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:3910
static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, QualType Type)
@ CMK_HeaderUnit
Compiling a module header unit.
@ CMK_ModuleInterface
Compiling a C++ modules interface unit.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static std::optional< Token > findNextToken(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeComments=false)
Finds the token that comes right after the given location.
Definition Lexer.cpp:1331
static SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset, const SourceManager &SM, const LangOptions &LangOpts)
Computes the source location just past the end of the token at this source location.
Definition Lexer.cpp:858
Represents the results of name lookup.
Definition Lookup.h:147
Encapsulates the data about a macro definition (e.g.
Definition MacroInfo.h:39
Abstract interface for a module loader.
bool resolveExports(Module *Mod, bool Complain)
Resolve all of the unresolved exports in the given module.
bool resolveConflicts(Module *Mod, bool Complain)
Resolve all of the unresolved conflicts in the given module.
bool resolveUses(Module *Mod, bool Complain)
Resolve all of the unresolved uses in the given module.
Describes a module or submodule.
Definition Module.h:144
bool isNamedModuleInterfaceHasInit() const
Definition Module.h:684
bool isInterfaceOrPartition() const
Definition Module.h:671
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition Module.h:458
llvm::iterator_range< submodule_iterator > submodules()
Definition Module.h:838
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition Module.h:180
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition Module.h:177
static const unsigned NumNSNumberLiteralMethods
Definition NSAPI.h:191
This represents a decl that may have a name.
Definition Decl.h:274
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
Definition Decl.h:429
NamedDecl * getMostRecentDecl()
Definition Decl.h:501
bool isExternallyVisible() const
Definition Decl.h:433
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
void addSupport(const llvm::StringMap< bool > &FeaturesMap, const LangOptions &Opts)
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
Definition ExprCXX.h: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:8344
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8386
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8365
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:4324
field_range fields() const
Definition Decl.h:4527
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:1362
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1377
Custom deleter to allow FunctionScopeInfos to be kept alive for a short time after they've been poppe...
Definition Sema.h:1053
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2473
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12476
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Definition Sema.h:12520
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:856
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
Definition Sema.h:3588
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:13597
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13073
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2546
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1121
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
Definition Sema.h:10082
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:2646
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9353
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the pragma attribute stack.
Definition Sema.h:2116
OpaquePtr< QualType > TypeTy
Definition Sema.h:1281
void addImplicitTypedef(StringRef Name, QualType T)
Definition Sema.cpp:365
void PrintContextStack()
Definition Sema.h:13684
SemaOpenMP & OpenMP()
Definition Sema.h:1508
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6302
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
Definition Sema.h:1242
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Definition Sema.h:3570
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1152
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition Sema.h:6519
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
Definition Sema.h:1231
SemaCUDA & CUDA()
Definition Sema.h:1448
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:1224
Preprocessor & getPreprocessor() const
Definition Sema.h:926
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2318
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2051
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2045
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2499
void ActOnComment(SourceRange Comment)
Definition Sema.cpp:2598
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:2052
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:1533
IdentifierInfo * getSuperIdentifier() const
Definition Sema.cpp:2873
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:1660
void DiagnosePrecisionLossInComplexDivision()
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
Definition Sema.h:9293
ASTContext & Context
Definition Sema.h:1288
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
Definition Sema.cpp:680
llvm::DenseMap< IdentifierInfo *, PendingPragmaInfo > PendingExportedNames
Definition Sema.h:2333
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:924
SemaObjC & ObjC()
Definition Sema.h:1493
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:2828
SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags
Diagnostics that are emitted only if we discover that the given function must be codegen'ed.
Definition Sema.h:1418
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:3167
PragmaStack< bool > StrictGuardStackCheckStack
Definition Sema.h:2048
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:3578
ASTContext & getASTContext() const
Definition Sema.h:927
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1061
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:6545
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:6629
PragmaStack< StringLiteral * > ConstSegStack
Definition Sema.h:2044
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:9296
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
Definition Sema.h:1214
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1192
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition Sema.cpp:1665
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Definition Sema.cpp:2589
void setFunctionHasIndirectGoto()
Definition Sema.cpp:2509
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition Sema.cpp:1679
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2337
FPOptions & getCurFPFeatures()
Definition Sema.h:922
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition Sema.h:8336
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:2355
void PopCompoundScope()
Definition Sema.cpp:2488
api_notes::APINotesManager APINotes
Definition Sema.h:1292
const LangOptions & getLangOpts() const
Definition Sema.h:920
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2449
SemaOpenACC & OpenACC()
Definition Sema.h:1498
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
ASTConsumer & getASTConsumer() const
Definition Sema.h:928
void * OpaqueParser
Definition Sema.h:1332
Preprocessor & PP
Definition Sema.h:1287
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:1327
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:2127
const LangOptions & LangOpts
Definition Sema.h:1286
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition Sema.h:1220
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2564
static const uint64_t MaximumAlignment
Definition Sema.h:1215
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition Sema.h:6523
SemaHLSL & HLSL()
Definition Sema.h:1458
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1218
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:1523
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:14015
void performFunctionEffectAnalysis(TranslationUnitDecl *TU)
PragmaStack< AlignPackInfo > AlignPackStack
Definition Sema.h:2033
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:6621
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2043
DeclContext * getCurLexicalContext() const
Definition Sema.h:1125
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
Definition Sema.cpp:1672
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:4775
sema::FunctionScopeInfo * getCurFunction() const
Definition Sema.h:1321
void PushCompoundScope(bool IsStmtExpr)
Definition Sema.cpp:2483
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
Definition Sema.cpp:2917
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:2301
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2086
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9879
static bool isCast(CheckedConversionKind CCK)
Definition Sema.h:2547
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
Definition Sema.cpp:2519
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1421
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:6549
SemaOpenCL & OpenCL()
Definition Sema.h:1503
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8199
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1640
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:8395
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
Definition Sema.h:3592
bool MSStructPragmaOn
Definition Sema.h:1807
unsigned NonInstantiationEntries
The number of CodeSynthesisContexts that are not template instantiations and, therefore,...
Definition Sema.h:13628
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:13963
SourceManager & getSourceManager() const
Definition Sema.h:925
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:4102
@ NTCUK_Copy
Definition Sema.h:4103
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
Definition Sema.cpp:2349
PragmaStack< MSVtorDispMode > VtorDispStack
Whether to insert vtordisps prior to virtual bases in the Microsoft C++ ABI.
Definition Sema.h:2032
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2093
bool isSFINAEContext() const
Definition Sema.h:13696
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
Definition Sema.h:13652
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition Sema.cpp:2879
void emitDeferredDiags()
Definition Sema.cpp:2020
void setFunctionHasMustTail()
Definition Sema.cpp:2514
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition Sema.h:8391
void CheckCompleteVariableDeclaration(VarDecl *VD)
void setFunctionHasBranchProtectedScope()
Definition Sema.cpp:2504
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:1559
ASTConsumer & Consumer
Definition Sema.h:1289
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
Definition Sema.h:4661
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1326
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
Definition Sema.cpp:1786
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:14011
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:6761
std::pair< SourceLocation, bool > DeleteExprLoc
Definition Sema.h:968
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
Definition Sema.cpp:2362
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:1247
void DiagnoseUnterminatedPragmaAttribute()
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
LateTemplateParserCB * LateTemplateParser
Definition Sema.h:1331
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:8402
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Definition Sema.h:3585
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:2901
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8339
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
SourceManager & SourceMgr
Definition Sema.h:1291
DiagnosticsEngine & Diags
Definition Sema.h:1290
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:589
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:921
FPOptions CurFPFeatures
Definition Sema.h:1284
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2042
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:2940
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
Definition Sema.h:6557
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:1805
llvm::BumpPtrAllocator BumpAlloc
Definition Sema.h:1233
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:6301
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:3560
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2110
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
Definition Sema.h:1345
sema::FunctionScopeInfo * getEnclosingFunction() const
Definition Sema.cpp:2534
sema::CapturedRegionScopeInfo * getCurCapturedRegion()
Retrieve the current captured region, if any.
Definition Sema.cpp:2893
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:1685
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:3487
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
Definition Sema.cpp:2495
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:1428
llvm::DenseSet< InstantiatingSpecializationsKey > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
Definition Sema.h:13600
ASTMutationListener * getASTMutationListener() const
Definition Sema.cpp:651
SFINAETrap * getSFINAEContext() const
Returns a pointer to the current SFINAE context, if any.
Definition Sema.h:13693
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:3815
bool isUnion() const
Definition Decl.h:3925
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:8263
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isFloat16Type() const
Definition TypeBase.h:8900
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:8935
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
Definition Type.cpp:2574
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9178
bool isFloat128Type() const
Definition TypeBase.h:8920
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:753
bool isBitIntType() const
Definition TypeBase.h:8800
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2783
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
Definition Type.cpp:2365
bool isIbm128Type() const
Definition TypeBase.h:8924
bool isBFloat16Type() const
Definition TypeBase.h:8912
bool isStructureOrClassType() const
Definition Type.cpp:707
bool isRealFloatingType() const
Floating point categories.
Definition Type.cpp:2321
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
Definition Type.cpp:2595
Linkage getLinkage() const
Determine the linkage of this type.
Definition Type.cpp:4892
@ STK_FloatingComplex
Definition TypeBase.h:2765
@ STK_ObjCObjectPointer
Definition TypeBase.h:2759
@ STK_IntegralComplex
Definition TypeBase.h:2764
@ STK_MemberPointer
Definition TypeBase.h:2760
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9111
bool isNullPtrType() const
Definition TypeBase.h:8928
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition Type.cpp:5015
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:2821
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:2377
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:2356
@ 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:2709
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:4176
Retains information about a block that is currently being parsed.
Definition ScopeInfo.h:790
Retains information about a captured region.
Definition ScopeInfo.h:816
Contains information about the compound statement currently being parsed.
Definition ScopeInfo.h:67
Retains information about a function, method, or block that is currently being parsed.
Definition ScopeInfo.h:104
SmallVector< CompoundScopeInfo, 4 > CompoundScopes
The stack of currently active compound statement scopes in the function.
Definition ScopeInfo.h:228
llvm::SmallPtrSet< const BlockDecl *, 1 > Blocks
The set of blocks that are introduced in this function.
Definition ScopeInfo.h:231
llvm::TinyPtrVector< VarDecl * > ByrefBlockVars
The set of __block variables that are introduced in this function.
Definition ScopeInfo.h:234
void FileChanged(SourceLocation Loc, FileChangeReason Reason, SrcMgr::CharacteristicKind FileType, FileID PrevFID) override
Callback invoked whenever a source file is entered or exited.
Definition Sema.cpp:190
void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace, diag::Severity Mapping, StringRef Str) override
Callback invoked when a #pragma gcc diagnostic directive is read.
Definition Sema.cpp:227
Provides information about an attempted template argument deduction, whose success or failure was des...
void addSuppressedDiagnostic(SourceLocation Loc, PartialDiagnostic PD)
Add a new diagnostic to the set of diagnostics.
void addSFINAEDiagnostic(SourceLocation Loc, PartialDiagnostic PD)
Set the diagnostic which caused the SFINAE failure.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
Defines the clang::TargetInfo interface.
Definition SPIR.cpp:47
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
Flavor
Flavors of diagnostics we can emit.
@ WarningOrError
A diagnostic that indicates a problem or potential problem.
@ Remark
A diagnostic that indicates normal progress through compilation.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
void threadSafetyCleanup(BeforeSet *Cache)
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
Definition FileEntry.h:208
@ CPlusPlus
@ CPlusPlus11
@ ExpectedVariableOrFunction
@ Nullable
Values of this type can be null.
Definition Specifiers.h:352
@ NonNull
Values of this type can never be null.
Definition Specifiers.h:350
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:636
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
@ CR_OpenMP
@ SC_Register
Definition Specifiers.h:257
@ SC_Static
Definition Specifiers.h:252
void inferNoReturnAttr(Sema &S, Decl *D)
@ SD_Thread
Thread storage duration.
Definition Specifiers.h:342
@ SD_Static
Static storage duration.
Definition Specifiers.h:343
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
TUFragmentKind
Definition Sema.h:487
@ Private
The private module fragment, between 'module :private;' and the end of the translation unit.
Definition Sema.h:496
@ Global
The global module fragment, between 'module;' and a module-declaration.
Definition Sema.h:489
@ Normal
A normal translation unit fragment.
Definition Sema.h:493
ExprResult ExprError()
Definition Ownership.h:265
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition Sema.h:581
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_ClangModule
The translation unit is a clang module.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
void FormatASTNodeDiagnosticArgument(DiagnosticsEngine::ArgumentKind Kind, intptr_t Val, StringRef Modifier, StringRef Argument, ArrayRef< DiagnosticsEngine::ArgumentValue > PrevArgs, SmallVectorImpl< char > &Output, void *Cookie, ArrayRef< intptr_t > QualTypeVals)
DiagnosticsEngine argument formatting function for diagnostics that involve AST nodes.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:149
bool isExternalFormalLinkage(Linkage L)
Definition Linkage.h:117
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
Definition TypeBase.h:4155
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
Definition TypeBase.h:4158
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5879
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition Decl.cpp:6094
bool isExternallyVisible(Linkage L)
Definition Linkage.h:90
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:438
unsigned long uint64_t
#define false
Definition stdbool.h:26
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Describes how types, statements, expressions, and declarations should be printed.
unsigned Bool
Whether we can use 'bool' rather than '_Bool' (even if the language doesn't actually have 'bool',...
unsigned EntireContentsOfLargeArray
Whether to print the entire array initializers, especially on non-type template parameters,...
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13212
Information from a C++ pragma export, for a symbol that we haven't seen the declaration for yet.
Definition Sema.h:2328