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