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