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