clang 22.0.0git
SemaDeclAttr.cpp
Go to the documentation of this file.
1//===--- SemaDeclAttr.cpp - Declaration Attribute Handling ----------------===//
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 decl-related attribute processing.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/AST/APValue.h"
18#include "clang/AST/Decl.h"
19#include "clang/AST/DeclCXX.h"
20#include "clang/AST/DeclObjC.h"
23#include "clang/AST/Expr.h"
24#include "clang/AST/ExprCXX.h"
25#include "clang/AST/Mangle.h"
26#include "clang/AST/Type.h"
28#include "clang/Basic/Cuda.h"
36#include "clang/Sema/Attr.h"
37#include "clang/Sema/DeclSpec.h"
40#include "clang/Sema/Lookup.h"
42#include "clang/Sema/Scope.h"
44#include "clang/Sema/Sema.h"
46#include "clang/Sema/SemaARM.h"
47#include "clang/Sema/SemaAVR.h"
48#include "clang/Sema/SemaBPF.h"
49#include "clang/Sema/SemaCUDA.h"
50#include "clang/Sema/SemaHLSL.h"
51#include "clang/Sema/SemaM68k.h"
52#include "clang/Sema/SemaMIPS.h"
54#include "clang/Sema/SemaObjC.h"
58#include "clang/Sema/SemaSYCL.h"
60#include "clang/Sema/SemaWasm.h"
61#include "clang/Sema/SemaX86.h"
62#include "llvm/ADT/APSInt.h"
63#include "llvm/ADT/STLExtras.h"
64#include "llvm/ADT/StringExtras.h"
65#include "llvm/Demangle/Demangle.h"
66#include "llvm/IR/DerivedTypes.h"
67#include "llvm/MC/MCSectionMachO.h"
68#include "llvm/Support/Error.h"
69#include "llvm/Support/ErrorHandling.h"
70#include "llvm/Support/MathExtras.h"
71#include "llvm/Support/raw_ostream.h"
72#include "llvm/TargetParser/Triple.h"
73#include <optional>
74
75using namespace clang;
76using namespace sema;
77
79 enum LANG {
83 };
84} // end namespace AttributeLangSupport
85
86static unsigned getNumAttributeArgs(const ParsedAttr &AL) {
87 // FIXME: Include the type in the argument list.
88 return AL.getNumArgs() + AL.hasParsedType();
89}
90
94
95/// Wrapper around checkUInt32Argument, with an extra check to be sure
96/// that the result will fit into a regular (signed) int. All args have the same
97/// purpose as they do in checkUInt32Argument.
98template <typename AttrInfo>
99static bool checkPositiveIntArgument(Sema &S, const AttrInfo &AI, const Expr *Expr,
100 int &Val, unsigned Idx = UINT_MAX) {
101 uint32_t UVal;
102 if (!S.checkUInt32Argument(AI, Expr, UVal, Idx))
103 return false;
104
105 if (UVal > (uint32_t)std::numeric_limits<int>::max()) {
106 llvm::APSInt I(32); // for toString
107 I = UVal;
108 S.Diag(Expr->getExprLoc(), diag::err_ice_too_large)
109 << toString(I, 10, false) << 32 << /* Unsigned */ 0;
110 return false;
111 }
112
113 Val = UVal;
114 return true;
115}
116
118 const Expr *E, StringRef &Str,
119 SourceLocation *ArgLocation) {
120 const auto *Literal = dyn_cast<StringLiteral>(E->IgnoreParenCasts());
121 if (ArgLocation)
122 *ArgLocation = E->getBeginLoc();
123
124 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
125 Diag(E->getBeginLoc(), diag::err_attribute_argument_type)
126 << CI << AANT_ArgumentString;
127 return false;
128 }
129
130 Str = Literal->getString();
131 return true;
132}
133
134bool Sema::checkStringLiteralArgumentAttr(const ParsedAttr &AL, unsigned ArgNum,
135 StringRef &Str,
136 SourceLocation *ArgLocation) {
137 // Look for identifiers. If we have one emit a hint to fix it to a literal.
138 if (AL.isArgIdent(ArgNum)) {
139 IdentifierLoc *Loc = AL.getArgAsIdent(ArgNum);
140 Diag(Loc->getLoc(), diag::err_attribute_argument_type)
141 << AL << AANT_ArgumentString
142 << FixItHint::CreateInsertion(Loc->getLoc(), "\"")
144 Str = Loc->getIdentifierInfo()->getName();
145 if (ArgLocation)
146 *ArgLocation = Loc->getLoc();
147 return true;
148 }
149
150 // Now check for an actual string literal.
151 Expr *ArgExpr = AL.getArgAsExpr(ArgNum);
152 const auto *Literal = dyn_cast<StringLiteral>(ArgExpr->IgnoreParenCasts());
153 if (ArgLocation)
154 *ArgLocation = ArgExpr->getBeginLoc();
155
156 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
157 Diag(ArgExpr->getBeginLoc(), diag::err_attribute_argument_type)
158 << AL << AANT_ArgumentString;
159 return false;
160 }
161 Str = Literal->getString();
162 return checkStringLiteralArgumentAttr(AL, ArgExpr, Str, ArgLocation);
163}
164
165/// Check if the passed-in expression is of type int or bool.
166static bool isIntOrBool(Expr *Exp) {
167 QualType QT = Exp->getType();
168 return QT->isBooleanType() || QT->isIntegerType();
169}
170
171
172// Check to see if the type is a smart pointer of some kind. We assume
173// it's a smart pointer if it defines both operator-> and operator*.
175 auto IsOverloadedOperatorPresent = [&S](const RecordDecl *Record,
179 return !Result.empty();
180 };
181
182 bool foundStarOperator = IsOverloadedOperatorPresent(Record, OO_Star);
183 bool foundArrowOperator = IsOverloadedOperatorPresent(Record, OO_Arrow);
184 if (foundStarOperator && foundArrowOperator)
185 return true;
186
187 const CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(Record);
188 if (!CXXRecord)
189 return false;
190
191 for (const auto &BaseSpecifier : CXXRecord->bases()) {
192 if (!foundStarOperator)
193 foundStarOperator = IsOverloadedOperatorPresent(
194 BaseSpecifier.getType()->getAsRecordDecl(), OO_Star);
195 if (!foundArrowOperator)
196 foundArrowOperator = IsOverloadedOperatorPresent(
197 BaseSpecifier.getType()->getAsRecordDecl(), OO_Arrow);
198 }
199
200 if (foundStarOperator && foundArrowOperator)
201 return true;
202
203 return false;
204}
205
206/// Check if passed in Decl is a pointer type.
207/// Note that this function may produce an error message.
208/// \return true if the Decl is a pointer type; false otherwise
209static bool threadSafetyCheckIsPointer(Sema &S, const Decl *D,
210 const ParsedAttr &AL) {
211 const auto *VD = cast<ValueDecl>(D);
212 QualType QT = VD->getType();
213 if (QT->isAnyPointerType())
214 return true;
215
216 if (const auto *RD = QT->getAsRecordDecl()) {
217 // If it's an incomplete type, it could be a smart pointer; skip it.
218 // (We don't want to force template instantiation if we can avoid it,
219 // since that would alter the order in which templates are instantiated.)
220 if (!RD->isCompleteDefinition())
221 return true;
222
224 return true;
225 }
226
227 S.Diag(AL.getLoc(), diag::warn_thread_attribute_decl_not_pointer) << AL << QT;
228 return false;
229}
230
231/// Checks that the passed in QualType either is of RecordType or points
232/// to RecordType. Returns the relevant RecordType, null if it does not exit.
234 if (const auto *RD = QT->getAsRecordDecl())
235 return RD;
236
237 // Now check if we point to a record.
238 if (const auto *PT = QT->getAsCanonical<PointerType>())
239 return PT->getPointeeType()->getAsRecordDecl();
240
241 return nullptr;
242}
243
244template <typename AttrType>
245static bool checkRecordDeclForAttr(const RecordDecl *RD) {
246 // Check if the record itself has the attribute.
247 if (RD->hasAttr<AttrType>())
248 return true;
249
250 // Else check if any base classes have the attribute.
251 if (const auto *CRD = dyn_cast<CXXRecordDecl>(RD)) {
252 if (!CRD->forallBases([](const CXXRecordDecl *Base) {
253 return !Base->hasAttr<AttrType>();
254 }))
255 return true;
256 }
257 return false;
258}
259
261 const auto *RD = getRecordDecl(Ty);
262
263 if (!RD)
264 return false;
265
266 // Don't check for the capability if the class hasn't been defined yet.
267 if (!RD->isCompleteDefinition())
268 return true;
269
270 // Allow smart pointers to be used as capability objects.
271 // FIXME -- Check the type that the smart pointer points to.
273 return true;
274
276}
277
279 const auto *RD = getRecordDecl(Ty);
280
281 if (!RD)
282 return false;
283
284 // Don't check for the capability if the class hasn't been defined yet.
285 if (!RD->isCompleteDefinition())
286 return true;
287
289}
290
292 const auto *TD = Ty->getAs<TypedefType>();
293 if (!TD)
294 return false;
295
296 TypedefNameDecl *TN = TD->getDecl();
297 if (!TN)
298 return false;
299
300 return TN->hasAttr<CapabilityAttr>();
301}
302
303static bool typeHasCapability(Sema &S, QualType Ty) {
305 return true;
306
308 return true;
309
310 return false;
311}
312
313static bool isCapabilityExpr(Sema &S, const Expr *Ex) {
314 // Capability expressions are simple expressions involving the boolean logic
315 // operators &&, || or !, a simple DeclRefExpr, CastExpr or a ParenExpr. Once
316 // a DeclRefExpr is found, its type should be checked to determine whether it
317 // is a capability or not.
318
319 if (const auto *E = dyn_cast<CastExpr>(Ex))
320 return isCapabilityExpr(S, E->getSubExpr());
321 else if (const auto *E = dyn_cast<ParenExpr>(Ex))
322 return isCapabilityExpr(S, E->getSubExpr());
323 else if (const auto *E = dyn_cast<UnaryOperator>(Ex)) {
324 if (E->getOpcode() == UO_LNot || E->getOpcode() == UO_AddrOf ||
325 E->getOpcode() == UO_Deref)
326 return isCapabilityExpr(S, E->getSubExpr());
327 return false;
328 } else if (const auto *E = dyn_cast<BinaryOperator>(Ex)) {
329 if (E->getOpcode() == BO_LAnd || E->getOpcode() == BO_LOr)
330 return isCapabilityExpr(S, E->getLHS()) &&
331 isCapabilityExpr(S, E->getRHS());
332 return false;
333 }
334
335 return typeHasCapability(S, Ex->getType());
336}
337
338/// Checks that all attribute arguments, starting from Sidx, resolve to
339/// a capability object.
340/// \param Sidx The attribute argument index to start checking with.
341/// \param ParamIdxOk Whether an argument can be indexing into a function
342/// parameter list.
344 const ParsedAttr &AL,
346 unsigned Sidx = 0,
347 bool ParamIdxOk = false) {
348 if (Sidx == AL.getNumArgs()) {
349 // If we don't have any capability arguments, the attribute implicitly
350 // refers to 'this'. So we need to make sure that 'this' exists, i.e. we're
351 // a non-static method, and that the class is a (scoped) capability.
352 const auto *MD = dyn_cast<const CXXMethodDecl>(D);
353 if (MD && !MD->isStatic()) {
354 const CXXRecordDecl *RD = MD->getParent();
355 // FIXME -- need to check this again on template instantiation
358 S.Diag(AL.getLoc(),
359 diag::warn_thread_attribute_not_on_capability_member)
360 << AL << MD->getParent();
361 } else {
362 S.Diag(AL.getLoc(), diag::warn_thread_attribute_not_on_non_static_member)
363 << AL;
364 }
365 }
366
367 for (unsigned Idx = Sidx; Idx < AL.getNumArgs(); ++Idx) {
368 Expr *ArgExp = AL.getArgAsExpr(Idx);
369
370 if (ArgExp->isTypeDependent()) {
371 // FIXME -- need to check this again on template instantiation
372 Args.push_back(ArgExp);
373 continue;
374 }
375
376 if (const auto *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
377 if (StrLit->getLength() == 0 ||
378 (StrLit->isOrdinary() && StrLit->getString() == "*")) {
379 // Pass empty strings to the analyzer without warnings.
380 // Treat "*" as the universal lock.
381 Args.push_back(ArgExp);
382 continue;
383 }
384
385 // We allow constant strings to be used as a placeholder for expressions
386 // that are not valid C++ syntax, but warn that they are ignored.
387 S.Diag(AL.getLoc(), diag::warn_thread_attribute_ignored) << AL;
388 Args.push_back(ArgExp);
389 continue;
390 }
391
392 QualType ArgTy = ArgExp->getType();
393
394 // A pointer to member expression of the form &MyClass::mu is treated
395 // specially -- we need to look at the type of the member.
396 if (const auto *UOp = dyn_cast<UnaryOperator>(ArgExp))
397 if (UOp->getOpcode() == UO_AddrOf)
398 if (const auto *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
399 if (DRE->getDecl()->isCXXInstanceMember())
400 ArgTy = DRE->getDecl()->getType();
401
402 // First see if we can just cast to record type, or pointer to record type.
403 const auto *RD = getRecordDecl(ArgTy);
404
405 // Now check if we index into a record type function param.
406 if (!RD && ParamIdxOk) {
407 const auto *FD = dyn_cast<FunctionDecl>(D);
408 const auto *IL = dyn_cast<IntegerLiteral>(ArgExp);
409 if(FD && IL) {
410 unsigned int NumParams = FD->getNumParams();
411 llvm::APInt ArgValue = IL->getValue();
412 uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
413 uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
414 if (!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
415 S.Diag(AL.getLoc(),
416 diag::err_attribute_argument_out_of_bounds_extra_info)
417 << AL << Idx + 1 << NumParams;
418 continue;
419 }
420 ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
421 }
422 }
423
424 // If the type does not have a capability, see if the components of the
425 // expression have capabilities. This allows for writing C code where the
426 // capability may be on the type, and the expression is a capability
427 // boolean logic expression. Eg) requires_capability(A || B && !C)
428 if (!typeHasCapability(S, ArgTy) && !isCapabilityExpr(S, ArgExp))
429 S.Diag(AL.getLoc(), diag::warn_thread_attribute_argument_not_lockable)
430 << AL << ArgTy;
431
432 Args.push_back(ArgExp);
433 }
434}
435
437 const ParmVarDecl *ParamDecl,
438 const ParsedAttr &AL) {
439 QualType ParamType = ParamDecl->getType();
440 if (const auto *RefType = ParamType->getAs<ReferenceType>();
441 RefType &&
442 checkRecordTypeForScopedCapability(S, RefType->getPointeeType()))
443 return true;
444 S.Diag(AL.getLoc(), diag::warn_thread_attribute_not_on_scoped_lockable_param)
445 << AL;
446 return false;
447}
448
449//===----------------------------------------------------------------------===//
450// Attribute Implementations
451//===----------------------------------------------------------------------===//
452
453static void handlePtGuardedVarAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
454 if (!threadSafetyCheckIsPointer(S, D, AL))
455 return;
456
457 D->addAttr(::new (S.Context) PtGuardedVarAttr(S.Context, AL));
458}
459
460static bool checkGuardedByAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL,
461 Expr *&Arg) {
463 // check that all arguments are lockable objects
464 checkAttrArgsAreCapabilityObjs(S, D, AL, Args);
465 unsigned Size = Args.size();
466 if (Size != 1)
467 return false;
468
469 Arg = Args[0];
470
471 return true;
472}
473
474static void handleGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
475 Expr *Arg = nullptr;
476 if (!checkGuardedByAttrCommon(S, D, AL, Arg))
477 return;
478
479 D->addAttr(::new (S.Context) GuardedByAttr(S.Context, AL, Arg));
480}
481
482static void handlePtGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
483 Expr *Arg = nullptr;
484 if (!checkGuardedByAttrCommon(S, D, AL, Arg))
485 return;
486
487 if (!threadSafetyCheckIsPointer(S, D, AL))
488 return;
489
490 D->addAttr(::new (S.Context) PtGuardedByAttr(S.Context, AL, Arg));
491}
492
493static bool checkAcquireOrderAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL,
495 if (!AL.checkAtLeastNumArgs(S, 1))
496 return false;
497
498 // Check that this attribute only applies to lockable types.
499 QualType QT = cast<ValueDecl>(D)->getType();
500 if (!QT->isDependentType() && !typeHasCapability(S, QT)) {
501 S.Diag(AL.getLoc(), diag::warn_thread_attribute_decl_not_lockable) << AL;
502 return false;
503 }
504
505 // Check that all arguments are lockable objects.
506 checkAttrArgsAreCapabilityObjs(S, D, AL, Args);
507 if (Args.empty())
508 return false;
509
510 return true;
511}
512
513static void handleAcquiredAfterAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
515 if (!checkAcquireOrderAttrCommon(S, D, AL, Args))
516 return;
517
518 Expr **StartArg = &Args[0];
519 D->addAttr(::new (S.Context)
520 AcquiredAfterAttr(S.Context, AL, StartArg, Args.size()));
521}
522
523static void handleAcquiredBeforeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
525 if (!checkAcquireOrderAttrCommon(S, D, AL, Args))
526 return;
527
528 Expr **StartArg = &Args[0];
529 D->addAttr(::new (S.Context)
530 AcquiredBeforeAttr(S.Context, AL, StartArg, Args.size()));
531}
532
533static bool checkLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL,
535 // zero or more arguments ok
536 // check that all arguments are lockable objects
537 checkAttrArgsAreCapabilityObjs(S, D, AL, Args, 0, /*ParamIdxOk=*/true);
538
539 return true;
540}
541
542/// Checks to be sure that the given parameter number is in bounds, and
543/// is an integral type. Will emit appropriate diagnostics if this returns
544/// false.
545///
546/// AttrArgNo is used to actually retrieve the argument, so it's base-0.
547template <typename AttrInfo>
548static bool checkParamIsIntegerType(Sema &S, const Decl *D, const AttrInfo &AI,
549 unsigned AttrArgNo) {
550 assert(AI.isArgExpr(AttrArgNo) && "Expected expression argument");
551 Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
552 ParamIdx Idx;
553 if (!S.checkFunctionOrMethodParameterIndex(D, AI, AttrArgNo + 1, AttrArg,
554 Idx))
555 return false;
556
558 if (!ParamTy->isIntegerType() && !ParamTy->isCharType()) {
559 SourceLocation SrcLoc = AttrArg->getBeginLoc();
560 S.Diag(SrcLoc, diag::err_attribute_integers_only)
562 return false;
563 }
564 return true;
565}
566
567static void handleAllocSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
568 if (!AL.checkAtLeastNumArgs(S, 1) || !AL.checkAtMostNumArgs(S, 2))
569 return;
570
572
574 if (!RetTy->isPointerType()) {
575 S.Diag(AL.getLoc(), diag::warn_attribute_return_pointers_only) << AL;
576 return;
577 }
578
579 const Expr *SizeExpr = AL.getArgAsExpr(0);
580 int SizeArgNoVal;
581 // Parameter indices are 1-indexed, hence Index=1
582 if (!checkPositiveIntArgument(S, AL, SizeExpr, SizeArgNoVal, /*Idx=*/1))
583 return;
584 if (!checkParamIsIntegerType(S, D, AL, /*AttrArgNo=*/0))
585 return;
586 ParamIdx SizeArgNo(SizeArgNoVal, D);
587
588 ParamIdx NumberArgNo;
589 if (AL.getNumArgs() == 2) {
590 const Expr *NumberExpr = AL.getArgAsExpr(1);
591 int Val;
592 // Parameter indices are 1-based, hence Index=2
593 if (!checkPositiveIntArgument(S, AL, NumberExpr, Val, /*Idx=*/2))
594 return;
595 if (!checkParamIsIntegerType(S, D, AL, /*AttrArgNo=*/1))
596 return;
597 NumberArgNo = ParamIdx(Val, D);
598 }
599
600 D->addAttr(::new (S.Context)
601 AllocSizeAttr(S.Context, AL, SizeArgNo, NumberArgNo));
602}
603
604static bool checkTryLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL,
606 if (!AL.checkAtLeastNumArgs(S, 1))
607 return false;
608
609 if (!isIntOrBool(AL.getArgAsExpr(0))) {
610 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
611 << AL << 1 << AANT_ArgumentIntOrBool;
612 return false;
613 }
614
615 // check that all arguments are lockable objects
616 checkAttrArgsAreCapabilityObjs(S, D, AL, Args, 1);
617
618 return true;
619}
620
621static void handleLockReturnedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
622 // check that the argument is lockable object
624 checkAttrArgsAreCapabilityObjs(S, D, AL, Args);
625 unsigned Size = Args.size();
626 if (Size == 0)
627 return;
628
629 D->addAttr(::new (S.Context) LockReturnedAttr(S.Context, AL, Args[0]));
630}
631
632static void handleLocksExcludedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
633 if (const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
634 ParmDecl && !checkFunParamsAreScopedLockable(S, ParmDecl, AL))
635 return;
636
637 if (!AL.checkAtLeastNumArgs(S, 1))
638 return;
639
640 // check that all arguments are lockable objects
642 checkAttrArgsAreCapabilityObjs(S, D, AL, Args);
643 unsigned Size = Args.size();
644 if (Size == 0)
645 return;
646 Expr **StartArg = &Args[0];
647
648 D->addAttr(::new (S.Context)
649 LocksExcludedAttr(S.Context, AL, StartArg, Size));
650}
651
652static bool checkFunctionConditionAttr(Sema &S, Decl *D, const ParsedAttr &AL,
653 Expr *&Cond, StringRef &Msg) {
654 Cond = AL.getArgAsExpr(0);
655 if (!Cond->isTypeDependent()) {
657 if (Converted.isInvalid())
658 return false;
659 Cond = Converted.get();
660 }
661
662 if (!S.checkStringLiteralArgumentAttr(AL, 1, Msg))
663 return false;
664
665 if (Msg.empty())
666 Msg = "<no message provided>";
667
669 if (isa<FunctionDecl>(D) && !Cond->isValueDependent() &&
671 Diags)) {
672 S.Diag(AL.getLoc(), diag::err_attr_cond_never_constant_expr) << AL;
673 for (const PartialDiagnosticAt &PDiag : Diags)
674 S.Diag(PDiag.first, PDiag.second);
675 return false;
676 }
677 return true;
678}
679
680static void handleEnableIfAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
681 S.Diag(AL.getLoc(), diag::ext_clang_enable_if);
682
683 Expr *Cond;
684 StringRef Msg;
685 if (checkFunctionConditionAttr(S, D, AL, Cond, Msg))
686 D->addAttr(::new (S.Context) EnableIfAttr(S.Context, AL, Cond, Msg));
687}
688
689static void handleErrorAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
690 StringRef NewUserDiagnostic;
691 if (!S.checkStringLiteralArgumentAttr(AL, 0, NewUserDiagnostic))
692 return;
693 if (ErrorAttr *EA = S.mergeErrorAttr(D, AL, NewUserDiagnostic))
694 D->addAttr(EA);
695}
696
698 const ParsedAttr &AL) {
699 const auto *PD = isa<CXXRecordDecl>(D)
702 if (const auto *RD = dyn_cast<CXXRecordDecl>(PD); RD && RD->isLocalClass()) {
703 S.Diag(AL.getLoc(),
704 diag::warn_attribute_exclude_from_explicit_instantiation_local_class)
705 << AL << /*IsMember=*/!isa<CXXRecordDecl>(D);
706 return;
707 }
708 D->addAttr(::new (S.Context)
709 ExcludeFromExplicitInstantiationAttr(S.Context, AL));
710}
711
712namespace {
713/// Determines if a given Expr references any of the given function's
714/// ParmVarDecls, or the function's implicit `this` parameter (if applicable).
715class ArgumentDependenceChecker : public DynamicRecursiveASTVisitor {
716#ifndef NDEBUG
717 const CXXRecordDecl *ClassType;
718#endif
719 llvm::SmallPtrSet<const ParmVarDecl *, 16> Parms;
720 bool Result;
721
722public:
723 ArgumentDependenceChecker(const FunctionDecl *FD) {
724#ifndef NDEBUG
725 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
726 ClassType = MD->getParent();
727 else
728 ClassType = nullptr;
729#endif
730 Parms.insert(FD->param_begin(), FD->param_end());
731 }
732
733 bool referencesArgs(Expr *E) {
734 Result = false;
735 TraverseStmt(E);
736 return Result;
737 }
738
739 bool VisitCXXThisExpr(CXXThisExpr *E) override {
740 assert(E->getType()->getPointeeCXXRecordDecl() == ClassType &&
741 "`this` doesn't refer to the enclosing class?");
742 Result = true;
743 return false;
744 }
745
746 bool VisitDeclRefExpr(DeclRefExpr *DRE) override {
747 if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
748 if (Parms.count(PVD)) {
749 Result = true;
750 return false;
751 }
752 return true;
753 }
754};
755}
756
758 const ParsedAttr &AL) {
759 const auto *DeclFD = cast<FunctionDecl>(D);
760
761 if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclFD))
762 if (!MethodDecl->isStatic()) {
763 S.Diag(AL.getLoc(), diag::err_attribute_no_member_function) << AL;
764 return;
765 }
766
767 auto DiagnoseType = [&](unsigned Index, AttributeArgumentNType T) {
768 SourceLocation Loc = [&]() {
769 auto Union = AL.getArg(Index - 1);
770 if (auto *E = dyn_cast<Expr *>(Union))
771 return E->getBeginLoc();
772 return cast<IdentifierLoc *>(Union)->getLoc();
773 }();
774
775 S.Diag(Loc, diag::err_attribute_argument_n_type) << AL << Index << T;
776 };
777
778 FunctionDecl *AttrFD = [&]() -> FunctionDecl * {
779 if (!AL.isArgExpr(0))
780 return nullptr;
781 auto *F = dyn_cast_if_present<DeclRefExpr>(AL.getArgAsExpr(0));
782 if (!F)
783 return nullptr;
784 return dyn_cast_if_present<FunctionDecl>(F->getFoundDecl());
785 }();
786
787 if (!AttrFD || !AttrFD->getBuiltinID(true)) {
788 DiagnoseType(1, AANT_ArgumentBuiltinFunction);
789 return;
790 }
791
792 if (AttrFD->getNumParams() != AL.getNumArgs() - 1) {
793 S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments_for)
794 << AL << AttrFD << AttrFD->getNumParams();
795 return;
796 }
797
799
800 for (unsigned I = 1; I < AL.getNumArgs(); ++I) {
801 if (!AL.isArgExpr(I)) {
802 DiagnoseType(I + 1, AANT_ArgumentIntegerConstant);
803 return;
804 }
805
806 const Expr *IndexExpr = AL.getArgAsExpr(I);
807 uint32_t Index;
808
809 if (!S.checkUInt32Argument(AL, IndexExpr, Index, I + 1, false))
810 return;
811
812 if (Index > DeclFD->getNumParams()) {
813 S.Diag(AL.getLoc(), diag::err_attribute_bounds_for_function)
814 << AL << Index << DeclFD << DeclFD->getNumParams();
815 return;
816 }
817
818 QualType T1 = AttrFD->getParamDecl(I - 1)->getType();
819 QualType T2 = DeclFD->getParamDecl(Index - 1)->getType();
820
823 S.Diag(IndexExpr->getBeginLoc(), diag::err_attribute_parameter_types)
824 << AL << Index << DeclFD << T2 << I << AttrFD << T1;
825 return;
826 }
827
828 Indices.push_back(Index - 1);
829 }
830
831 D->addAttr(::new (S.Context) DiagnoseAsBuiltinAttr(
832 S.Context, AL, AttrFD, Indices.data(), Indices.size()));
833}
834
835static void handleDiagnoseIfAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
836 S.Diag(AL.getLoc(), diag::ext_clang_diagnose_if);
837
838 Expr *Cond;
839 StringRef Msg;
840 if (!checkFunctionConditionAttr(S, D, AL, Cond, Msg))
841 return;
842
843 StringRef DefaultSevStr;
844 if (!S.checkStringLiteralArgumentAttr(AL, 2, DefaultSevStr))
845 return;
846
847 DiagnoseIfAttr::DefaultSeverity DefaultSev;
848 if (!DiagnoseIfAttr::ConvertStrToDefaultSeverity(DefaultSevStr, DefaultSev)) {
849 S.Diag(AL.getArgAsExpr(2)->getBeginLoc(),
850 diag::err_diagnose_if_invalid_diagnostic_type);
851 return;
852 }
853
854 StringRef WarningGroup;
855 if (AL.getNumArgs() > 3) {
856 if (!S.checkStringLiteralArgumentAttr(AL, 3, WarningGroup))
857 return;
858 if (WarningGroup.empty() ||
859 !S.getDiagnostics().getDiagnosticIDs()->getGroupForWarningOption(
860 WarningGroup)) {
861 S.Diag(AL.getArgAsExpr(3)->getBeginLoc(),
862 diag::err_diagnose_if_unknown_warning)
863 << WarningGroup;
864 return;
865 }
866 }
867
868 bool ArgDependent = false;
869 if (const auto *FD = dyn_cast<FunctionDecl>(D))
870 ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(Cond);
871 D->addAttr(::new (S.Context) DiagnoseIfAttr(
872 S.Context, AL, Cond, Msg, DefaultSev, WarningGroup, ArgDependent,
873 cast<NamedDecl>(D)));
874}
875
877 const ParsedAttr &Attrs) {
878 if (hasDeclarator(D))
879 return;
880
881 if (!isa<ObjCMethodDecl>(D)) {
882 S.Diag(Attrs.getLoc(), diag::warn_attribute_wrong_decl_type)
883 << Attrs << Attrs.isRegularKeywordAttribute()
885 return;
886 }
887
888 D->addAttr(::new (S.Context) CFIUncheckedCalleeAttr(S.Context, Attrs));
889}
890
891static void handleNoBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
892 static constexpr const StringRef kWildcard = "*";
893
895 bool HasWildcard = false;
896
897 const auto AddBuiltinName = [&Names, &HasWildcard](StringRef Name) {
898 if (Name == kWildcard)
899 HasWildcard = true;
900 Names.push_back(Name);
901 };
902
903 // Add previously defined attributes.
904 if (const auto *NBA = D->getAttr<NoBuiltinAttr>())
905 for (StringRef BuiltinName : NBA->builtinNames())
906 AddBuiltinName(BuiltinName);
907
908 // Add current attributes.
909 if (AL.getNumArgs() == 0)
910 AddBuiltinName(kWildcard);
911 else
912 for (unsigned I = 0, E = AL.getNumArgs(); I != E; ++I) {
913 StringRef BuiltinName;
914 SourceLocation LiteralLoc;
915 if (!S.checkStringLiteralArgumentAttr(AL, I, BuiltinName, &LiteralLoc))
916 return;
917
918 if (Builtin::Context::isBuiltinFunc(BuiltinName))
919 AddBuiltinName(BuiltinName);
920 else
921 S.Diag(LiteralLoc, diag::warn_attribute_no_builtin_invalid_builtin_name)
922 << BuiltinName << AL;
923 }
924
925 // Repeating the same attribute is fine.
926 llvm::sort(Names);
927 Names.erase(llvm::unique(Names), Names.end());
928
929 // Empty no_builtin must be on its own.
930 if (HasWildcard && Names.size() > 1)
931 S.Diag(D->getLocation(),
932 diag::err_attribute_no_builtin_wildcard_or_builtin_name)
933 << AL;
934
935 if (D->hasAttr<NoBuiltinAttr>())
936 D->dropAttr<NoBuiltinAttr>();
937 D->addAttr(::new (S.Context)
938 NoBuiltinAttr(S.Context, AL, Names.data(), Names.size()));
939}
940
941static void handlePassObjectSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
942 if (D->hasAttr<PassObjectSizeAttr>()) {
943 S.Diag(D->getBeginLoc(), diag::err_attribute_only_once_per_parameter) << AL;
944 return;
945 }
946
947 Expr *E = AL.getArgAsExpr(0);
948 uint32_t Type;
949 if (!S.checkUInt32Argument(AL, E, Type, /*Idx=*/1))
950 return;
951
952 // pass_object_size's argument is passed in as the second argument of
953 // __builtin_object_size. So, it has the same constraints as that second
954 // argument; namely, it must be in the range [0, 3].
955 if (Type > 3) {
956 S.Diag(E->getBeginLoc(), diag::err_attribute_argument_out_of_range)
957 << AL << 0 << 3 << E->getSourceRange();
958 return;
959 }
960
961 // pass_object_size is only supported on constant pointer parameters; as a
962 // kindness to users, we allow the parameter to be non-const for declarations.
963 // At this point, we have no clue if `D` belongs to a function declaration or
964 // definition, so we defer the constness check until later.
965 if (!cast<ParmVarDecl>(D)->getType()->isPointerType()) {
966 S.Diag(D->getBeginLoc(), diag::err_attribute_pointers_only) << AL << 1;
967 return;
968 }
969
970 D->addAttr(::new (S.Context) PassObjectSizeAttr(S.Context, AL, (int)Type));
971}
972
973static void handleConsumableAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
974 ConsumableAttr::ConsumedState DefaultState;
975
976 if (AL.isArgIdent(0)) {
977 IdentifierLoc *IL = AL.getArgAsIdent(0);
978 if (!ConsumableAttr::ConvertStrToConsumedState(
979 IL->getIdentifierInfo()->getName(), DefaultState)) {
980 S.Diag(IL->getLoc(), diag::warn_attribute_type_not_supported)
981 << AL << IL->getIdentifierInfo();
982 return;
983 }
984 } else {
985 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
987 return;
988 }
989
990 D->addAttr(::new (S.Context) ConsumableAttr(S.Context, AL, DefaultState));
991}
992
994 const ParsedAttr &AL) {
996
997 if (const CXXRecordDecl *RD = ThisType->getAsCXXRecordDecl()) {
998 if (!RD->hasAttr<ConsumableAttr>()) {
999 S.Diag(AL.getLoc(), diag::warn_attr_on_unconsumable_class) << RD;
1000
1001 return false;
1002 }
1003 }
1004
1005 return true;
1006}
1007
1008static void handleCallableWhenAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1009 if (!AL.checkAtLeastNumArgs(S, 1))
1010 return;
1011
1013 return;
1014
1016 for (unsigned ArgIndex = 0; ArgIndex < AL.getNumArgs(); ++ArgIndex) {
1017 CallableWhenAttr::ConsumedState CallableState;
1018
1019 StringRef StateString;
1020 SourceLocation Loc;
1021 if (AL.isArgIdent(ArgIndex)) {
1022 IdentifierLoc *Ident = AL.getArgAsIdent(ArgIndex);
1023 StateString = Ident->getIdentifierInfo()->getName();
1024 Loc = Ident->getLoc();
1025 } else {
1026 if (!S.checkStringLiteralArgumentAttr(AL, ArgIndex, StateString, &Loc))
1027 return;
1028 }
1029
1030 if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
1031 CallableState)) {
1032 S.Diag(Loc, diag::warn_attribute_type_not_supported) << AL << StateString;
1033 return;
1034 }
1035
1036 States.push_back(CallableState);
1037 }
1038
1039 D->addAttr(::new (S.Context)
1040 CallableWhenAttr(S.Context, AL, States.data(), States.size()));
1041}
1042
1043static void handleParamTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1044 ParamTypestateAttr::ConsumedState ParamState;
1045
1046 if (AL.isArgIdent(0)) {
1047 IdentifierLoc *Ident = AL.getArgAsIdent(0);
1048 StringRef StateString = Ident->getIdentifierInfo()->getName();
1049
1050 if (!ParamTypestateAttr::ConvertStrToConsumedState(StateString,
1051 ParamState)) {
1052 S.Diag(Ident->getLoc(), diag::warn_attribute_type_not_supported)
1053 << AL << StateString;
1054 return;
1055 }
1056 } else {
1057 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
1058 << AL << AANT_ArgumentIdentifier;
1059 return;
1060 }
1061
1062 // FIXME: This check is currently being done in the analysis. It can be
1063 // enabled here only after the parser propagates attributes at
1064 // template specialization definition, not declaration.
1065 //QualType ReturnType = cast<ParmVarDecl>(D)->getType();
1066 //const CXXRecordDecl *RD = ReturnType->getAsCXXRecordDecl();
1067 //
1068 //if (!RD || !RD->hasAttr<ConsumableAttr>()) {
1069 // S.Diag(AL.getLoc(), diag::warn_return_state_for_unconsumable_type) <<
1070 // ReturnType.getAsString();
1071 // return;
1072 //}
1073
1074 D->addAttr(::new (S.Context) ParamTypestateAttr(S.Context, AL, ParamState));
1075}
1076
1077static void handleReturnTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1078 ReturnTypestateAttr::ConsumedState ReturnState;
1079
1080 if (AL.isArgIdent(0)) {
1081 IdentifierLoc *IL = AL.getArgAsIdent(0);
1082 if (!ReturnTypestateAttr::ConvertStrToConsumedState(
1083 IL->getIdentifierInfo()->getName(), ReturnState)) {
1084 S.Diag(IL->getLoc(), diag::warn_attribute_type_not_supported)
1085 << AL << IL->getIdentifierInfo();
1086 return;
1087 }
1088 } else {
1089 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
1090 << AL << AANT_ArgumentIdentifier;
1091 return;
1092 }
1093
1094 // FIXME: This check is currently being done in the analysis. It can be
1095 // enabled here only after the parser propagates attributes at
1096 // template specialization definition, not declaration.
1097 // QualType ReturnType;
1098 //
1099 // if (const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D)) {
1100 // ReturnType = Param->getType();
1101 //
1102 //} else if (const CXXConstructorDecl *Constructor =
1103 // dyn_cast<CXXConstructorDecl>(D)) {
1104 // ReturnType = Constructor->getFunctionObjectParameterType();
1105 //
1106 //} else {
1107 //
1108 // ReturnType = cast<FunctionDecl>(D)->getCallResultType();
1109 //}
1110 //
1111 // const CXXRecordDecl *RD = ReturnType->getAsCXXRecordDecl();
1112 //
1113 // if (!RD || !RD->hasAttr<ConsumableAttr>()) {
1114 // S.Diag(Attr.getLoc(), diag::warn_return_state_for_unconsumable_type) <<
1115 // ReturnType.getAsString();
1116 // return;
1117 //}
1118
1119 D->addAttr(::new (S.Context) ReturnTypestateAttr(S.Context, AL, ReturnState));
1120}
1121
1122static void handleSetTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1124 return;
1125
1126 SetTypestateAttr::ConsumedState NewState;
1127 if (AL.isArgIdent(0)) {
1128 IdentifierLoc *Ident = AL.getArgAsIdent(0);
1129 StringRef Param = Ident->getIdentifierInfo()->getName();
1130 if (!SetTypestateAttr::ConvertStrToConsumedState(Param, NewState)) {
1131 S.Diag(Ident->getLoc(), diag::warn_attribute_type_not_supported)
1132 << AL << Param;
1133 return;
1134 }
1135 } else {
1136 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
1137 << AL << AANT_ArgumentIdentifier;
1138 return;
1139 }
1140
1141 D->addAttr(::new (S.Context) SetTypestateAttr(S.Context, AL, NewState));
1142}
1143
1144static void handleTestTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1146 return;
1147
1148 TestTypestateAttr::ConsumedState TestState;
1149 if (AL.isArgIdent(0)) {
1150 IdentifierLoc *Ident = AL.getArgAsIdent(0);
1151 StringRef Param = Ident->getIdentifierInfo()->getName();
1152 if (!TestTypestateAttr::ConvertStrToConsumedState(Param, TestState)) {
1153 S.Diag(Ident->getLoc(), diag::warn_attribute_type_not_supported)
1154 << AL << Param;
1155 return;
1156 }
1157 } else {
1158 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
1159 << AL << AANT_ArgumentIdentifier;
1160 return;
1161 }
1162
1163 D->addAttr(::new (S.Context) TestTypestateAttr(S.Context, AL, TestState));
1164}
1165
1166static void handleExtVectorTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1167 // Remember this typedef decl, we will need it later for diagnostics.
1168 if (isa<TypedefNameDecl>(D))
1170}
1171
1172static void handlePackedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1173 if (auto *TD = dyn_cast<TagDecl>(D))
1174 TD->addAttr(::new (S.Context) PackedAttr(S.Context, AL));
1175 else if (auto *FD = dyn_cast<FieldDecl>(D)) {
1176 bool BitfieldByteAligned = (!FD->getType()->isDependentType() &&
1177 !FD->getType()->isIncompleteType() &&
1178 FD->isBitField() &&
1179 S.Context.getTypeAlign(FD->getType()) <= 8);
1180
1181 if (S.getASTContext().getTargetInfo().getTriple().isPS()) {
1182 if (BitfieldByteAligned)
1183 // The PS4/PS5 targets need to maintain ABI backwards compatibility.
1184 S.Diag(AL.getLoc(), diag::warn_attribute_ignored_for_field_of_type)
1185 << AL << FD->getType();
1186 else
1187 FD->addAttr(::new (S.Context) PackedAttr(S.Context, AL));
1188 } else {
1189 // Report warning about changed offset in the newer compiler versions.
1190 if (BitfieldByteAligned)
1191 S.Diag(AL.getLoc(), diag::warn_attribute_packed_for_bitfield);
1192
1193 FD->addAttr(::new (S.Context) PackedAttr(S.Context, AL));
1194 }
1195
1196 } else
1197 S.Diag(AL.getLoc(), diag::warn_attribute_ignored) << AL;
1198}
1199
1200static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL) {
1201 auto *RD = cast<CXXRecordDecl>(D);
1202 ClassTemplateDecl *CTD = RD->getDescribedClassTemplate();
1203 assert(CTD && "attribute does not appertain to this declaration");
1204
1205 ParsedType PT = AL.getTypeArg();
1206 TypeSourceInfo *TSI = nullptr;
1207 QualType T = S.GetTypeFromParser(PT, &TSI);
1208 if (!TSI)
1210
1211 if (!T.hasQualifiers() && T->isTypedefNameType()) {
1212 // Find the template name, if this type names a template specialization.
1213 const TemplateDecl *Template = nullptr;
1214 if (const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>(
1215 T->getAsCXXRecordDecl())) {
1216 Template = CTSD->getSpecializedTemplate();
1217 } else if (const auto *TST = T->getAs<TemplateSpecializationType>()) {
1218 while (TST && TST->isTypeAlias())
1219 TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1220 if (TST)
1221 Template = TST->getTemplateName().getAsTemplateDecl();
1222 }
1223
1224 if (Template && declaresSameEntity(Template, CTD)) {
1225 D->addAttr(::new (S.Context) PreferredNameAttr(S.Context, AL, TSI));
1226 return;
1227 }
1228 }
1229
1230 S.Diag(AL.getLoc(), diag::err_attribute_not_typedef_for_specialization)
1231 << T << AL << CTD;
1232 if (const auto *TT = T->getAs<TypedefType>())
1233 S.Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at)
1234 << TT->getDecl();
1235}
1236
1237static void handleNoSpecializations(Sema &S, Decl *D, const ParsedAttr &AL) {
1238 StringRef Message;
1239 if (AL.getNumArgs() != 0)
1240 S.checkStringLiteralArgumentAttr(AL, 0, Message);
1242 NoSpecializationsAttr::Create(S.Context, Message, AL));
1243}
1244
1246 if (T->isDependentType())
1247 return true;
1248 if (RefOkay) {
1249 if (T->isReferenceType())
1250 return true;
1251 } else {
1252 T = T.getNonReferenceType();
1253 }
1254
1255 // The nonnull attribute, and other similar attributes, can be applied to a
1256 // transparent union that contains a pointer type.
1257 if (const RecordType *UT = T->getAsUnionType()) {
1258 RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
1259 if (UD->hasAttr<TransparentUnionAttr>()) {
1260 for (const auto *I : UD->fields()) {
1261 QualType QT = I->getType();
1262 if (QT->isAnyPointerType() || QT->isBlockPointerType())
1263 return true;
1264 }
1265 }
1266 }
1267
1268 return T->isAnyPointerType() || T->isBlockPointerType();
1269}
1270
1271static bool attrNonNullArgCheck(Sema &S, QualType T, const ParsedAttr &AL,
1272 SourceRange AttrParmRange,
1273 SourceRange TypeRange,
1274 bool isReturnValue = false) {
1275 if (!S.isValidPointerAttrType(T)) {
1276 if (isReturnValue)
1277 S.Diag(AL.getLoc(), diag::warn_attribute_return_pointers_only)
1278 << AL << AttrParmRange << TypeRange;
1279 else
1280 S.Diag(AL.getLoc(), diag::warn_attribute_pointers_only)
1281 << AL << AttrParmRange << TypeRange << 0;
1282 return false;
1283 }
1284 return true;
1285}
1286
1287static void handleNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1288 SmallVector<ParamIdx, 8> NonNullArgs;
1289 for (unsigned I = 0; I < AL.getNumArgs(); ++I) {
1290 Expr *Ex = AL.getArgAsExpr(I);
1291 ParamIdx Idx;
1293 D, AL, I + 1, Ex, Idx,
1294 /*CanIndexImplicitThis=*/false,
1295 /*CanIndexVariadicArguments=*/true))
1296 return;
1297
1298 // Is the function argument a pointer type?
1302 Ex->getSourceRange(),
1304 continue;
1305
1306 NonNullArgs.push_back(Idx);
1307 }
1308
1309 // If no arguments were specified to __attribute__((nonnull)) then all pointer
1310 // arguments have a nonnull attribute; warn if there aren't any. Skip this
1311 // check if the attribute came from a macro expansion or a template
1312 // instantiation.
1313 if (NonNullArgs.empty() && AL.getLoc().isFileID() &&
1315 bool AnyPointers = isFunctionOrMethodVariadic(D);
1316 for (unsigned I = 0, E = getFunctionOrMethodNumParams(D);
1317 I != E && !AnyPointers; ++I) {
1320 AnyPointers = true;
1321 }
1322
1323 if (!AnyPointers)
1324 S.Diag(AL.getLoc(), diag::warn_attribute_nonnull_no_pointers);
1325 }
1326
1327 ParamIdx *Start = NonNullArgs.data();
1328 unsigned Size = NonNullArgs.size();
1329 llvm::array_pod_sort(Start, Start + Size);
1330 D->addAttr(::new (S.Context) NonNullAttr(S.Context, AL, Start, Size));
1331}
1332
1334 const ParsedAttr &AL) {
1335 if (AL.getNumArgs() > 0) {
1336 if (D->getFunctionType()) {
1337 handleNonNullAttr(S, D, AL);
1338 } else {
1339 S.Diag(AL.getLoc(), diag::warn_attribute_nonnull_parm_no_args)
1340 << D->getSourceRange();
1341 }
1342 return;
1343 }
1344
1345 // Is the argument a pointer type?
1346 if (!attrNonNullArgCheck(S, D->getType(), AL, SourceRange(),
1347 D->getSourceRange()))
1348 return;
1349
1350 D->addAttr(::new (S.Context) NonNullAttr(S.Context, AL, nullptr, 0));
1351}
1352
1353static void handleReturnsNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1356 if (!attrNonNullArgCheck(S, ResultType, AL, SourceRange(), SR,
1357 /* isReturnValue */ true))
1358 return;
1359
1360 D->addAttr(::new (S.Context) ReturnsNonNullAttr(S.Context, AL));
1361}
1362
1363static void handleNoEscapeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1364 if (D->isInvalidDecl())
1365 return;
1366
1367 // noescape only applies to pointer types.
1368 QualType T = cast<ParmVarDecl>(D)->getType();
1369 if (!S.isValidPointerAttrType(T, /* RefOkay */ true)) {
1370 S.Diag(AL.getLoc(), diag::warn_attribute_pointers_only)
1371 << AL << AL.getRange() << 0;
1372 return;
1373 }
1374
1375 D->addAttr(::new (S.Context) NoEscapeAttr(S.Context, AL));
1376}
1377
1378static void handleAssumeAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1379 Expr *E = AL.getArgAsExpr(0),
1380 *OE = AL.getNumArgs() > 1 ? AL.getArgAsExpr(1) : nullptr;
1381 S.AddAssumeAlignedAttr(D, AL, E, OE);
1382}
1383
1384static void handleAllocAlignAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1385 S.AddAllocAlignAttr(D, AL, AL.getArgAsExpr(0));
1386}
1387
1389 Expr *OE) {
1392 SourceLocation AttrLoc = CI.getLoc();
1393
1394 if (!isValidPointerAttrType(ResultType, /* RefOkay */ true)) {
1395 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1396 << CI << CI.getRange() << SR;
1397 return;
1398 }
1399
1400 if (!E->isValueDependent()) {
1401 std::optional<llvm::APSInt> I = llvm::APSInt(64);
1402 if (!(I = E->getIntegerConstantExpr(Context))) {
1403 if (OE)
1404 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1405 << CI << 1 << AANT_ArgumentIntegerConstant << E->getSourceRange();
1406 else
1407 Diag(AttrLoc, diag::err_attribute_argument_type)
1409 return;
1410 }
1411
1412 if (!I->isPowerOf2()) {
1413 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
1414 << E->getSourceRange();
1415 return;
1416 }
1417
1418 if (*I > Sema::MaximumAlignment)
1419 Diag(CI.getLoc(), diag::warn_assume_aligned_too_great)
1421 }
1422
1423 if (OE && !OE->isValueDependent() && !OE->isIntegerConstantExpr(Context)) {
1424 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1425 << CI << 2 << AANT_ArgumentIntegerConstant << OE->getSourceRange();
1426 return;
1427 }
1428
1429 D->addAttr(::new (Context) AssumeAlignedAttr(Context, CI, E, OE));
1430}
1431
1433 Expr *ParamExpr) {
1435 SourceLocation AttrLoc = CI.getLoc();
1436
1437 if (!isValidPointerAttrType(ResultType, /* RefOkay */ true)) {
1438 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1440 return;
1441 }
1442
1443 ParamIdx Idx;
1444 const auto *FuncDecl = cast<FunctionDecl>(D);
1445 if (!checkFunctionOrMethodParameterIndex(FuncDecl, CI,
1446 /*AttrArgNum=*/1, ParamExpr, Idx))
1447 return;
1448
1450 if (!Ty->isDependentType() && !Ty->isIntegralType(Context) &&
1451 !Ty->isAlignValT()) {
1452 Diag(ParamExpr->getBeginLoc(), diag::err_attribute_integers_only)
1453 << CI << FuncDecl->getParamDecl(Idx.getASTIndex())->getSourceRange();
1454 return;
1455 }
1456
1457 D->addAttr(::new (Context) AllocAlignAttr(Context, CI, Idx));
1458}
1459
1460/// Normalize the attribute, __foo__ becomes foo.
1461/// Returns true if normalization was applied.
1462static bool normalizeName(StringRef &AttrName) {
1463 if (AttrName.size() > 4 && AttrName.starts_with("__") &&
1464 AttrName.ends_with("__")) {
1465 AttrName = AttrName.drop_front(2).drop_back(2);
1466 return true;
1467 }
1468 return false;
1469}
1470
1471static void handleOwnershipAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1472 // This attribute must be applied to a function declaration. The first
1473 // argument to the attribute must be an identifier, the name of the resource,
1474 // for example: malloc. The following arguments must be argument indexes, the
1475 // arguments must be of integer type for Returns, otherwise of pointer type.
1476 // The difference between Holds and Takes is that a pointer may still be used
1477 // after being held. free() should be __attribute((ownership_takes)), whereas
1478 // a list append function may well be __attribute((ownership_holds)).
1479
1480 if (!AL.isArgIdent(0)) {
1481 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
1482 << AL << 1 << AANT_ArgumentIdentifier;
1483 return;
1484 }
1485
1486 // Figure out our Kind.
1487 OwnershipAttr::OwnershipKind K =
1488 OwnershipAttr(S.Context, AL, nullptr, nullptr, 0).getOwnKind();
1489
1490 // Check arguments.
1491 switch (K) {
1492 case OwnershipAttr::Takes:
1493 case OwnershipAttr::Holds:
1494 if (AL.getNumArgs() < 2) {
1495 S.Diag(AL.getLoc(), diag::err_attribute_too_few_arguments) << AL << 2;
1496 return;
1497 }
1498 break;
1499 case OwnershipAttr::Returns:
1500 if (AL.getNumArgs() > 2) {
1501 S.Diag(AL.getLoc(), diag::err_attribute_too_many_arguments) << AL << 2;
1502 return;
1503 }
1504 break;
1505 }
1506
1507 // Allow only pointers to be return type for functions with ownership_returns
1508 // attribute. This matches with current OwnershipAttr::Takes semantics
1509 if (K == OwnershipAttr::Returns &&
1510 !getFunctionOrMethodResultType(D)->isPointerType()) {
1511 S.Diag(AL.getLoc(), diag::err_ownership_takes_return_type) << AL;
1512 return;
1513 }
1514
1516
1517 StringRef ModuleName = Module->getName();
1518 if (normalizeName(ModuleName)) {
1519 Module = &S.PP.getIdentifierTable().get(ModuleName);
1520 }
1521
1522 SmallVector<ParamIdx, 8> OwnershipArgs;
1523 for (unsigned i = 1; i < AL.getNumArgs(); ++i) {
1524 Expr *Ex = AL.getArgAsExpr(i);
1525 ParamIdx Idx;
1526 if (!S.checkFunctionOrMethodParameterIndex(D, AL, i, Ex, Idx))
1527 return;
1528
1529 // Is the function argument a pointer type?
1531 int Err = -1; // No error
1532 switch (K) {
1533 case OwnershipAttr::Takes:
1534 case OwnershipAttr::Holds:
1535 if (!T->isAnyPointerType() && !T->isBlockPointerType())
1536 Err = 0;
1537 break;
1538 case OwnershipAttr::Returns:
1539 if (!T->isIntegerType())
1540 Err = 1;
1541 break;
1542 }
1543 if (-1 != Err) {
1544 S.Diag(AL.getLoc(), diag::err_ownership_type) << AL << Err
1545 << Ex->getSourceRange();
1546 return;
1547 }
1548
1549 // Check we don't have a conflict with another ownership attribute.
1550 for (const auto *I : D->specific_attrs<OwnershipAttr>()) {
1551 // Cannot have two ownership attributes of different kinds for the same
1552 // index.
1553 if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
1554 S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)
1555 << AL << I
1556 << (AL.isRegularKeywordAttribute() ||
1557 I->isRegularKeywordAttribute());
1558 return;
1559 } else if (K == OwnershipAttr::Returns &&
1560 I->getOwnKind() == OwnershipAttr::Returns) {
1561 // A returns attribute conflicts with any other returns attribute using
1562 // a different index.
1563 if (!llvm::is_contained(I->args(), Idx)) {
1564 S.Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1565 << I->args_begin()->getSourceIndex();
1566 if (I->args_size())
1567 S.Diag(AL.getLoc(), diag::note_ownership_returns_index_mismatch)
1568 << Idx.getSourceIndex() << Ex->getSourceRange();
1569 return;
1570 }
1571 } else if (K == OwnershipAttr::Takes &&
1572 I->getOwnKind() == OwnershipAttr::Takes) {
1573 if (I->getModule()->getName() != ModuleName) {
1574 S.Diag(I->getLocation(), diag::err_ownership_takes_class_mismatch)
1575 << I->getModule()->getName();
1576 S.Diag(AL.getLoc(), diag::note_ownership_takes_class_mismatch)
1577 << ModuleName << Ex->getSourceRange();
1578
1579 return;
1580 }
1581 }
1582 }
1583 OwnershipArgs.push_back(Idx);
1584 }
1585
1586 ParamIdx *Start = OwnershipArgs.data();
1587 unsigned Size = OwnershipArgs.size();
1588 llvm::array_pod_sort(Start, Start + Size);
1589 D->addAttr(::new (S.Context)
1590 OwnershipAttr(S.Context, AL, Module, Start, Size));
1591}
1592
1593static void handleWeakRefAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1594 // Check the attribute arguments.
1595 if (AL.getNumArgs() > 1) {
1596 S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
1597 return;
1598 }
1599
1600 // gcc rejects
1601 // class c {
1602 // static int a __attribute__((weakref ("v2")));
1603 // static int b() __attribute__((weakref ("f3")));
1604 // };
1605 // and ignores the attributes of
1606 // void f(void) {
1607 // static int a __attribute__((weakref ("v2")));
1608 // }
1609 // we reject them
1610 const DeclContext *Ctx = D->getDeclContext()->getRedeclContext();
1611 if (!Ctx->isFileContext()) {
1612 S.Diag(AL.getLoc(), diag::err_attribute_weakref_not_global_context)
1613 << cast<NamedDecl>(D);
1614 return;
1615 }
1616
1617 // The GCC manual says
1618 //
1619 // At present, a declaration to which `weakref' is attached can only
1620 // be `static'.
1621 //
1622 // It also says
1623 //
1624 // Without a TARGET,
1625 // given as an argument to `weakref' or to `alias', `weakref' is
1626 // equivalent to `weak'.
1627 //
1628 // gcc 4.4.1 will accept
1629 // int a7 __attribute__((weakref));
1630 // as
1631 // int a7 __attribute__((weak));
1632 // This looks like a bug in gcc. We reject that for now. We should revisit
1633 // it if this behaviour is actually used.
1634
1635 // GCC rejects
1636 // static ((alias ("y"), weakref)).
1637 // Should we? How to check that weakref is before or after alias?
1638
1639 // FIXME: it would be good for us to keep the WeakRefAttr as-written instead
1640 // of transforming it into an AliasAttr. The WeakRefAttr never uses the
1641 // StringRef parameter it was given anyway.
1642 StringRef Str;
1643 if (AL.getNumArgs() && S.checkStringLiteralArgumentAttr(AL, 0, Str))
1644 // GCC will accept anything as the argument of weakref. Should we
1645 // check for an existing decl?
1646 D->addAttr(::new (S.Context) AliasAttr(S.Context, AL, Str));
1647
1648 D->addAttr(::new (S.Context) WeakRefAttr(S.Context, AL));
1649}
1650
1651// Mark alias/ifunc target as used. Due to name mangling, we look up the
1652// demangled name ignoring parameters (not supported by microsoftDemangle
1653// https://github.com/llvm/llvm-project/issues/88825). This should handle the
1654// majority of use cases while leaving namespace scope names unmarked.
1655static void markUsedForAliasOrIfunc(Sema &S, Decl *D, const ParsedAttr &AL,
1656 StringRef Str) {
1657 std::unique_ptr<char, llvm::FreeDeleter> Demangled;
1658 if (S.getASTContext().getCXXABIKind() != TargetCXXABI::Microsoft)
1659 Demangled.reset(llvm::itaniumDemangle(Str, /*ParseParams=*/false));
1660 std::unique_ptr<MangleContext> MC(S.Context.createMangleContext());
1661 SmallString<256> Name;
1662
1664 &S.Context.Idents.get(Demangled ? Demangled.get() : Str), AL.getLoc());
1666 if (S.LookupName(LR, S.TUScope)) {
1667 for (NamedDecl *ND : LR) {
1668 if (!isa<FunctionDecl>(ND) && !isa<VarDecl>(ND))
1669 continue;
1670 if (MC->shouldMangleDeclName(ND)) {
1671 llvm::raw_svector_ostream Out(Name);
1672 Name.clear();
1673 MC->mangleName(GlobalDecl(ND), Out);
1674 } else {
1675 Name = ND->getIdentifier()->getName();
1676 }
1677 if (Name == Str)
1678 ND->markUsed(S.Context);
1679 }
1680 }
1681}
1682
1683static void handleIFuncAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1684 StringRef Str;
1685 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str))
1686 return;
1687
1688 // Aliases should be on declarations, not definitions.
1689 const auto *FD = cast<FunctionDecl>(D);
1690 if (FD->isThisDeclarationADefinition()) {
1691 S.Diag(AL.getLoc(), diag::err_alias_is_definition) << FD << 1;
1692 return;
1693 }
1694
1695 markUsedForAliasOrIfunc(S, D, AL, Str);
1696 D->addAttr(::new (S.Context) IFuncAttr(S.Context, AL, Str));
1697}
1698
1699static void handleAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1700 StringRef Str;
1701 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str))
1702 return;
1703
1704 if (S.Context.getTargetInfo().getTriple().isOSDarwin()) {
1705 S.Diag(AL.getLoc(), diag::err_alias_not_supported_on_darwin);
1706 return;
1707 }
1708
1709 if (S.Context.getTargetInfo().getTriple().isNVPTX()) {
1710 CudaVersion Version =
1712 if (Version != CudaVersion::UNKNOWN && Version < CudaVersion::CUDA_100)
1713 S.Diag(AL.getLoc(), diag::err_alias_not_supported_on_nvptx);
1714 }
1715
1716 // Aliases should be on declarations, not definitions.
1717 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
1718 if (FD->isThisDeclarationADefinition()) {
1719 S.Diag(AL.getLoc(), diag::err_alias_is_definition) << FD << 0;
1720 return;
1721 }
1722 } else {
1723 const auto *VD = cast<VarDecl>(D);
1724 if (VD->isThisDeclarationADefinition() && VD->isExternallyVisible()) {
1725 S.Diag(AL.getLoc(), diag::err_alias_is_definition) << VD << 0;
1726 return;
1727 }
1728 }
1729
1730 markUsedForAliasOrIfunc(S, D, AL, Str);
1731 D->addAttr(::new (S.Context) AliasAttr(S.Context, AL, Str));
1732}
1733
1734static void handleTLSModelAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1735 StringRef Model;
1736 SourceLocation LiteralLoc;
1737 // Check that it is a string.
1738 if (!S.checkStringLiteralArgumentAttr(AL, 0, Model, &LiteralLoc))
1739 return;
1740
1741 // Check that the value.
1742 if (Model != "global-dynamic" && Model != "local-dynamic"
1743 && Model != "initial-exec" && Model != "local-exec") {
1744 S.Diag(LiteralLoc, diag::err_attr_tlsmodel_arg);
1745 return;
1746 }
1747
1748 D->addAttr(::new (S.Context) TLSModelAttr(S.Context, AL, Model));
1749}
1750
1751static void handleRestrictAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1753 if (!ResultType->isAnyPointerType() && !ResultType->isBlockPointerType()) {
1754 S.Diag(AL.getLoc(), diag::warn_attribute_return_pointers_only)
1756 return;
1757 }
1758
1759 if (AL.getNumArgs() == 0) {
1760 D->addAttr(::new (S.Context) RestrictAttr(S.Context, AL));
1761 return;
1762 }
1763
1764 if (AL.getAttributeSpellingListIndex() == RestrictAttr::Declspec_restrict) {
1765 // __declspec(restrict) accepts no arguments
1766 S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 0;
1767 return;
1768 }
1769
1770 // [[gnu::malloc(deallocator)]] with args specifies a deallocator function
1771 Expr *DeallocE = AL.getArgAsExpr(0);
1772 SourceLocation DeallocLoc = DeallocE->getExprLoc();
1773 FunctionDecl *DeallocFD = nullptr;
1774 DeclarationNameInfo DeallocNI;
1775
1776 if (auto *DRE = dyn_cast<DeclRefExpr>(DeallocE)) {
1777 DeallocFD = dyn_cast<FunctionDecl>(DRE->getDecl());
1778 DeallocNI = DRE->getNameInfo();
1779 if (!DeallocFD) {
1780 S.Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1781 << 1 << DeallocNI.getName();
1782 return;
1783 }
1784 } else if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(DeallocE)) {
1785 DeallocFD = S.ResolveSingleFunctionTemplateSpecialization(ULE, true);
1786 DeallocNI = ULE->getNameInfo();
1787 if (!DeallocFD) {
1788 S.Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1789 << 2 << DeallocNI.getName();
1790 if (ULE->getType() == S.Context.OverloadTy)
1792 return;
1793 }
1794 } else {
1795 S.Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function) << 0;
1796 return;
1797 }
1798
1799 // 2nd arg of [[gnu::malloc(deallocator, 2)]] with args specifies the param
1800 // of deallocator that deallocates the pointer (defaults to 1)
1801 ParamIdx DeallocPtrIdx;
1802 if (AL.getNumArgs() == 1) {
1803 DeallocPtrIdx = ParamIdx(1, DeallocFD);
1804
1805 // FIXME: We could probably be better about diagnosing that there IS no
1806 // argument, or that the function doesn't have a prototype, but this is how
1807 // GCC diagnoses this, and is reasonably clear.
1808 if (!DeallocPtrIdx.isValid() || !hasFunctionProto(DeallocFD) ||
1809 getFunctionOrMethodNumParams(DeallocFD) < 1 ||
1810 !getFunctionOrMethodParamType(DeallocFD, DeallocPtrIdx.getASTIndex())
1812 ->isPointerType()) {
1813 S.Diag(DeallocLoc,
1814 diag::err_attribute_malloc_arg_not_function_with_pointer_arg)
1815 << DeallocNI.getName();
1816 return;
1817 }
1818 } else {
1820 DeallocFD, AL, 2, AL.getArgAsExpr(1), DeallocPtrIdx,
1821 /* CanIndexImplicitThis=*/false))
1822 return;
1823
1824 QualType DeallocPtrArgType =
1825 getFunctionOrMethodParamType(DeallocFD, DeallocPtrIdx.getASTIndex());
1826 if (!DeallocPtrArgType.getCanonicalType()->isPointerType()) {
1827 S.Diag(DeallocLoc,
1828 diag::err_attribute_malloc_arg_refers_to_non_pointer_type)
1829 << DeallocPtrIdx.getSourceIndex() << DeallocPtrArgType
1830 << DeallocNI.getName();
1831 return;
1832 }
1833 }
1834
1835 // FIXME: we should add this attribute to Clang's AST, so that clang-analyzer
1836 // can use it, see -Wmismatched-dealloc in GCC for what we can do with this.
1837 S.Diag(AL.getLoc(), diag::warn_attribute_form_ignored) << AL;
1838 D->addAttr(::new (S.Context)
1839 RestrictAttr(S.Context, AL, DeallocE, DeallocPtrIdx));
1840}
1841
1843 const QualType &Ty) {
1844 // Note that there may also be numerous cases of pointer + integer /
1845 // pointer + pointer / integer + pointer structures not actually exhibiting
1846 // a span-like semantics, so sometimes these heuristics expectedly
1847 // lead to false positive results.
1848 auto emitWarning = [this, &CI](unsigned NoteDiagID) {
1849 Diag(CI.getLoc(), diag::warn_attribute_return_span_only) << CI;
1850 return Diag(CI.getLoc(), NoteDiagID);
1851 };
1852 if (Ty->isDependentType())
1853 return false;
1854 // isCompleteType is used to force template class instantiation.
1855 if (!isCompleteType(CI.getLoc(), Ty))
1856 return emitWarning(diag::note_returned_incomplete_type);
1857 const RecordDecl *RD = Ty->getAsRecordDecl();
1858 if (!RD || RD->isUnion())
1859 return emitWarning(diag::note_returned_not_struct);
1860 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1861 if (CXXRD->getNumBases() > 0) {
1862 return emitWarning(diag::note_type_inherits_from_base);
1863 }
1864 }
1865 auto FieldsBegin = RD->field_begin();
1866 auto FieldsCount = std::distance(FieldsBegin, RD->field_end());
1867 if (FieldsCount != 2)
1868 return emitWarning(diag::note_returned_not_two_field_struct) << FieldsCount;
1869 QualType FirstFieldType = FieldsBegin->getType();
1870 QualType SecondFieldType = std::next(FieldsBegin)->getType();
1871 auto validatePointerType = [](const QualType &T) {
1872 // It must not point to functions.
1873 return T->isPointerType() && !T->isFunctionPointerType();
1874 };
1875 auto checkIntegerType = [this, emitWarning](const QualType &T,
1876 const int FieldNo) -> bool {
1877 const auto *BT = dyn_cast<BuiltinType>(T.getCanonicalType());
1878 if (!BT || !BT->isInteger())
1879 return emitWarning(diag::note_returned_not_integer_field) << FieldNo;
1880 auto IntSize = Context.getTypeSize(Context.IntTy);
1881 if (Context.getTypeSize(BT) < IntSize)
1882 return emitWarning(diag::note_returned_not_wide_enough_field)
1883 << FieldNo << IntSize;
1884 return false;
1885 };
1886 if (validatePointerType(FirstFieldType) &&
1887 validatePointerType(SecondFieldType)) {
1888 // Pointer + pointer.
1889 return false;
1890 } else if (validatePointerType(FirstFieldType)) {
1891 // Pointer + integer?
1892 return checkIntegerType(SecondFieldType, 2);
1893 } else if (validatePointerType(SecondFieldType)) {
1894 // Integer + pointer?
1895 return checkIntegerType(FirstFieldType, 1);
1896 }
1897 return emitWarning(diag::note_returned_not_span_struct);
1898}
1899
1900static void handleMallocSpanAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1902 if (!S.CheckSpanLikeType(AL, ResultType))
1903 D->addAttr(::new (S.Context) MallocSpanAttr(S.Context, AL));
1904}
1905
1906static void handleCPUSpecificAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1907 // Ensure we don't combine these with themselves, since that causes some
1908 // confusing behavior.
1909 if (AL.getParsedKind() == ParsedAttr::AT_CPUDispatch) {
1911 return;
1912
1913 if (const auto *Other = D->getAttr<CPUDispatchAttr>()) {
1914 S.Diag(AL.getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1915 S.Diag(Other->getLocation(), diag::note_conflicting_attribute);
1916 return;
1917 }
1918 } else if (AL.getParsedKind() == ParsedAttr::AT_CPUSpecific) {
1920 return;
1921
1922 if (const auto *Other = D->getAttr<CPUSpecificAttr>()) {
1923 S.Diag(AL.getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1924 S.Diag(Other->getLocation(), diag::note_conflicting_attribute);
1925 return;
1926 }
1927 }
1928
1930
1931 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
1932 if (MD->getParent()->isLambda()) {
1933 S.Diag(AL.getLoc(), diag::err_attribute_dll_lambda) << AL;
1934 return;
1935 }
1936 }
1937
1938 if (!AL.checkAtLeastNumArgs(S, 1))
1939 return;
1940
1942 for (unsigned ArgNo = 0; ArgNo < getNumAttributeArgs(AL); ++ArgNo) {
1943 if (!AL.isArgIdent(ArgNo)) {
1944 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
1945 << AL << AANT_ArgumentIdentifier;
1946 return;
1947 }
1948
1949 IdentifierLoc *CPUArg = AL.getArgAsIdent(ArgNo);
1950 StringRef CPUName = CPUArg->getIdentifierInfo()->getName().trim();
1951
1953 S.Diag(CPUArg->getLoc(), diag::err_invalid_cpu_specific_dispatch_value)
1954 << CPUName << (AL.getKind() == ParsedAttr::AT_CPUDispatch);
1955 return;
1956 }
1957
1959 if (llvm::any_of(CPUs, [CPUName, &Target](const IdentifierInfo *Cur) {
1960 return Target.CPUSpecificManglingCharacter(CPUName) ==
1961 Target.CPUSpecificManglingCharacter(Cur->getName());
1962 })) {
1963 S.Diag(AL.getLoc(), diag::warn_multiversion_duplicate_entries);
1964 return;
1965 }
1966 CPUs.push_back(CPUArg->getIdentifierInfo());
1967 }
1968
1969 FD->setIsMultiVersion(true);
1970 if (AL.getKind() == ParsedAttr::AT_CPUSpecific)
1971 D->addAttr(::new (S.Context)
1972 CPUSpecificAttr(S.Context, AL, CPUs.data(), CPUs.size()));
1973 else
1974 D->addAttr(::new (S.Context)
1975 CPUDispatchAttr(S.Context, AL, CPUs.data(), CPUs.size()));
1976}
1977
1978static void handleCommonAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1979 if (S.LangOpts.CPlusPlus) {
1980 S.Diag(AL.getLoc(), diag::err_attribute_not_supported_in_lang)
1982 return;
1983 }
1984
1985 D->addAttr(::new (S.Context) CommonAttr(S.Context, AL));
1986}
1987
1988static void handleNakedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
1989 if (AL.isDeclspecAttribute()) {
1990 const auto &Triple = S.getASTContext().getTargetInfo().getTriple();
1991 const auto &Arch = Triple.getArch();
1992 if (Arch != llvm::Triple::x86 &&
1993 (Arch != llvm::Triple::arm && Arch != llvm::Triple::thumb)) {
1994 S.Diag(AL.getLoc(), diag::err_attribute_not_supported_on_arch)
1995 << AL << Triple.getArchName();
1996 return;
1997 }
1998
1999 // This form is not allowed to be written on a member function (static or
2000 // nonstatic) when in Microsoft compatibility mode.
2001 if (S.getLangOpts().MSVCCompat && isa<CXXMethodDecl>(D)) {
2002 S.Diag(AL.getLoc(), diag::err_attribute_wrong_decl_type)
2004 return;
2005 }
2006 }
2007
2008 D->addAttr(::new (S.Context) NakedAttr(S.Context, AL));
2009}
2010
2011// FIXME: This is a best-effort heuristic.
2012// Currently only handles single throw expressions (optionally with
2013// ExprWithCleanups). We could expand this to perform control-flow analysis for
2014// more complex patterns.
2015static bool isKnownToAlwaysThrow(const FunctionDecl *FD) {
2016 if (!FD->hasBody())
2017 return false;
2018 const Stmt *Body = FD->getBody();
2019 const Stmt *OnlyStmt = nullptr;
2020
2021 if (const auto *Compound = dyn_cast<CompoundStmt>(Body)) {
2022 if (Compound->size() != 1)
2023 return false; // More than one statement, can't be known to always throw.
2024 OnlyStmt = *Compound->body_begin();
2025 } else {
2026 OnlyStmt = Body;
2027 }
2028
2029 // Unwrap ExprWithCleanups if necessary.
2030 if (const auto *EWC = dyn_cast<ExprWithCleanups>(OnlyStmt)) {
2031 OnlyStmt = EWC->getSubExpr();
2032 }
2033
2034 if (isa<CXXThrowExpr>(OnlyStmt)) {
2035 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2036 if (MD && MD->isVirtual()) {
2037 const auto *RD = MD->getParent();
2038 return MD->hasAttr<FinalAttr>() || (RD && RD->isEffectivelyFinal());
2039 }
2040 return true;
2041 }
2042 return false;
2043}
2044
2046 auto *FD = dyn_cast<FunctionDecl>(D);
2047 if (!FD)
2048 return;
2049
2050 // Skip explicit specializations here as they may have
2051 // a user-provided definition that may deliberately differ from the primary
2052 // template. If an explicit specialization truly never returns, the user
2053 // should explicitly mark it with [[noreturn]].
2055 return;
2056
2057 auto *NonConstFD = const_cast<FunctionDecl *>(FD);
2058 DiagnosticsEngine &Diags = S.getDiagnostics();
2059 if (Diags.isIgnored(diag::warn_falloff_nonvoid, FD->getLocation()) &&
2060 Diags.isIgnored(diag::warn_suggest_noreturn_function, FD->getLocation()))
2061 return;
2062
2063 if (!FD->isNoReturn() && !FD->hasAttr<InferredNoReturnAttr>() &&
2065 NonConstFD->addAttr(InferredNoReturnAttr::CreateImplicit(S.Context));
2066
2067 // [[noreturn]] can only be added to lambdas since C++23
2068 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2070 return;
2071
2072 // Emit a diagnostic suggesting the function being marked [[noreturn]].
2073 S.Diag(FD->getLocation(), diag::warn_suggest_noreturn_function)
2074 << /*isFunction=*/0 << FD;
2075 }
2076}
2077
2078static void handleNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &Attrs) {
2079 if (hasDeclarator(D)) return;
2080
2081 if (!isa<ObjCMethodDecl>(D)) {
2082 S.Diag(Attrs.getLoc(), diag::warn_attribute_wrong_decl_type)
2083 << Attrs << Attrs.isRegularKeywordAttribute()
2085 return;
2086 }
2087
2088 D->addAttr(::new (S.Context) NoReturnAttr(S.Context, Attrs));
2089}
2090
2091static void handleStandardNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &A) {
2092 // The [[_Noreturn]] spelling is deprecated in C23, so if that was used,
2093 // issue an appropriate diagnostic. However, don't issue a diagnostic if the
2094 // attribute name comes from a macro expansion. We don't want to punish users
2095 // who write [[noreturn]] after including <stdnoreturn.h> (where 'noreturn'
2096 // is defined as a macro which expands to '_Noreturn').
2097 if (!S.getLangOpts().CPlusPlus &&
2098 A.getSemanticSpelling() == CXX11NoReturnAttr::C23_Noreturn &&
2099 !(A.getLoc().isMacroID() &&
2101 S.Diag(A.getLoc(), diag::warn_deprecated_noreturn_spelling) << A.getRange();
2102
2103 D->addAttr(::new (S.Context) CXX11NoReturnAttr(S.Context, A));
2104}
2105
2106static void handleNoCfCheckAttr(Sema &S, Decl *D, const ParsedAttr &Attrs) {
2107 if (!S.getLangOpts().CFProtectionBranch)
2108 S.Diag(Attrs.getLoc(), diag::warn_nocf_check_attribute_ignored);
2109 else
2111}
2112
2114 if (!Attrs.checkExactlyNumArgs(*this, 0)) {
2115 Attrs.setInvalid();
2116 return true;
2117 }
2118
2119 return false;
2120}
2121
2123 // Check whether the attribute is valid on the current target.
2124 if (!AL.existsInTarget(Context.getTargetInfo())) {
2126 Diag(AL.getLoc(), diag::err_keyword_not_supported_on_target)
2127 << AL << AL.getRange();
2128 else
2130 AL.setInvalid();
2131 return true;
2132 }
2133 return false;
2134}
2135
2136static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
2137
2138 // The checking path for 'noreturn' and 'analyzer_noreturn' are different
2139 // because 'analyzer_noreturn' does not impact the type.
2141 ValueDecl *VD = dyn_cast<ValueDecl>(D);
2142 if (!VD || (!VD->getType()->isBlockPointerType() &&
2143 !VD->getType()->isFunctionPointerType())) {
2145 ? diag::err_attribute_wrong_decl_type
2146 : diag::warn_attribute_wrong_decl_type)
2147 << AL << AL.isRegularKeywordAttribute()
2149 return;
2150 }
2151 }
2152
2153 D->addAttr(::new (S.Context) AnalyzerNoReturnAttr(S.Context, AL));
2154}
2155
2156// PS3 PPU-specific.
2157static void handleVecReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
2158 /*
2159 Returning a Vector Class in Registers
2160
2161 According to the PPU ABI specifications, a class with a single member of
2162 vector type is returned in memory when used as the return value of a
2163 function.
2164 This results in inefficient code when implementing vector classes. To return
2165 the value in a single vector register, add the vecreturn attribute to the
2166 class definition. This attribute is also applicable to struct types.
2167
2168 Example:
2169
2170 struct Vector
2171 {
2172 __vector float xyzw;
2173 } __attribute__((vecreturn));
2174
2175 Vector Add(Vector lhs, Vector rhs)
2176 {
2177 Vector result;
2178 result.xyzw = vec_add(lhs.xyzw, rhs.xyzw);
2179 return result; // This will be returned in a register
2180 }
2181 */
2182 if (VecReturnAttr *A = D->getAttr<VecReturnAttr>()) {
2183 S.Diag(AL.getLoc(), diag::err_repeat_attribute) << A;
2184 return;
2185 }
2186
2187 const auto *R = cast<RecordDecl>(D);
2188 int count = 0;
2189
2190 if (!isa<CXXRecordDecl>(R)) {
2191 S.Diag(AL.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2192 return;
2193 }
2194
2195 if (!cast<CXXRecordDecl>(R)->isPOD()) {
2196 S.Diag(AL.getLoc(), diag::err_attribute_vecreturn_only_pod_record);
2197 return;
2198 }
2199
2200 for (const auto *I : R->fields()) {
2201 if ((count == 1) || !I->getType()->isVectorType()) {
2202 S.Diag(AL.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2203 return;
2204 }
2205 count++;
2206 }
2207
2208 D->addAttr(::new (S.Context) VecReturnAttr(S.Context, AL));
2209}
2210
2212 const ParsedAttr &AL) {
2213 if (isa<ParmVarDecl>(D)) {
2214 // [[carries_dependency]] can only be applied to a parameter if it is a
2215 // parameter of a function declaration or lambda.
2217 S.Diag(AL.getLoc(),
2218 diag::err_carries_dependency_param_not_function_decl);
2219 return;
2220 }
2221 }
2222
2223 D->addAttr(::new (S.Context) CarriesDependencyAttr(S.Context, AL));
2224}
2225
2226static void handleUnusedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
2227 bool IsCXX17Attr = AL.isCXX11Attribute() && !AL.getScopeName();
2228
2229 // If this is spelled as the standard C++17 attribute, but not in C++17, warn
2230 // about using it as an extension.
2231 if (!S.getLangOpts().CPlusPlus17 && IsCXX17Attr)
2232 S.Diag(AL.getLoc(), diag::ext_cxx17_attr) << AL;
2233
2234 D->addAttr(::new (S.Context) UnusedAttr(S.Context, AL));
2235}
2236
2238 const ParsedAttr &AL) {
2239 // If no Expr node exists on the attribute, return a nullptr result (default
2240 // priority to be used). If Expr node exists but is not valid, return an
2241 // invalid result. Otherwise, return the Expr.
2242 Expr *E = nullptr;
2243 if (AL.getNumArgs() == 1) {
2244 E = AL.getArgAsExpr(0);
2245 if (E->isValueDependent()) {
2246 if (!E->isTypeDependent() && !E->getType()->isIntegerType()) {
2247 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
2249 return ExprError();
2250 }
2251 } else {
2252 uint32_t priority;
2253 if (!S.checkUInt32Argument(AL, AL.getArgAsExpr(0), priority)) {
2254 return ExprError();
2255 }
2256 return ConstantExpr::Create(S.Context, E,
2257 APValue(llvm::APSInt::getUnsigned(priority)));
2258 }
2259 }
2260 return E;
2261}
2262
2263static void handleConstructorAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
2264 if (S.getLangOpts().HLSL && AL.getNumArgs()) {
2265 S.Diag(AL.getLoc(), diag::err_hlsl_init_priority_unsupported);
2266 return;
2267 }
2269 if (E.isInvalid())
2270 return;
2271 S.Diag(D->getLocation(), diag::warn_global_constructor)
2272 << D->getSourceRange();
2273 D->addAttr(ConstructorAttr::Create(S.Context, E.get(), AL));
2274}
2275
2276static void handleDestructorAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
2278 if (E.isInvalid())
2279 return;
2280 S.Diag(D->getLocation(), diag::warn_global_destructor) << D->getSourceRange();
2281 D->addAttr(DestructorAttr::Create(S.Context, E.get(), AL));
2282}
2283
2284template <typename AttrTy>
2285static void handleAttrWithMessage(Sema &S, Decl *D, const ParsedAttr &AL) {
2286 // Handle the case where the attribute has a text message.
2287 StringRef Str;
2288 if (AL.getNumArgs() == 1 && !S.checkStringLiteralArgumentAttr(AL, 0, Str))
2289 return;
2290
2291 D->addAttr(::new (S.Context) AttrTy(S.Context, AL, Str));
2292}
2293
2295 IdentifierInfo *Platform,
2296 VersionTuple Introduced,
2297 VersionTuple Deprecated,
2298 VersionTuple Obsoleted) {
2299 StringRef PlatformName
2300 = AvailabilityAttr::getPrettyPlatformName(Platform->getName());
2301 if (PlatformName.empty())
2302 PlatformName = Platform->getName();
2303
2304 // Ensure that Introduced <= Deprecated <= Obsoleted (although not all
2305 // of these steps are needed).
2306 if (!Introduced.empty() && !Deprecated.empty() &&
2307 !(Introduced <= Deprecated)) {
2308 S.Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2309 << 1 << PlatformName << Deprecated.getAsString()
2310 << 0 << Introduced.getAsString();
2311 return true;
2312 }
2313
2314 if (!Introduced.empty() && !Obsoleted.empty() &&
2315 !(Introduced <= Obsoleted)) {
2316 S.Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2317 << 2 << PlatformName << Obsoleted.getAsString()
2318 << 0 << Introduced.getAsString();
2319 return true;
2320 }
2321
2322 if (!Deprecated.empty() && !Obsoleted.empty() &&
2323 !(Deprecated <= Obsoleted)) {
2324 S.Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2325 << 2 << PlatformName << Obsoleted.getAsString()
2326 << 1 << Deprecated.getAsString();
2327 return true;
2328 }
2329
2330 return false;
2331}
2332
2333/// Check whether the two versions match.
2334///
2335/// If either version tuple is empty, then they are assumed to match. If
2336/// \p BeforeIsOkay is true, then \p X can be less than or equal to \p Y.
2337static bool versionsMatch(const VersionTuple &X, const VersionTuple &Y,
2338 bool BeforeIsOkay) {
2339 if (X.empty() || Y.empty())
2340 return true;
2341
2342 if (X == Y)
2343 return true;
2344
2345 if (BeforeIsOkay && X < Y)
2346 return true;
2347
2348 return false;
2349}
2350
2352 NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform,
2353 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2354 VersionTuple Obsoleted, bool IsUnavailable, StringRef Message,
2355 bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK,
2356 int Priority, IdentifierInfo *Environment) {
2357 VersionTuple MergedIntroduced = Introduced;
2358 VersionTuple MergedDeprecated = Deprecated;
2359 VersionTuple MergedObsoleted = Obsoleted;
2360 bool FoundAny = false;
2361 bool OverrideOrImpl = false;
2362 switch (AMK) {
2365 OverrideOrImpl = false;
2366 break;
2367
2371 OverrideOrImpl = true;
2372 break;
2373 }
2374
2375 if (D->hasAttrs()) {
2376 AttrVec &Attrs = D->getAttrs();
2377 for (unsigned i = 0, e = Attrs.size(); i != e;) {
2378 const auto *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
2379 if (!OldAA) {
2380 ++i;
2381 continue;
2382 }
2383
2384 IdentifierInfo *OldPlatform = OldAA->getPlatform();
2385 if (OldPlatform != Platform) {
2386 ++i;
2387 continue;
2388 }
2389
2390 IdentifierInfo *OldEnvironment = OldAA->getEnvironment();
2391 if (OldEnvironment != Environment) {
2392 ++i;
2393 continue;
2394 }
2395
2396 // If there is an existing availability attribute for this platform that
2397 // has a lower priority use the existing one and discard the new
2398 // attribute.
2399 if (OldAA->getPriority() < Priority)
2400 return nullptr;
2401
2402 // If there is an existing attribute for this platform that has a higher
2403 // priority than the new attribute then erase the old one and continue
2404 // processing the attributes.
2405 if (OldAA->getPriority() > Priority) {
2406 Attrs.erase(Attrs.begin() + i);
2407 --e;
2408 continue;
2409 }
2410
2411 FoundAny = true;
2412 VersionTuple OldIntroduced = OldAA->getIntroduced();
2413 VersionTuple OldDeprecated = OldAA->getDeprecated();
2414 VersionTuple OldObsoleted = OldAA->getObsoleted();
2415 bool OldIsUnavailable = OldAA->getUnavailable();
2416
2417 if (!versionsMatch(OldIntroduced, Introduced, OverrideOrImpl) ||
2418 !versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl) ||
2419 !versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl) ||
2420 !(OldIsUnavailable == IsUnavailable ||
2421 (OverrideOrImpl && !OldIsUnavailable && IsUnavailable))) {
2422 if (OverrideOrImpl) {
2423 int Which = -1;
2424 VersionTuple FirstVersion;
2425 VersionTuple SecondVersion;
2426 if (!versionsMatch(OldIntroduced, Introduced, OverrideOrImpl)) {
2427 Which = 0;
2428 FirstVersion = OldIntroduced;
2429 SecondVersion = Introduced;
2430 } else if (!versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl)) {
2431 Which = 1;
2432 FirstVersion = Deprecated;
2433 SecondVersion = OldDeprecated;
2434 } else if (!versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl)) {
2435 Which = 2;
2436 FirstVersion = Obsoleted;
2437 SecondVersion = OldObsoleted;
2438 }
2439
2440 if (Which == -1) {
2441 Diag(OldAA->getLocation(),
2442 diag::warn_mismatched_availability_override_unavail)
2443 << AvailabilityAttr::getPrettyPlatformName(Platform->getName())
2445 } else if (Which != 1 && AMK == AvailabilityMergeKind::
2447 // Allow different 'introduced' / 'obsoleted' availability versions
2448 // on a method that implements an optional protocol requirement. It
2449 // makes less sense to allow this for 'deprecated' as the user can't
2450 // see if the method is 'deprecated' as 'respondsToSelector' will
2451 // still return true when the method is deprecated.
2452 ++i;
2453 continue;
2454 } else {
2455 Diag(OldAA->getLocation(),
2456 diag::warn_mismatched_availability_override)
2457 << Which
2458 << AvailabilityAttr::getPrettyPlatformName(Platform->getName())
2459 << FirstVersion.getAsString() << SecondVersion.getAsString()
2461 }
2463 Diag(CI.getLoc(), diag::note_overridden_method);
2464 else
2465 Diag(CI.getLoc(), diag::note_protocol_method);
2466 } else {
2467 Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
2468 Diag(CI.getLoc(), diag::note_previous_attribute);
2469 }
2470
2471 Attrs.erase(Attrs.begin() + i);
2472 --e;
2473 continue;
2474 }
2475
2476 VersionTuple MergedIntroduced2 = MergedIntroduced;
2477 VersionTuple MergedDeprecated2 = MergedDeprecated;
2478 VersionTuple MergedObsoleted2 = MergedObsoleted;
2479
2480 if (MergedIntroduced2.empty())
2481 MergedIntroduced2 = OldIntroduced;
2482 if (MergedDeprecated2.empty())
2483 MergedDeprecated2 = OldDeprecated;
2484 if (MergedObsoleted2.empty())
2485 MergedObsoleted2 = OldObsoleted;
2486
2487 if (checkAvailabilityAttr(*this, OldAA->getRange(), Platform,
2488 MergedIntroduced2, MergedDeprecated2,
2489 MergedObsoleted2)) {
2490 Attrs.erase(Attrs.begin() + i);
2491 --e;
2492 continue;
2493 }
2494
2495 MergedIntroduced = MergedIntroduced2;
2496 MergedDeprecated = MergedDeprecated2;
2497 MergedObsoleted = MergedObsoleted2;
2498 ++i;
2499 }
2500 }
2501
2502 if (FoundAny &&
2503 MergedIntroduced == Introduced &&
2504 MergedDeprecated == Deprecated &&
2505 MergedObsoleted == Obsoleted)
2506 return nullptr;
2507
2508 // Only create a new attribute if !OverrideOrImpl, but we want to do
2509 // the checking.
2510 if (!checkAvailabilityAttr(*this, CI.getRange(), Platform, MergedIntroduced,
2511 MergedDeprecated, MergedObsoleted) &&
2512 !OverrideOrImpl) {
2513 auto *Avail = ::new (Context) AvailabilityAttr(
2514 Context, CI, Platform, Introduced, Deprecated, Obsoleted, IsUnavailable,
2515 Message, IsStrict, Replacement, Priority, Environment);
2516 Avail->setImplicit(Implicit);
2517 return Avail;
2518 }
2519 return nullptr;
2520}
2521
2522static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
2524 D)) {
2525 S.Diag(AL.getRange().getBegin(), diag::warn_deprecated_ignored_on_using)
2526 << AL;
2527 return;
2528 }
2529
2530 if (!AL.checkExactlyNumArgs(S, 1))
2531 return;
2532 IdentifierLoc *Platform = AL.getArgAsIdent(0);
2533
2534 IdentifierInfo *II = Platform->getIdentifierInfo();
2535 StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName(II->getName());
2536 if (PrettyName.empty())
2537 S.Diag(Platform->getLoc(), diag::warn_availability_unknown_platform)
2538 << Platform->getIdentifierInfo();
2539
2540 auto *ND = dyn_cast<NamedDecl>(D);
2541 if (!ND) // We warned about this already, so just return.
2542 return;
2543
2547
2548 const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType(
2549 AvailabilityAttr::canonicalizePlatformName(II->getName()));
2550
2551 auto reportAndUpdateIfInvalidOS = [&](auto &InputVersion) -> void {
2552 const bool IsInValidRange =
2553 llvm::Triple::isValidVersionForOS(PlatformOS, InputVersion);
2554 // Canonicalize availability versions.
2555 auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS(
2556 PlatformOS, InputVersion, IsInValidRange);
2557 if (!IsInValidRange) {
2558 S.Diag(Platform->getLoc(), diag::warn_availability_invalid_os_version)
2559 << InputVersion.getAsString() << PrettyName;
2560 S.Diag(Platform->getLoc(),
2561 diag::note_availability_invalid_os_version_adjusted)
2562 << CanonicalVersion.getAsString();
2563 }
2564 InputVersion = CanonicalVersion;
2565 };
2566
2567 if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2568 reportAndUpdateIfInvalidOS(Introduced.Version);
2569 reportAndUpdateIfInvalidOS(Deprecated.Version);
2570 reportAndUpdateIfInvalidOS(Obsoleted.Version);
2571 }
2572
2573 bool IsUnavailable = AL.getUnavailableLoc().isValid();
2574 bool IsStrict = AL.getStrictLoc().isValid();
2575 StringRef Str;
2576 if (const auto *SE = dyn_cast_if_present<StringLiteral>(AL.getMessageExpr()))
2577 Str = SE->getString();
2578 StringRef Replacement;
2579 if (const auto *SE =
2580 dyn_cast_if_present<StringLiteral>(AL.getReplacementExpr()))
2581 Replacement = SE->getString();
2582
2583 if (II->isStr("swift")) {
2584 if (Introduced.isValid() || Obsoleted.isValid() ||
2585 (!IsUnavailable && !Deprecated.isValid())) {
2586 S.Diag(AL.getLoc(),
2587 diag::warn_availability_swift_unavailable_deprecated_only);
2588 return;
2589 }
2590 }
2591
2592 if (II->isStr("fuchsia")) {
2593 std::optional<unsigned> Min, Sub;
2594 if ((Min = Introduced.Version.getMinor()) ||
2595 (Sub = Introduced.Version.getSubminor())) {
2596 S.Diag(AL.getLoc(), diag::warn_availability_fuchsia_unavailable_minor);
2597 return;
2598 }
2599 }
2600
2601 if (S.getLangOpts().HLSL && IsStrict)
2602 S.Diag(AL.getStrictLoc(), diag::err_availability_unexpected_parameter)
2603 << "strict" << /* HLSL */ 0;
2604
2605 int PriorityModifier = AL.isPragmaClangAttribute()
2608
2609 const IdentifierLoc *EnvironmentLoc = AL.getEnvironment();
2610 IdentifierInfo *IIEnvironment = nullptr;
2611 if (EnvironmentLoc) {
2612 if (S.getLangOpts().HLSL) {
2613 IIEnvironment = EnvironmentLoc->getIdentifierInfo();
2614 if (AvailabilityAttr::getEnvironmentType(
2615 EnvironmentLoc->getIdentifierInfo()->getName()) ==
2616 llvm::Triple::EnvironmentType::UnknownEnvironment)
2617 S.Diag(EnvironmentLoc->getLoc(),
2618 diag::warn_availability_unknown_environment)
2619 << EnvironmentLoc->getIdentifierInfo();
2620 } else {
2621 S.Diag(EnvironmentLoc->getLoc(),
2622 diag::err_availability_unexpected_parameter)
2623 << "environment" << /* C/C++ */ 1;
2624 }
2625 }
2626
2627 AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(
2628 ND, AL, II, false /*Implicit*/, Introduced.Version, Deprecated.Version,
2629 Obsoleted.Version, IsUnavailable, Str, IsStrict, Replacement,
2630 AvailabilityMergeKind::None, PriorityModifier, IIEnvironment);
2631 if (NewAttr)
2632 D->addAttr(NewAttr);
2633
2634 // Transcribe "ios" to "watchos" (and add a new attribute) if the versioning
2635 // matches before the start of the watchOS platform.
2636 if (S.Context.getTargetInfo().getTriple().isWatchOS()) {
2637 IdentifierInfo *NewII = nullptr;
2638 if (II->getName() == "ios")
2639 NewII = &S.Context.Idents.get("watchos");
2640 else if (II->getName() == "ios_app_extension")
2641 NewII = &S.Context.Idents.get("watchos_app_extension");
2642
2643 if (NewII) {
2644 const auto *SDKInfo = S.getDarwinSDKInfoForAvailabilityChecking();
2645 const auto *IOSToWatchOSMapping =
2646 SDKInfo ? SDKInfo->getVersionMapping(
2648 : nullptr;
2649
2650 auto adjustWatchOSVersion =
2651 [IOSToWatchOSMapping](VersionTuple Version) -> VersionTuple {
2652 if (Version.empty())
2653 return Version;
2654 auto MinimumWatchOSVersion = VersionTuple(2, 0);
2655
2656 if (IOSToWatchOSMapping) {
2657 if (auto MappedVersion = IOSToWatchOSMapping->map(
2658 Version, MinimumWatchOSVersion, std::nullopt)) {
2659 return *MappedVersion;
2660 }
2661 }
2662
2663 auto Major = Version.getMajor();
2664 auto NewMajor = Major;
2665 if (Major < 9)
2666 NewMajor = 0;
2667 else if (Major < 12)
2668 NewMajor = Major - 7;
2669 if (NewMajor >= 2) {
2670 if (Version.getMinor()) {
2671 if (Version.getSubminor())
2672 return VersionTuple(NewMajor, *Version.getMinor(),
2673 *Version.getSubminor());
2674 else
2675 return VersionTuple(NewMajor, *Version.getMinor());
2676 }
2677 return VersionTuple(NewMajor);
2678 }
2679
2680 return MinimumWatchOSVersion;
2681 };
2682
2683 auto NewIntroduced = adjustWatchOSVersion(Introduced.Version);
2684 auto NewDeprecated = adjustWatchOSVersion(Deprecated.Version);
2685 auto NewObsoleted = adjustWatchOSVersion(Obsoleted.Version);
2686
2687 AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(
2688 ND, AL, NewII, true /*Implicit*/, NewIntroduced, NewDeprecated,
2689 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2691 PriorityModifier + Sema::AP_InferredFromOtherPlatform, IIEnvironment);
2692 if (NewAttr)
2693 D->addAttr(NewAttr);
2694 }
2695 } else if (S.Context.getTargetInfo().getTriple().isTvOS()) {
2696 // Transcribe "ios" to "tvos" (and add a new attribute) if the versioning
2697 // matches before the start of the tvOS platform.
2698 IdentifierInfo *NewII = nullptr;
2699 if (II->getName() == "ios")
2700 NewII = &S.Context.Idents.get("tvos");
2701 else if (II->getName() == "ios_app_extension")
2702 NewII = &S.Context.Idents.get("tvos_app_extension");
2703
2704 if (NewII) {
2705 const auto *SDKInfo = S.getDarwinSDKInfoForAvailabilityChecking();
2706 const auto *IOSToTvOSMapping =
2707 SDKInfo ? SDKInfo->getVersionMapping(
2709 : nullptr;
2710
2711 auto AdjustTvOSVersion =
2712 [IOSToTvOSMapping](VersionTuple Version) -> VersionTuple {
2713 if (Version.empty())
2714 return Version;
2715
2716 if (IOSToTvOSMapping) {
2717 if (auto MappedVersion = IOSToTvOSMapping->map(
2718 Version, VersionTuple(0, 0), std::nullopt)) {
2719 return *MappedVersion;
2720 }
2721 }
2722 return Version;
2723 };
2724
2725 auto NewIntroduced = AdjustTvOSVersion(Introduced.Version);
2726 auto NewDeprecated = AdjustTvOSVersion(Deprecated.Version);
2727 auto NewObsoleted = AdjustTvOSVersion(Obsoleted.Version);
2728
2729 AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(
2730 ND, AL, NewII, true /*Implicit*/, NewIntroduced, NewDeprecated,
2731 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2733 PriorityModifier + Sema::AP_InferredFromOtherPlatform, IIEnvironment);
2734 if (NewAttr)
2735 D->addAttr(NewAttr);
2736 }
2737 } else if (S.Context.getTargetInfo().getTriple().getOS() ==
2738 llvm::Triple::IOS &&
2739 S.Context.getTargetInfo().getTriple().isMacCatalystEnvironment()) {
2740 auto GetSDKInfo = [&]() {
2742 "macOS");
2743 };
2744
2745 // Transcribe "ios" to "maccatalyst" (and add a new attribute).
2746 IdentifierInfo *NewII = nullptr;
2747 if (II->getName() == "ios")
2748 NewII = &S.Context.Idents.get("maccatalyst");
2749 else if (II->getName() == "ios_app_extension")
2750 NewII = &S.Context.Idents.get("maccatalyst_app_extension");
2751 if (NewII) {
2752 auto MinMacCatalystVersion = [](const VersionTuple &V) {
2753 if (V.empty())
2754 return V;
2755 if (V.getMajor() < 13 ||
2756 (V.getMajor() == 13 && V.getMinor() && *V.getMinor() < 1))
2757 return VersionTuple(13, 1); // The min Mac Catalyst version is 13.1.
2758 return V;
2759 };
2760 AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(
2761 ND, AL, NewII, true /*Implicit*/,
2762 MinMacCatalystVersion(Introduced.Version),
2763 MinMacCatalystVersion(Deprecated.Version),
2764 MinMacCatalystVersion(Obsoleted.Version), IsUnavailable, Str,
2765 IsStrict, Replacement, AvailabilityMergeKind::None,
2766 PriorityModifier + Sema::AP_InferredFromOtherPlatform, IIEnvironment);
2767 if (NewAttr)
2768 D->addAttr(NewAttr);
2769 } else if (II->getName() == "macos" && GetSDKInfo() &&
2770 (!Introduced.Version.empty() || !Deprecated.Version.empty() ||
2771 !Obsoleted.Version.empty())) {
2772 if (const auto *MacOStoMacCatalystMapping =
2773 GetSDKInfo()->getVersionMapping(
2775 // Infer Mac Catalyst availability from the macOS availability attribute
2776 // if it has versioned availability. Don't infer 'unavailable'. This
2777 // inferred availability has lower priority than the other availability
2778 // attributes that are inferred from 'ios'.
2779 NewII = &S.Context.Idents.get("maccatalyst");
2780 auto RemapMacOSVersion =
2781 [&](const VersionTuple &V) -> std::optional<VersionTuple> {
2782 if (V.empty())
2783 return std::nullopt;
2784 // API_TO_BE_DEPRECATED is 100000.
2785 if (V.getMajor() == 100000)
2786 return VersionTuple(100000);
2787 // The minimum iosmac version is 13.1
2788 return MacOStoMacCatalystMapping->map(V, VersionTuple(13, 1),
2789 std::nullopt);
2790 };
2791 std::optional<VersionTuple> NewIntroduced =
2792 RemapMacOSVersion(Introduced.Version),
2793 NewDeprecated =
2794 RemapMacOSVersion(Deprecated.Version),
2795 NewObsoleted =
2796 RemapMacOSVersion(Obsoleted.Version);
2797 if (NewIntroduced || NewDeprecated || NewObsoleted) {
2798 auto VersionOrEmptyVersion =
2799 [](const std::optional<VersionTuple> &V) -> VersionTuple {
2800 return V ? *V : VersionTuple();
2801 };
2802 AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(
2803 ND, AL, NewII, true /*Implicit*/,
2804 VersionOrEmptyVersion(NewIntroduced),
2805 VersionOrEmptyVersion(NewDeprecated),
2806 VersionOrEmptyVersion(NewObsoleted), /*IsUnavailable=*/false, Str,
2807 IsStrict, Replacement, AvailabilityMergeKind::None,
2808 PriorityModifier + Sema::AP_InferredFromOtherPlatform +
2810 IIEnvironment);
2811 if (NewAttr)
2812 D->addAttr(NewAttr);
2813 }
2814 }
2815 }
2816 }
2817}
2818
2820 const ParsedAttr &AL) {
2821 if (!AL.checkAtLeastNumArgs(S, 1) || !AL.checkAtMostNumArgs(S, 4))
2822 return;
2823
2824 StringRef Language;
2825 if (const auto *SE = dyn_cast_if_present<StringLiteral>(AL.getArgAsExpr(0)))
2826 Language = SE->getString();
2827 StringRef DefinedIn;
2828 if (const auto *SE = dyn_cast_if_present<StringLiteral>(AL.getArgAsExpr(1)))
2829 DefinedIn = SE->getString();
2830 bool IsGeneratedDeclaration = AL.getArgAsIdent(2) != nullptr;
2831 StringRef USR;
2832 if (const auto *SE = dyn_cast_if_present<StringLiteral>(AL.getArgAsExpr(3)))
2833 USR = SE->getString();
2834
2835 D->addAttr(::new (S.Context) ExternalSourceSymbolAttr(
2836 S.Context, AL, Language, DefinedIn, IsGeneratedDeclaration, USR));
2837}
2838
2839template <class T>
2841 typename T::VisibilityType value) {
2842 T *existingAttr = D->getAttr<T>();
2843 if (existingAttr) {
2844 typename T::VisibilityType existingValue = existingAttr->getVisibility();
2845 if (existingValue == value)
2846 return nullptr;
2847 S.Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
2848 S.Diag(CI.getLoc(), diag::note_previous_attribute);
2849 D->dropAttr<T>();
2850 }
2851 return ::new (S.Context) T(S.Context, CI, value);
2852}
2853
2855 const AttributeCommonInfo &CI,
2856 VisibilityAttr::VisibilityType Vis) {
2857 return ::mergeVisibilityAttr<VisibilityAttr>(*this, D, CI, Vis);
2858}
2859
2860TypeVisibilityAttr *
2862 TypeVisibilityAttr::VisibilityType Vis) {
2863 return ::mergeVisibilityAttr<TypeVisibilityAttr>(*this, D, CI, Vis);
2864}
2865
2866static void handleVisibilityAttr(Sema &S, Decl *D, const ParsedAttr &AL,
2867 bool isTypeVisibility) {
2868 // Visibility attributes don't mean anything on a typedef.
2869 if (isa<TypedefNameDecl>(D)) {
2870 S.Diag(AL.getRange().getBegin(), diag::warn_attribute_ignored) << AL;
2871 return;
2872 }
2873
2874 // 'type_visibility' can only go on a type or namespace.
2875 if (isTypeVisibility && !(isa<TagDecl>(D) || isa<ObjCInterfaceDecl>(D) ||
2876 isa<NamespaceDecl>(D))) {
2877 S.Diag(AL.getRange().getBegin(), diag::err_attribute_wrong_decl_type)
2879 return;
2880 }
2881
2882 // Check that the argument is a string literal.
2883 StringRef TypeStr;
2884 SourceLocation LiteralLoc;
2885 if (!S.checkStringLiteralArgumentAttr(AL, 0, TypeStr, &LiteralLoc))
2886 return;
2887
2888 VisibilityAttr::VisibilityType type;
2889 if (!VisibilityAttr::ConvertStrToVisibilityType(TypeStr, type)) {
2890 S.Diag(LiteralLoc, diag::warn_attribute_type_not_supported) << AL
2891 << TypeStr;
2892 return;
2893 }
2894
2895 // Complain about attempts to use protected visibility on targets
2896 // (like Darwin) that don't support it.
2897 if (type == VisibilityAttr::Protected &&
2899 S.Diag(AL.getLoc(), diag::warn_attribute_protected_visibility);
2900 type = VisibilityAttr::Default;
2901 }
2902
2903 Attr *newAttr;
2904 if (isTypeVisibility) {
2905 newAttr = S.mergeTypeVisibilityAttr(
2906 D, AL, (TypeVisibilityAttr::VisibilityType)type);
2907 } else {
2908 newAttr = S.mergeVisibilityAttr(D, AL, type);
2909 }
2910 if (newAttr)
2911 D->addAttr(newAttr);
2912}
2913
2914static void handleSentinelAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
2915 unsigned sentinel = (unsigned)SentinelAttr::DefaultSentinel;
2916 if (AL.getNumArgs() > 0) {
2917 Expr *E = AL.getArgAsExpr(0);
2918 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
2919 if (E->isTypeDependent() || !(Idx = E->getIntegerConstantExpr(S.Context))) {
2920 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
2921 << AL << 1 << AANT_ArgumentIntegerConstant << E->getSourceRange();
2922 return;
2923 }
2924
2925 if (Idx->isSigned() && Idx->isNegative()) {
2926 S.Diag(AL.getLoc(), diag::err_attribute_sentinel_less_than_zero)
2927 << E->getSourceRange();
2928 return;
2929 }
2930
2931 sentinel = Idx->getZExtValue();
2932 }
2933
2934 unsigned nullPos = (unsigned)SentinelAttr::DefaultNullPos;
2935 if (AL.getNumArgs() > 1) {
2936 Expr *E = AL.getArgAsExpr(1);
2937 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
2938 if (E->isTypeDependent() || !(Idx = E->getIntegerConstantExpr(S.Context))) {
2939 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
2940 << AL << 2 << AANT_ArgumentIntegerConstant << E->getSourceRange();
2941 return;
2942 }
2943 nullPos = Idx->getZExtValue();
2944
2945 if ((Idx->isSigned() && Idx->isNegative()) || nullPos > 1) {
2946 // FIXME: This error message could be improved, it would be nice
2947 // to say what the bounds actually are.
2948 S.Diag(AL.getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
2949 << E->getSourceRange();
2950 return;
2951 }
2952 }
2953
2954 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
2955 const FunctionType *FT = FD->getType()->castAs<FunctionType>();
2956 if (isa<FunctionNoProtoType>(FT)) {
2957 S.Diag(AL.getLoc(), diag::warn_attribute_sentinel_named_arguments);
2958 return;
2959 }
2960
2961 if (!cast<FunctionProtoType>(FT)->isVariadic()) {
2962 S.Diag(AL.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
2963 return;
2964 }
2965 } else if (const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
2966 if (!MD->isVariadic()) {
2967 S.Diag(AL.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
2968 return;
2969 }
2970 } else if (const auto *BD = dyn_cast<BlockDecl>(D)) {
2971 if (!BD->isVariadic()) {
2972 S.Diag(AL.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
2973 return;
2974 }
2975 } else if (const auto *V = dyn_cast<VarDecl>(D)) {
2976 QualType Ty = V->getType();
2977 if (Ty->isBlockPointerType() || Ty->isFunctionPointerType()) {
2978 const FunctionType *FT = Ty->isFunctionPointerType()
2979 ? D->getFunctionType()
2980 : Ty->castAs<BlockPointerType>()
2981 ->getPointeeType()
2982 ->castAs<FunctionType>();
2983 if (!cast<FunctionProtoType>(FT)->isVariadic()) {
2984 int m = Ty->isFunctionPointerType() ? 0 : 1;
2985 S.Diag(AL.getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
2986 return;
2987 }
2988 } else {
2989 S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
2990 << AL << AL.isRegularKeywordAttribute()
2992 return;
2993 }
2994 } else {
2995 S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
2996 << AL << AL.isRegularKeywordAttribute()
2998 return;
2999 }
3000 D->addAttr(::new (S.Context) SentinelAttr(S.Context, AL, sentinel, nullPos));
3001}
3002
3003static void handleWarnUnusedResult(Sema &S, Decl *D, const ParsedAttr &AL) {
3004 if (D->getFunctionType() &&
3007 S.Diag(AL.getLoc(), diag::warn_attribute_void_function_method) << AL << 0;
3008 return;
3009 }
3010 if (const auto *MD = dyn_cast<ObjCMethodDecl>(D))
3011 if (MD->getReturnType()->isVoidType()) {
3012 S.Diag(AL.getLoc(), diag::warn_attribute_void_function_method) << AL << 1;
3013 return;
3014 }
3015
3016 StringRef Str;
3017 if (AL.isStandardAttributeSyntax()) {
3018 // If this is spelled [[clang::warn_unused_result]] we look for an optional
3019 // string literal. This is not gated behind any specific version of the
3020 // standard.
3021 if (AL.isClangScope()) {
3022 if (AL.getNumArgs() == 1 &&
3023 !S.checkStringLiteralArgumentAttr(AL, 0, Str, nullptr))
3024 return;
3025 } else if (!AL.getScopeName()) {
3026 // The standard attribute cannot be applied to variable declarations such
3027 // as a function pointer.
3028 if (isa<VarDecl>(D))
3029 S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
3030 << AL << AL.isRegularKeywordAttribute()
3032
3033 // If this is spelled as the standard C++17 attribute, but not in C++17,
3034 // warn about using it as an extension. If there are attribute arguments,
3035 // then claim it's a C++20 extension instead. C23 supports this attribute
3036 // with the message; no extension warning is needed there beyond the one
3037 // already issued for accepting attributes in older modes.
3038 const LangOptions &LO = S.getLangOpts();
3039 if (AL.getNumArgs() == 1) {
3040 if (LO.CPlusPlus && !LO.CPlusPlus20)
3041 S.Diag(AL.getLoc(), diag::ext_cxx20_attr) << AL;
3042
3043 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str, nullptr))
3044 return;
3045 } else if (LO.CPlusPlus && !LO.CPlusPlus17)
3046 S.Diag(AL.getLoc(), diag::ext_cxx17_attr) << AL;
3047 }
3048 }
3049
3050 if ((!AL.isGNUAttribute() &&
3051 !(AL.isStandardAttributeSyntax() && AL.isClangScope())) &&
3053 S.Diag(AL.getLoc(), diag::warn_unused_result_typedef_unsupported_spelling)
3054 << AL.isGNUScope();
3055 return;
3056 }
3057
3058 D->addAttr(::new (S.Context) WarnUnusedResultAttr(S.Context, AL, Str));
3059}
3060
3061static void handleWeakImportAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3062 // weak_import only applies to variable & function declarations.
3063 bool isDef = false;
3064 if (!D->canBeWeakImported(isDef)) {
3065 if (isDef)
3066 S.Diag(AL.getLoc(), diag::warn_attribute_invalid_on_definition)
3067 << "weak_import";
3068 else if (isa<ObjCPropertyDecl>(D) || isa<ObjCMethodDecl>(D) ||
3069 (S.Context.getTargetInfo().getTriple().isOSDarwin() &&
3071 // Nothing to warn about here.
3072 } else
3073 S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
3075
3076 return;
3077 }
3078
3079 D->addAttr(::new (S.Context) WeakImportAttr(S.Context, AL));
3080}
3081
3082// Checks whether an argument of launch_bounds-like attribute is
3083// acceptable, performs implicit conversion to Rvalue, and returns
3084// non-nullptr Expr result on success. Otherwise, it returns nullptr
3085// and may output an error.
3086template <class Attribute>
3087static Expr *makeAttributeArgExpr(Sema &S, Expr *E, const Attribute &Attr,
3088 const unsigned Idx) {
3090 return nullptr;
3091
3092 // Accept template arguments for now as they depend on something else.
3093 // We'll get to check them when they eventually get instantiated.
3094 if (E->isValueDependent())
3095 return E;
3096
3097 std::optional<llvm::APSInt> I = llvm::APSInt(64);
3098 if (!(I = E->getIntegerConstantExpr(S.Context))) {
3099 S.Diag(E->getExprLoc(), diag::err_attribute_argument_n_type)
3100 << &Attr << Idx << AANT_ArgumentIntegerConstant << E->getSourceRange();
3101 return nullptr;
3102 }
3103 // Make sure we can fit it in 32 bits.
3104 if (!I->isIntN(32)) {
3105 S.Diag(E->getExprLoc(), diag::err_ice_too_large)
3106 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
3107 return nullptr;
3108 }
3109 if (*I < 0)
3110 S.Diag(E->getExprLoc(), diag::err_attribute_requires_positive_integer)
3111 << &Attr << /*non-negative*/ 1 << E->getSourceRange();
3112
3113 // We may need to perform implicit conversion of the argument.
3115 S.Context, S.Context.getConstType(S.Context.IntTy), /*consume*/ false);
3116 ExprResult ValArg = S.PerformCopyInitialization(Entity, SourceLocation(), E);
3117 assert(!ValArg.isInvalid() &&
3118 "Unexpected PerformCopyInitialization() failure.");
3119
3120 return ValArg.getAs<Expr>();
3121}
3122
3123// Handles reqd_work_group_size and work_group_size_hint.
3124template <typename WorkGroupAttr>
3125static void handleWorkGroupSize(Sema &S, Decl *D, const ParsedAttr &AL) {
3126 Expr *WGSize[3];
3127 for (unsigned i = 0; i < 3; ++i) {
3128 if (Expr *E = makeAttributeArgExpr(S, AL.getArgAsExpr(i), AL, i))
3129 WGSize[i] = E;
3130 else
3131 return;
3132 }
3133
3134 auto IsZero = [&](Expr *E) {
3135 if (E->isValueDependent())
3136 return false;
3137 std::optional<llvm::APSInt> I = E->getIntegerConstantExpr(S.Context);
3138 assert(I && "Non-integer constant expr");
3139 return I->isZero();
3140 };
3141
3142 if (!llvm::all_of(WGSize, IsZero)) {
3143 for (unsigned i = 0; i < 3; ++i) {
3144 const Expr *E = AL.getArgAsExpr(i);
3145 if (IsZero(WGSize[i])) {
3146 S.Diag(AL.getLoc(), diag::err_attribute_argument_is_zero)
3147 << AL << E->getSourceRange();
3148 return;
3149 }
3150 }
3151 }
3152
3153 auto Equal = [&](Expr *LHS, Expr *RHS) {
3154 if (LHS->isValueDependent() || RHS->isValueDependent())
3155 return true;
3156 std::optional<llvm::APSInt> L = LHS->getIntegerConstantExpr(S.Context);
3157 assert(L && "Non-integer constant expr");
3158 std::optional<llvm::APSInt> R = RHS->getIntegerConstantExpr(S.Context);
3159 assert(L && "Non-integer constant expr");
3160 return L == R;
3161 };
3162
3163 WorkGroupAttr *Existing = D->getAttr<WorkGroupAttr>();
3164 if (Existing &&
3165 !llvm::equal(std::initializer_list<Expr *>{Existing->getXDim(),
3166 Existing->getYDim(),
3167 Existing->getZDim()},
3168 WGSize, Equal))
3169 S.Diag(AL.getLoc(), diag::warn_duplicate_attribute) << AL;
3170
3171 D->addAttr(::new (S.Context)
3172 WorkGroupAttr(S.Context, AL, WGSize[0], WGSize[1], WGSize[2]));
3173}
3174
3175static void handleVecTypeHint(Sema &S, Decl *D, const ParsedAttr &AL) {
3176 if (!AL.hasParsedType()) {
3177 S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
3178 return;
3179 }
3180
3181 TypeSourceInfo *ParmTSI = nullptr;
3182 QualType ParmType = S.GetTypeFromParser(AL.getTypeArg(), &ParmTSI);
3183 assert(ParmTSI && "no type source info for attribute argument");
3184
3185 if (!ParmType->isExtVectorType() && !ParmType->isFloatingType() &&
3186 (ParmType->isBooleanType() ||
3187 !ParmType->isIntegralType(S.getASTContext()))) {
3188 S.Diag(AL.getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
3189 return;
3190 }
3191
3192 if (VecTypeHintAttr *A = D->getAttr<VecTypeHintAttr>()) {
3193 if (!S.Context.hasSameType(A->getTypeHint(), ParmType)) {
3194 S.Diag(AL.getLoc(), diag::warn_duplicate_attribute) << AL;
3195 return;
3196 }
3197 }
3198
3199 D->addAttr(::new (S.Context) VecTypeHintAttr(S.Context, AL, ParmTSI));
3200}
3201
3203 StringRef Name) {
3204 // Explicit or partial specializations do not inherit
3205 // the section attribute from the primary template.
3206 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
3207 if (CI.getAttributeSpellingListIndex() == SectionAttr::Declspec_allocate &&
3209 return nullptr;
3210 }
3211 if (SectionAttr *ExistingAttr = D->getAttr<SectionAttr>()) {
3212 if (ExistingAttr->getName() == Name)
3213 return nullptr;
3214 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3215 << 1 /*section*/;
3216 Diag(CI.getLoc(), diag::note_previous_attribute);
3217 return nullptr;
3218 }
3219 return ::new (Context) SectionAttr(Context, CI, Name);
3220}
3221
3222llvm::Error Sema::isValidSectionSpecifier(StringRef SecName) {
3223 if (!Context.getTargetInfo().getTriple().isOSDarwin())
3224 return llvm::Error::success();
3225
3226 // Let MCSectionMachO validate this.
3227 StringRef Segment, Section;
3228 unsigned TAA, StubSize;
3229 bool HasTAA;
3230 return llvm::MCSectionMachO::ParseSectionSpecifier(SecName, Segment, Section,
3231 TAA, HasTAA, StubSize);
3232}
3233
3234bool Sema::checkSectionName(SourceLocation LiteralLoc, StringRef SecName) {
3235 if (llvm::Error E = isValidSectionSpecifier(SecName)) {
3236 Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3237 << toString(std::move(E)) << 1 /*'section'*/;
3238 return false;
3239 }
3240 return true;
3241}
3242
3243static void handleSectionAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3244 // Make sure that there is a string literal as the sections's single
3245 // argument.
3246 StringRef Str;
3247 SourceLocation LiteralLoc;
3248 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str, &LiteralLoc))
3249 return;
3250
3251 if (!S.checkSectionName(LiteralLoc, Str))
3252 return;
3253
3254 SectionAttr *NewAttr = S.mergeSectionAttr(D, AL, Str);
3255 if (NewAttr) {
3256 D->addAttr(NewAttr);
3258 ObjCPropertyDecl>(D))
3259 S.UnifySection(NewAttr->getName(),
3261 cast<NamedDecl>(D));
3262 }
3263}
3264
3265static bool isValidCodeModelAttr(llvm::Triple &Triple, StringRef Str) {
3266 if (Triple.isLoongArch()) {
3267 return Str == "normal" || Str == "medium" || Str == "extreme";
3268 } else {
3269 assert(Triple.getArch() == llvm::Triple::x86_64 &&
3270 "only loongarch/x86-64 supported");
3271 return Str == "small" || Str == "large";
3272 }
3273}
3274
3275static void handleCodeModelAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3276 StringRef Str;
3277 SourceLocation LiteralLoc;
3278 auto IsTripleSupported = [](llvm::Triple &Triple) {
3279 return Triple.getArch() == llvm::Triple::ArchType::x86_64 ||
3280 Triple.isLoongArch();
3281 };
3282
3283 // Check that it is a string.
3284 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str, &LiteralLoc))
3285 return;
3286
3289 if (auto *aux = S.Context.getAuxTargetInfo()) {
3290 Triples.push_back(aux->getTriple());
3291 } else if (S.Context.getTargetInfo().getTriple().isNVPTX() ||
3292 S.Context.getTargetInfo().getTriple().isAMDGPU() ||
3293 S.Context.getTargetInfo().getTriple().isSPIRV()) {
3294 // Ignore the attribute for pure GPU device compiles since it only applies
3295 // to host globals.
3296 return;
3297 }
3298
3299 auto SupportedTripleIt = llvm::find_if(Triples, IsTripleSupported);
3300 if (SupportedTripleIt == Triples.end()) {
3301 S.Diag(LiteralLoc, diag::warn_unknown_attribute_ignored) << AL;
3302 return;
3303 }
3304
3305 llvm::CodeModel::Model CM;
3306 if (!CodeModelAttr::ConvertStrToModel(Str, CM) ||
3307 !isValidCodeModelAttr(*SupportedTripleIt, Str)) {
3308 S.Diag(LiteralLoc, diag::err_attr_codemodel_arg) << Str;
3309 return;
3310 }
3311
3312 D->addAttr(::new (S.Context) CodeModelAttr(S.Context, AL, CM));
3313}
3314
3315// This is used for `__declspec(code_seg("segname"))` on a decl.
3316// `#pragma code_seg("segname")` uses checkSectionName() instead.
3317static bool checkCodeSegName(Sema &S, SourceLocation LiteralLoc,
3318 StringRef CodeSegName) {
3319 if (llvm::Error E = S.isValidSectionSpecifier(CodeSegName)) {
3320 S.Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3321 << toString(std::move(E)) << 0 /*'code-seg'*/;
3322 return false;
3323 }
3324
3325 return true;
3326}
3327
3329 StringRef Name) {
3330 // Explicit or partial specializations do not inherit
3331 // the code_seg attribute from the primary template.
3332 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
3334 return nullptr;
3335 }
3336 if (const auto *ExistingAttr = D->getAttr<CodeSegAttr>()) {
3337 if (ExistingAttr->getName() == Name)
3338 return nullptr;
3339 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3340 << 0 /*codeseg*/;
3341 Diag(CI.getLoc(), diag::note_previous_attribute);
3342 return nullptr;
3343 }
3344 return ::new (Context) CodeSegAttr(Context, CI, Name);
3345}
3346
3347static void handleCodeSegAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3348 StringRef Str;
3349 SourceLocation LiteralLoc;
3350 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str, &LiteralLoc))
3351 return;
3352 if (!checkCodeSegName(S, LiteralLoc, Str))
3353 return;
3354 if (const auto *ExistingAttr = D->getAttr<CodeSegAttr>()) {
3355 if (!ExistingAttr->isImplicit()) {
3356 S.Diag(AL.getLoc(),
3357 ExistingAttr->getName() == Str
3358 ? diag::warn_duplicate_codeseg_attribute
3359 : diag::err_conflicting_codeseg_attribute);
3360 return;
3361 }
3362 D->dropAttr<CodeSegAttr>();
3363 }
3364 if (CodeSegAttr *CSA = S.mergeCodeSegAttr(D, AL, Str))
3365 D->addAttr(CSA);
3366}
3367
3368bool Sema::checkTargetAttr(SourceLocation LiteralLoc, StringRef AttrStr) {
3369 using namespace DiagAttrParams;
3370
3371 if (AttrStr.contains("fpmath="))
3372 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3373 << Unsupported << None << "fpmath=" << Target;
3374
3375 // Diagnose use of tune if target doesn't support it.
3376 if (!Context.getTargetInfo().supportsTargetAttributeTune() &&
3377 AttrStr.contains("tune="))
3378 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3379 << Unsupported << None << "tune=" << Target;
3380
3381 ParsedTargetAttr ParsedAttrs =
3382 Context.getTargetInfo().parseTargetAttr(AttrStr);
3383
3384 if (!ParsedAttrs.CPU.empty() &&
3385 !Context.getTargetInfo().isValidCPUName(ParsedAttrs.CPU))
3386 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3387 << Unknown << CPU << ParsedAttrs.CPU << Target;
3388
3389 if (!ParsedAttrs.Tune.empty() &&
3390 !Context.getTargetInfo().isValidCPUName(ParsedAttrs.Tune))
3391 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3392 << Unknown << Tune << ParsedAttrs.Tune << Target;
3393
3394 if (Context.getTargetInfo().getTriple().isRISCV()) {
3395 if (ParsedAttrs.Duplicate != "")
3396 return Diag(LiteralLoc, diag::err_duplicate_target_attribute)
3397 << Duplicate << None << ParsedAttrs.Duplicate << Target;
3398 for (StringRef CurFeature : ParsedAttrs.Features) {
3399 if (!CurFeature.starts_with('+') && !CurFeature.starts_with('-'))
3400 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3401 << Unsupported << None << AttrStr << Target;
3402 }
3403 }
3404
3405 if (Context.getTargetInfo().getTriple().isLoongArch()) {
3406 for (StringRef CurFeature : ParsedAttrs.Features) {
3407 if (CurFeature.starts_with("!arch=")) {
3408 StringRef ArchValue = CurFeature.split("=").second.trim();
3409 return Diag(LiteralLoc, diag::err_attribute_unsupported)
3410 << "target(arch=..)" << ArchValue;
3411 }
3412 }
3413 }
3414
3415 if (ParsedAttrs.Duplicate != "")
3416 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3417 << Duplicate << None << ParsedAttrs.Duplicate << Target;
3418
3419 for (const auto &Feature : ParsedAttrs.Features) {
3420 auto CurFeature = StringRef(Feature).drop_front(); // remove + or -.
3421 if (!Context.getTargetInfo().isValidFeatureName(CurFeature))
3422 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3423 << Unsupported << None << CurFeature << Target;
3424 }
3425
3427 StringRef DiagMsg;
3428 if (ParsedAttrs.BranchProtection.empty())
3429 return false;
3430 if (!Context.getTargetInfo().validateBranchProtection(
3431 ParsedAttrs.BranchProtection, ParsedAttrs.CPU, BPI,
3432 Context.getLangOpts(), DiagMsg)) {
3433 if (DiagMsg.empty())
3434 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3435 << Unsupported << None << "branch-protection" << Target;
3436 return Diag(LiteralLoc, diag::err_invalid_branch_protection_spec)
3437 << DiagMsg;
3438 }
3439 if (!DiagMsg.empty())
3440 Diag(LiteralLoc, diag::warn_unsupported_branch_protection_spec) << DiagMsg;
3441
3442 return false;
3443}
3444
3445static void handleTargetVersionAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3446 StringRef Param;
3447 SourceLocation Loc;
3448 SmallString<64> NewParam;
3449 if (!S.checkStringLiteralArgumentAttr(AL, 0, Param, &Loc))
3450 return;
3451
3452 if (S.Context.getTargetInfo().getTriple().isAArch64()) {
3453 if (S.ARM().checkTargetVersionAttr(Param, Loc, NewParam))
3454 return;
3455 } else if (S.Context.getTargetInfo().getTriple().isRISCV()) {
3456 if (S.RISCV().checkTargetVersionAttr(Param, Loc, NewParam))
3457 return;
3458 }
3459
3460 TargetVersionAttr *NewAttr =
3461 ::new (S.Context) TargetVersionAttr(S.Context, AL, NewParam);
3462 D->addAttr(NewAttr);
3463}
3464
3465static void handleTargetAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3466 StringRef Str;
3467 SourceLocation LiteralLoc;
3468 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str, &LiteralLoc) ||
3469 S.checkTargetAttr(LiteralLoc, Str))
3470 return;
3471
3472 TargetAttr *NewAttr = ::new (S.Context) TargetAttr(S.Context, AL, Str);
3473 D->addAttr(NewAttr);
3474}
3475
3476static void handleTargetClonesAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3477 // Ensure we don't combine these with themselves, since that causes some
3478 // confusing behavior.
3479 if (const auto *Other = D->getAttr<TargetClonesAttr>()) {
3480 S.Diag(AL.getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
3481 S.Diag(Other->getLocation(), diag::note_conflicting_attribute);
3482 return;
3483 }
3485 return;
3486
3487 // FIXME: We could probably figure out how to get this to work for lambdas
3488 // someday.
3489 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
3490 if (MD->getParent()->isLambda()) {
3491 S.Diag(D->getLocation(), diag::err_multiversion_doesnt_support)
3492 << static_cast<unsigned>(MultiVersionKind::TargetClones)
3493 << /*Lambda*/ 9;
3494 return;
3495 }
3496 }
3497
3500 for (unsigned I = 0, E = AL.getNumArgs(); I != E; ++I) {
3501 StringRef Param;
3502 SourceLocation Loc;
3503 if (!S.checkStringLiteralArgumentAttr(AL, I, Param, &Loc))
3504 return;
3505 Params.push_back(Param);
3506 Locations.push_back(Loc);
3507 }
3508
3509 SmallVector<SmallString<64>, 2> NewParams;
3510 if (S.Context.getTargetInfo().getTriple().isAArch64()) {
3511 if (S.ARM().checkTargetClonesAttr(Params, Locations, NewParams))
3512 return;
3513 } else if (S.Context.getTargetInfo().getTriple().isRISCV()) {
3514 if (S.RISCV().checkTargetClonesAttr(Params, Locations, NewParams))
3515 return;
3516 } else if (S.Context.getTargetInfo().getTriple().isX86()) {
3517 if (S.X86().checkTargetClonesAttr(Params, Locations, NewParams))
3518 return;
3519 }
3520 Params.clear();
3521 for (auto &SmallStr : NewParams)
3522 Params.push_back(SmallStr.str());
3523
3524 TargetClonesAttr *NewAttr = ::new (S.Context)
3525 TargetClonesAttr(S.Context, AL, Params.data(), Params.size());
3526 D->addAttr(NewAttr);
3527}
3528
3529static void handleMinVectorWidthAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3530 Expr *E = AL.getArgAsExpr(0);
3531 uint32_t VecWidth;
3532 if (!S.checkUInt32Argument(AL, E, VecWidth)) {
3533 AL.setInvalid();
3534 return;
3535 }
3536
3537 MinVectorWidthAttr *Existing = D->getAttr<MinVectorWidthAttr>();
3538 if (Existing && Existing->getVectorWidth() != VecWidth) {
3539 S.Diag(AL.getLoc(), diag::warn_duplicate_attribute) << AL;
3540 return;
3541 }
3542
3543 D->addAttr(::new (S.Context) MinVectorWidthAttr(S.Context, AL, VecWidth));
3544}
3545
3546static void handleCleanupAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3547 Expr *E = AL.getArgAsExpr(0);
3548 SourceLocation Loc = E->getExprLoc();
3549 FunctionDecl *FD = nullptr;
3551
3552 // gcc only allows for simple identifiers. Since we support more than gcc, we
3553 // will warn the user.
3554 if (auto *DRE = dyn_cast<DeclRefExpr>(E)) {
3555 if (DRE->hasQualifier())
3556 S.Diag(Loc, diag::warn_cleanup_ext);
3557 FD = dyn_cast<FunctionDecl>(DRE->getDecl());
3558 NI = DRE->getNameInfo();
3559 if (!FD) {
3560 S.Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 1
3561 << NI.getName();
3562 return;
3563 }
3564 } else if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
3565 if (ULE->hasExplicitTemplateArgs())
3566 S.Diag(Loc, diag::warn_cleanup_ext);
3568 NI = ULE->getNameInfo();
3569 if (!FD) {
3570 S.Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 2
3571 << NI.getName();
3572 if (ULE->getType() == S.Context.OverloadTy)
3574 return;
3575 }
3576 } else {
3577 S.Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 0;
3578 return;
3579 }
3580
3581 if (FD->getNumParams() != 1) {
3582 S.Diag(Loc, diag::err_attribute_cleanup_func_must_take_one_arg)
3583 << NI.getName();
3584 return;
3585 }
3586
3587 VarDecl *VD = cast<VarDecl>(D);
3588 // Create a reference to the variable declaration. This is a fake/dummy
3589 // reference.
3590 DeclRefExpr *VariableReference = DeclRefExpr::Create(
3591 S.Context, NestedNameSpecifierLoc{}, FD->getLocation(), VD, false,
3592 DeclarationNameInfo{VD->getDeclName(), VD->getLocation()}, VD->getType(),
3593 VK_LValue);
3594
3595 // Create a unary operator expression that represents taking the address of
3596 // the variable. This is a fake/dummy expression.
3597 Expr *AddressOfVariable = UnaryOperator::Create(
3598 S.Context, VariableReference, UnaryOperatorKind::UO_AddrOf,
3600 +false, FPOptionsOverride{});
3601
3602 // Create a function call expression. This is a fake/dummy call expression.
3603 CallExpr *FunctionCallExpression =
3604 CallExpr::Create(S.Context, E, ArrayRef{AddressOfVariable},
3606
3607 if (S.CheckFunctionCall(FD, FunctionCallExpression,
3608 FD->getType()->getAs<FunctionProtoType>())) {
3609 return;
3610 }
3611
3612 auto *attr = ::new (S.Context) CleanupAttr(S.Context, AL, FD);
3613 attr->setArgLoc(E->getExprLoc());
3614 D->addAttr(attr);
3615}
3616
3618 const ParsedAttr &AL) {
3619 if (!AL.isArgIdent(0)) {
3620 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
3621 << AL << 0 << AANT_ArgumentIdentifier;
3622 return;
3623 }
3624
3625 EnumExtensibilityAttr::Kind ExtensibilityKind;
3627 if (!EnumExtensibilityAttr::ConvertStrToKind(II->getName(),
3628 ExtensibilityKind)) {
3629 S.Diag(AL.getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
3630 return;
3631 }
3632
3633 D->addAttr(::new (S.Context)
3634 EnumExtensibilityAttr(S.Context, AL, ExtensibilityKind));
3635}
3636
3637/// Handle __attribute__((format_arg((idx)))) attribute based on
3638/// https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
3639static void handleFormatArgAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3640 const Expr *IdxExpr = AL.getArgAsExpr(0);
3641 ParamIdx Idx;
3642 if (!S.checkFunctionOrMethodParameterIndex(D, AL, 1, IdxExpr, Idx))
3643 return;
3644
3645 // Make sure the format string is really a string.
3647
3648 bool NotNSStringTy = !S.ObjC().isNSStringType(Ty);
3649 if (NotNSStringTy && !S.ObjC().isCFStringType(Ty) &&
3650 (!Ty->isPointerType() ||
3652 S.Diag(AL.getLoc(), diag::err_format_attribute_not)
3653 << IdxExpr->getSourceRange() << getFunctionOrMethodParamRange(D, 0);
3654 return;
3655 }
3657 // replace instancetype with the class type
3658 auto *Instancetype = cast<TypedefType>(S.Context.getTypedefType(
3659 ElaboratedTypeKeyword::None, /*Qualifier=*/std::nullopt,
3661 if (Ty->getAs<TypedefType>() == Instancetype)
3662 if (auto *OMD = dyn_cast<ObjCMethodDecl>(D))
3663 if (auto *Interface = OMD->getClassInterface())
3665 QualType(Interface->getTypeForDecl(), 0));
3666 if (!S.ObjC().isNSStringType(Ty, /*AllowNSAttributedString=*/true) &&
3667 !S.ObjC().isCFStringType(Ty) &&
3668 (!Ty->isPointerType() ||
3670 S.Diag(AL.getLoc(), diag::err_format_attribute_result_not)
3671 << (NotNSStringTy ? "string type" : "NSString")
3672 << IdxExpr->getSourceRange() << getFunctionOrMethodParamRange(D, 0);
3673 return;
3674 }
3675
3676 D->addAttr(::new (S.Context) FormatArgAttr(S.Context, AL, Idx));
3677}
3678
3687
3688/// getFormatAttrKind - Map from format attribute names to supported format
3689/// types.
3690static FormatAttrKind getFormatAttrKind(StringRef Format) {
3691 return llvm::StringSwitch<FormatAttrKind>(Format)
3692 // Check for formats that get handled specially.
3693 .Case("NSString", NSStringFormat)
3694 .Case("CFString", CFStringFormat)
3695 .Cases({"gnu_strftime", "strftime"}, StrftimeFormat)
3696
3697 // Otherwise, check for supported formats.
3698 .Cases({"gnu_scanf", "scanf", "gnu_printf", "printf", "printf0",
3699 "gnu_strfmon", "strfmon"},
3701 .Cases({"cmn_err", "vcmn_err", "zcmn_err"}, SupportedFormat)
3702 .Cases({"kprintf", "syslog"}, SupportedFormat) // OpenBSD.
3703 .Case("freebsd_kprintf", SupportedFormat) // FreeBSD.
3704 .Case("os_trace", SupportedFormat)
3705 .Case("os_log", SupportedFormat)
3706
3707 .Cases({"gcc_diag", "gcc_cdiag", "gcc_cxxdiag", "gcc_tdiag"},
3710}
3711
3712/// Handle __attribute__((init_priority(priority))) attributes based on
3713/// http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
3714static void handleInitPriorityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3715 if (!S.getLangOpts().CPlusPlus) {
3716 S.Diag(AL.getLoc(), diag::warn_attribute_ignored) << AL;
3717 return;
3718 }
3719
3720 if (S.getLangOpts().HLSL) {
3721 S.Diag(AL.getLoc(), diag::err_hlsl_init_priority_unsupported);
3722 return;
3723 }
3724
3726 S.Diag(AL.getLoc(), diag::err_init_priority_object_attr);
3727 AL.setInvalid();
3728 return;
3729 }
3730 QualType T = cast<VarDecl>(D)->getType();
3731 if (S.Context.getAsArrayType(T))
3733 if (!T->isRecordType()) {
3734 S.Diag(AL.getLoc(), diag::err_init_priority_object_attr);
3735 AL.setInvalid();
3736 return;
3737 }
3738
3739 Expr *E = AL.getArgAsExpr(0);
3740 uint32_t prioritynum;
3741 if (!S.checkUInt32Argument(AL, E, prioritynum)) {
3742 AL.setInvalid();
3743 return;
3744 }
3745
3746 if (prioritynum > 65535) {
3747 S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_range)
3748 << E->getSourceRange() << AL << 0 << 65535;
3749 AL.setInvalid();
3750 return;
3751 }
3752
3753 // Values <= 100 are reserved for the implementation, and libc++
3754 // benefits from being able to specify values in that range.
3755 if (prioritynum < 101)
3756 S.Diag(AL.getLoc(), diag::warn_init_priority_reserved)
3757 << E->getSourceRange() << prioritynum;
3758 D->addAttr(::new (S.Context) InitPriorityAttr(S.Context, AL, prioritynum));
3759}
3760
3762 StringRef NewUserDiagnostic) {
3763 if (const auto *EA = D->getAttr<ErrorAttr>()) {
3764 std::string NewAttr = CI.getNormalizedFullName();
3765 assert((NewAttr == "error" || NewAttr == "warning") &&
3766 "unexpected normalized full name");
3767 bool Match = (EA->isError() && NewAttr == "error") ||
3768 (EA->isWarning() && NewAttr == "warning");
3769 if (!Match) {
3770 Diag(EA->getLocation(), diag::err_attributes_are_not_compatible)
3771 << CI << EA
3772 << (CI.isRegularKeywordAttribute() ||
3773 EA->isRegularKeywordAttribute());
3774 Diag(CI.getLoc(), diag::note_conflicting_attribute);
3775 return nullptr;
3776 }
3777 if (EA->getUserDiagnostic() != NewUserDiagnostic) {
3778 Diag(CI.getLoc(), diag::warn_duplicate_attribute) << EA;
3779 Diag(EA->getLoc(), diag::note_previous_attribute);
3780 }
3781 D->dropAttr<ErrorAttr>();
3782 }
3783 return ::new (Context) ErrorAttr(Context, CI, NewUserDiagnostic);
3784}
3785
3787 IdentifierInfo *Format, int FormatIdx,
3788 int FirstArg) {
3789 // Check whether we already have an equivalent format attribute.
3790 for (auto *F : D->specific_attrs<FormatAttr>()) {
3791 if (F->getType() == Format &&
3792 F->getFormatIdx() == FormatIdx &&
3793 F->getFirstArg() == FirstArg) {
3794 // If we don't have a valid location for this attribute, adopt the
3795 // location.
3796 if (F->getLocation().isInvalid())
3797 F->setRange(CI.getRange());
3798 return nullptr;
3799 }
3800 }
3801
3802 return ::new (Context) FormatAttr(Context, CI, Format, FormatIdx, FirstArg);
3803}
3804
3806 const AttributeCommonInfo &CI,
3807 IdentifierInfo *Format,
3808 int FormatIdx,
3809 StringLiteral *FormatStr) {
3810 // Check whether we already have an equivalent FormatMatches attribute.
3811 for (auto *F : D->specific_attrs<FormatMatchesAttr>()) {
3812 if (F->getType() == Format && F->getFormatIdx() == FormatIdx) {
3813 if (!CheckFormatStringsCompatible(GetFormatStringType(Format->getName()),
3814 F->getFormatString(), FormatStr))
3815 return nullptr;
3816
3817 // If we don't have a valid location for this attribute, adopt the
3818 // location.
3819 if (F->getLocation().isInvalid())
3820 F->setRange(CI.getRange());
3821 return nullptr;
3822 }
3823 }
3824
3825 return ::new (Context)
3826 FormatMatchesAttr(Context, CI, Format, FormatIdx, FormatStr);
3827}
3828
3835
3836/// Handle __attribute__((format(type,idx,firstarg))) attributes based on
3837/// https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
3838static bool handleFormatAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL,
3839 FormatAttrCommon *Info) {
3840 // Checks the first two arguments of the attribute; this is shared between
3841 // Format and FormatMatches attributes.
3842
3843 if (!AL.isArgIdent(0)) {
3844 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
3845 << AL << 1 << AANT_ArgumentIdentifier;
3846 return false;
3847 }
3848
3849 // In C++ the implicit 'this' function parameter also counts, and they are
3850 // counted from one.
3851 bool HasImplicitThisParam = hasImplicitObjectParameter(D);
3852 Info->NumArgs = getFunctionOrMethodNumParams(D) + HasImplicitThisParam;
3853
3855 StringRef Format = Info->Identifier->getName();
3856
3857 if (normalizeName(Format)) {
3858 // If we've modified the string name, we need a new identifier for it.
3859 Info->Identifier = &S.Context.Idents.get(Format);
3860 }
3861
3862 // Check for supported formats.
3863 Info->Kind = getFormatAttrKind(Format);
3864
3865 if (Info->Kind == IgnoredFormat)
3866 return false;
3867
3868 if (Info->Kind == InvalidFormat) {
3869 S.Diag(AL.getLoc(), diag::warn_attribute_type_not_supported)
3870 << AL << Info->Identifier->getName();
3871 return false;
3872 }
3873
3874 // checks for the 2nd argument
3875 Expr *IdxExpr = AL.getArgAsExpr(1);
3876 if (!S.checkUInt32Argument(AL, IdxExpr, Info->FormatStringIdx, 2))
3877 return false;
3878
3879 if (Info->FormatStringIdx < 1 || Info->FormatStringIdx > Info->NumArgs) {
3880 S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds)
3881 << AL << 2 << IdxExpr->getSourceRange();
3882 return false;
3883 }
3884
3885 // FIXME: Do we need to bounds check?
3886 unsigned ArgIdx = Info->FormatStringIdx - 1;
3887
3888 if (HasImplicitThisParam) {
3889 if (ArgIdx == 0) {
3890 S.Diag(AL.getLoc(),
3891 diag::err_format_attribute_implicit_this_format_string)
3892 << IdxExpr->getSourceRange();
3893 return false;
3894 }
3895 ArgIdx--;
3896 }
3897
3898 // make sure the format string is really a string
3899 QualType Ty = getFunctionOrMethodParamType(D, ArgIdx);
3900
3901 if (!S.ObjC().isNSStringType(Ty, true) && !S.ObjC().isCFStringType(Ty) &&
3902 (!Ty->isPointerType() ||
3904 S.Diag(AL.getLoc(), diag::err_format_attribute_not)
3905 << IdxExpr->getSourceRange()
3906 << getFunctionOrMethodParamRange(D, ArgIdx);
3907 return false;
3908 }
3909
3910 return true;
3911}
3912
3913static void handleFormatAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3914 FormatAttrCommon Info;
3915 if (!handleFormatAttrCommon(S, D, AL, &Info))
3916 return;
3917
3918 // check the 3rd argument
3919 Expr *FirstArgExpr = AL.getArgAsExpr(2);
3920 uint32_t FirstArg;
3921 if (!S.checkUInt32Argument(AL, FirstArgExpr, FirstArg, 3))
3922 return;
3923
3924 // FirstArg == 0 is is always valid.
3925 if (FirstArg != 0) {
3926 if (Info.Kind == StrftimeFormat) {
3927 // If the kind is strftime, FirstArg must be 0 because strftime does not
3928 // use any variadic arguments.
3929 S.Diag(AL.getLoc(), diag::err_format_strftime_third_parameter)
3930 << FirstArgExpr->getSourceRange()
3931 << FixItHint::CreateReplacement(FirstArgExpr->getSourceRange(), "0");
3932 return;
3933 } else if (isFunctionOrMethodVariadic(D)) {
3934 // Else, if the function is variadic, then FirstArg must be 0 or the
3935 // "position" of the ... parameter. It's unusual to use 0 with variadic
3936 // functions, so the fixit proposes the latter.
3937 if (FirstArg != Info.NumArgs + 1) {
3938 S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds)
3939 << AL << 3 << FirstArgExpr->getSourceRange()
3941 std::to_string(Info.NumArgs + 1));
3942 return;
3943 }
3944 } else {
3945 // Inescapable GCC compatibility diagnostic.
3946 S.Diag(D->getLocation(), diag::warn_gcc_requires_variadic_function) << AL;
3947 if (FirstArg <= Info.FormatStringIdx) {
3948 // Else, the function is not variadic, and FirstArg must be 0 or any
3949 // parameter after the format parameter. We don't offer a fixit because
3950 // there are too many possible good values.
3951 S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds)
3952 << AL << 3 << FirstArgExpr->getSourceRange();
3953 return;
3954 }
3955 }
3956 }
3957
3958 FormatAttr *NewAttr =
3959 S.mergeFormatAttr(D, AL, Info.Identifier, Info.FormatStringIdx, FirstArg);
3960 if (NewAttr)
3961 D->addAttr(NewAttr);
3962}
3963
3964static void handleFormatMatchesAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3965 FormatAttrCommon Info;
3966 if (!handleFormatAttrCommon(S, D, AL, &Info))
3967 return;
3968
3969 Expr *FormatStrExpr = AL.getArgAsExpr(2)->IgnoreParenImpCasts();
3970 if (auto *SL = dyn_cast<StringLiteral>(FormatStrExpr)) {
3972 if (S.ValidateFormatString(FST, SL))
3973 if (auto *NewAttr = S.mergeFormatMatchesAttr(D, AL, Info.Identifier,
3974 Info.FormatStringIdx, SL))
3975 D->addAttr(NewAttr);
3976 return;
3977 }
3978
3979 S.Diag(AL.getLoc(), diag::err_format_nonliteral)
3980 << FormatStrExpr->getSourceRange();
3981}
3982
3983/// Handle __attribute__((callback(CalleeIdx, PayloadIdx0, ...))) attributes.
3984static void handleCallbackAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
3985 // The index that identifies the callback callee is mandatory.
3986 if (AL.getNumArgs() == 0) {
3987 S.Diag(AL.getLoc(), diag::err_callback_attribute_no_callee)
3988 << AL.getRange();
3989 return;
3990 }
3991
3992 bool HasImplicitThisParam = hasImplicitObjectParameter(D);
3993 int32_t NumArgs = getFunctionOrMethodNumParams(D);
3994
3995 FunctionDecl *FD = D->getAsFunction();
3996 assert(FD && "Expected a function declaration!");
3997
3998 llvm::StringMap<int> NameIdxMapping;
3999 NameIdxMapping["__"] = -1;
4000
4001 NameIdxMapping["this"] = 0;
4002
4003 int Idx = 1;
4004 for (const ParmVarDecl *PVD : FD->parameters())
4005 NameIdxMapping[PVD->getName()] = Idx++;
4006
4007 auto UnknownName = NameIdxMapping.end();
4008
4009 SmallVector<int, 8> EncodingIndices;
4010 for (unsigned I = 0, E = AL.getNumArgs(); I < E; ++I) {
4011 SourceRange SR;
4012 int32_t ArgIdx;
4013
4014 if (AL.isArgIdent(I)) {
4015 IdentifierLoc *IdLoc = AL.getArgAsIdent(I);
4016 auto It = NameIdxMapping.find(IdLoc->getIdentifierInfo()->getName());
4017 if (It == UnknownName) {
4018 S.Diag(AL.getLoc(), diag::err_callback_attribute_argument_unknown)
4019 << IdLoc->getIdentifierInfo() << IdLoc->getLoc();
4020 return;
4021 }
4022
4023 SR = SourceRange(IdLoc->getLoc());
4024 ArgIdx = It->second;
4025 } else if (AL.isArgExpr(I)) {
4026 Expr *IdxExpr = AL.getArgAsExpr(I);
4027
4028 // If the expression is not parseable as an int32_t we have a problem.
4029 if (!S.checkUInt32Argument(AL, IdxExpr, (uint32_t &)ArgIdx, I + 1,
4030 false)) {
4031 S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds)
4032 << AL << (I + 1) << IdxExpr->getSourceRange();
4033 return;
4034 }
4035
4036 // Check oob, excluding the special values, 0 and -1.
4037 if (ArgIdx < -1 || ArgIdx > NumArgs) {
4038 S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds)
4039 << AL << (I + 1) << IdxExpr->getSourceRange();
4040 return;
4041 }
4042
4043 SR = IdxExpr->getSourceRange();
4044 } else {
4045 llvm_unreachable("Unexpected ParsedAttr argument type!");
4046 }
4047
4048 if (ArgIdx == 0 && !HasImplicitThisParam) {
4049 S.Diag(AL.getLoc(), diag::err_callback_implicit_this_not_available)
4050 << (I + 1) << SR;
4051 return;
4052 }
4053
4054 // Adjust for the case we do not have an implicit "this" parameter. In this
4055 // case we decrease all positive values by 1 to get LLVM argument indices.
4056 if (!HasImplicitThisParam && ArgIdx > 0)
4057 ArgIdx -= 1;
4058
4059 EncodingIndices.push_back(ArgIdx);
4060 }
4061
4062 int CalleeIdx = EncodingIndices.front();
4063 // Check if the callee index is proper, thus not "this" and not "unknown".
4064 // This means the "CalleeIdx" has to be non-negative if "HasImplicitThisParam"
4065 // is false and positive if "HasImplicitThisParam" is true.
4066 if (CalleeIdx < (int)HasImplicitThisParam) {
4067 S.Diag(AL.getLoc(), diag::err_callback_attribute_invalid_callee)
4068 << AL.getRange();
4069 return;
4070 }
4071
4072 // Get the callee type, note the index adjustment as the AST doesn't contain
4073 // the this type (which the callee cannot reference anyway!).
4074 const Type *CalleeType =
4075 getFunctionOrMethodParamType(D, CalleeIdx - HasImplicitThisParam)
4076 .getTypePtr();
4077 if (!CalleeType || !CalleeType->isFunctionPointerType()) {
4078 S.Diag(AL.getLoc(), diag::err_callback_callee_no_function_type)
4079 << AL.getRange();
4080 return;
4081 }
4082
4083 const Type *CalleeFnType =
4085
4086 // TODO: Check the type of the callee arguments.
4087
4088 const auto *CalleeFnProtoType = dyn_cast<FunctionProtoType>(CalleeFnType);
4089 if (!CalleeFnProtoType) {
4090 S.Diag(AL.getLoc(), diag::err_callback_callee_no_function_type)
4091 << AL.getRange();
4092 return;
4093 }
4094
4095 if (CalleeFnProtoType->getNumParams() != EncodingIndices.size() - 1) {
4096 S.Diag(AL.getLoc(), diag::err_attribute_wrong_arg_count_for_func)
4097 << AL << QualType{CalleeFnProtoType, 0}
4098 << CalleeFnProtoType->getNumParams()
4099 << (unsigned)(EncodingIndices.size() - 1);
4100 return;
4101 }
4102
4103 if (CalleeFnProtoType->isVariadic()) {
4104 S.Diag(AL.getLoc(), diag::err_callback_callee_is_variadic) << AL.getRange();
4105 return;
4106 }
4107
4108 // Do not allow multiple callback attributes.
4109 if (D->hasAttr<CallbackAttr>()) {
4110 S.Diag(AL.getLoc(), diag::err_callback_attribute_multiple) << AL.getRange();
4111 return;
4112 }
4113
4114 D->addAttr(::new (S.Context) CallbackAttr(
4115 S.Context, AL, EncodingIndices.data(), EncodingIndices.size()));
4116}
4117
4118LifetimeCaptureByAttr *Sema::ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
4119 StringRef ParamName) {
4120 // Atleast one capture by is required.
4121 if (AL.getNumArgs() == 0) {
4122 Diag(AL.getLoc(), diag::err_capture_by_attribute_no_entity)
4123 << AL.getRange();
4124 return nullptr;
4125 }
4126 unsigned N = AL.getNumArgs();
4127 auto ParamIdents =
4129 auto ParamLocs =
4131 bool IsValid = true;
4132 for (unsigned I = 0; I < N; ++I) {
4133 if (AL.isArgExpr(I)) {
4134 Expr *E = AL.getArgAsExpr(I);
4135 Diag(E->getExprLoc(), diag::err_capture_by_attribute_argument_unknown)
4136 << E << E->getExprLoc();
4137 IsValid = false;
4138 continue;
4139 }
4140 assert(AL.isArgIdent(I));
4141 IdentifierLoc *IdLoc = AL.getArgAsIdent(I);
4142 if (IdLoc->getIdentifierInfo()->getName() == ParamName) {
4143 Diag(IdLoc->getLoc(), diag::err_capture_by_references_itself)
4144 << IdLoc->getLoc();
4145 IsValid = false;
4146 continue;
4147 }
4148 ParamIdents[I] = IdLoc->getIdentifierInfo();
4149 ParamLocs[I] = IdLoc->getLoc();
4150 }
4151 if (!IsValid)
4152 return nullptr;
4153 SmallVector<int> FakeParamIndices(N, LifetimeCaptureByAttr::Invalid);
4154 auto *CapturedBy =
4155 LifetimeCaptureByAttr::Create(Context, FakeParamIndices.data(), N, AL);
4156 CapturedBy->setArgs(ParamIdents, ParamLocs);
4157 return CapturedBy;
4158}
4159
4161 const ParsedAttr &AL) {
4162 // Do not allow multiple attributes.
4163 if (D->hasAttr<LifetimeCaptureByAttr>()) {
4164 S.Diag(AL.getLoc(), diag::err_capture_by_attribute_multiple)
4165 << AL.getRange();
4166 return;
4167 }
4168 auto *PVD = dyn_cast<ParmVarDecl>(D);
4169 assert(PVD);
4170 auto *CaptureByAttr = S.ParseLifetimeCaptureByAttr(AL, PVD->getName());
4171 if (CaptureByAttr)
4172 D->addAttr(CaptureByAttr);
4173}
4174
4176 bool HasImplicitThisParam = hasImplicitObjectParameter(FD);
4178 for (ParmVarDecl *PVD : FD->parameters())
4179 if (auto *A = PVD->getAttr<LifetimeCaptureByAttr>())
4180 Attrs.push_back(A);
4181 if (HasImplicitThisParam) {
4182 TypeSourceInfo *TSI = FD->getTypeSourceInfo();
4183 if (!TSI)
4184 return;
4186 for (TypeLoc TL = TSI->getTypeLoc();
4187 (ATL = TL.getAsAdjusted<AttributedTypeLoc>());
4188 TL = ATL.getModifiedLoc()) {
4189 if (auto *A = ATL.getAttrAs<LifetimeCaptureByAttr>())
4190 Attrs.push_back(const_cast<LifetimeCaptureByAttr *>(A));
4191 }
4192 }
4193 if (Attrs.empty())
4194 return;
4195 llvm::StringMap<int> NameIdxMapping = {
4196 {"global", LifetimeCaptureByAttr::Global},
4197 {"unknown", LifetimeCaptureByAttr::Unknown}};
4198 int Idx = 0;
4199 if (HasImplicitThisParam) {
4200 NameIdxMapping["this"] = 0;
4201 Idx++;
4202 }
4203 for (const ParmVarDecl *PVD : FD->parameters())
4204 NameIdxMapping[PVD->getName()] = Idx++;
4205 auto DisallowReservedParams = [&](StringRef Reserved) {
4206 for (const ParmVarDecl *PVD : FD->parameters())
4207 if (PVD->getName() == Reserved)
4208 Diag(PVD->getLocation(), diag::err_capture_by_param_uses_reserved_name)
4209 << (PVD->getName() == "unknown");
4210 };
4211 for (auto *CapturedBy : Attrs) {
4212 const auto &Entities = CapturedBy->getArgIdents();
4213 for (size_t I = 0; I < Entities.size(); ++I) {
4214 StringRef Name = Entities[I]->getName();
4215 auto It = NameIdxMapping.find(Name);
4216 if (It == NameIdxMapping.end()) {
4217 auto Loc = CapturedBy->getArgLocs()[I];
4218 if (!HasImplicitThisParam && Name == "this")
4219 Diag(Loc, diag::err_capture_by_implicit_this_not_available) << Loc;
4220 else
4221 Diag(Loc, diag::err_capture_by_attribute_argument_unknown)
4222 << Entities[I] << Loc;
4223 continue;
4224 }
4225 if (Name == "unknown" || Name == "global")
4226 DisallowReservedParams(Name);
4227 CapturedBy->setParamIdx(I, It->second);
4228 }
4229 }
4230}
4231
4232static bool isFunctionLike(const Type &T) {
4233 // Check for explicit function types.
4234 // 'called_once' is only supported in Objective-C and it has
4235 // function pointers and block pointers.
4236 return T.isFunctionPointerType() || T.isBlockPointerType();
4237}
4238
4239/// Handle 'called_once' attribute.
4240static void handleCalledOnceAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4241 // 'called_once' only applies to parameters representing functions.
4242 QualType T = cast<ParmVarDecl>(D)->getType();
4243
4244 if (!isFunctionLike(*T)) {
4245 S.Diag(AL.getLoc(), diag::err_called_once_attribute_wrong_type);
4246 return;
4247 }
4248
4249 D->addAttr(::new (S.Context) CalledOnceAttr(S.Context, AL));
4250}
4251
4252static void handleTransparentUnionAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4253 // Try to find the underlying union declaration.
4254 RecordDecl *RD = nullptr;
4255 const auto *TD = dyn_cast<TypedefNameDecl>(D);
4256 if (TD && TD->getUnderlyingType()->isUnionType())
4257 RD = TD->getUnderlyingType()->getAsRecordDecl();
4258 else
4259 RD = dyn_cast<RecordDecl>(D);
4260
4261 if (!RD || !RD->isUnion()) {
4262 S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
4264 return;
4265 }
4266
4267 if (!RD->isCompleteDefinition()) {
4268 if (!RD->isBeingDefined())
4269 S.Diag(AL.getLoc(),
4270 diag::warn_transparent_union_attribute_not_definition);
4271 return;
4272 }
4273
4275 FieldEnd = RD->field_end();
4276 if (Field == FieldEnd) {
4277 S.Diag(AL.getLoc(), diag::warn_transparent_union_attribute_zero_fields);
4278 return;
4279 }
4280
4281 FieldDecl *FirstField = *Field;
4282 QualType FirstType = FirstField->getType();
4283 if (FirstType->hasFloatingRepresentation() || FirstType->isVectorType()) {
4284 S.Diag(FirstField->getLocation(),
4285 diag::warn_transparent_union_attribute_floating)
4286 << FirstType->isVectorType() << FirstType;
4287 return;
4288 }
4289
4290 if (FirstType->isIncompleteType())
4291 return;
4292 uint64_t FirstSize = S.Context.getTypeSize(FirstType);
4293 uint64_t FirstAlign = S.Context.getTypeAlign(FirstType);
4294 for (; Field != FieldEnd; ++Field) {
4295 QualType FieldType = Field->getType();
4296 if (FieldType->isIncompleteType())
4297 return;
4298 // FIXME: this isn't fully correct; we also need to test whether the
4299 // members of the union would all have the same calling convention as the
4300 // first member of the union. Checking just the size and alignment isn't
4301 // sufficient (consider structs passed on the stack instead of in registers
4302 // as an example).
4303 if (S.Context.getTypeSize(FieldType) != FirstSize ||
4304 S.Context.getTypeAlign(FieldType) > FirstAlign) {
4305 // Warn if we drop the attribute.
4306 bool isSize = S.Context.getTypeSize(FieldType) != FirstSize;
4307 unsigned FieldBits = isSize ? S.Context.getTypeSize(FieldType)
4308 : S.Context.getTypeAlign(FieldType);
4309 S.Diag(Field->getLocation(),
4310 diag::warn_transparent_union_attribute_field_size_align)
4311 << isSize << *Field << FieldBits;
4312 unsigned FirstBits = isSize ? FirstSize : FirstAlign;
4313 S.Diag(FirstField->getLocation(),
4314 diag::note_transparent_union_first_field_size_align)
4315 << isSize << FirstBits;
4316 return;
4317 }
4318 }
4319
4320 RD->addAttr(::new (S.Context) TransparentUnionAttr(S.Context, AL));
4321}
4322
4323static void handleAnnotateAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4324 auto *Attr = S.CreateAnnotationAttr(AL);
4325 if (Attr) {
4326 D->addAttr(Attr);
4327 }
4328}
4329
4330static void handleAlignValueAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4331 S.AddAlignValueAttr(D, AL, AL.getArgAsExpr(0));
4332}
4333
4335 SourceLocation AttrLoc = CI.getLoc();
4336
4337 QualType T;
4338 if (const auto *TD = dyn_cast<TypedefNameDecl>(D))
4339 T = TD->getUnderlyingType();
4340 else if (const auto *VD = dyn_cast<ValueDecl>(D))
4341 T = VD->getType();
4342 else
4343 llvm_unreachable("Unknown decl type for align_value");
4344
4345 if (!T->isDependentType() && !T->isAnyPointerType() &&
4346 !T->isReferenceType() && !T->isMemberPointerType()) {
4347 Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only)
4348 << CI << T << D->getSourceRange();
4349 return;
4350 }
4351
4352 if (!E->isValueDependent()) {
4353 llvm::APSInt Alignment;
4355 E, &Alignment, diag::err_align_value_attribute_argument_not_int);
4356 if (ICE.isInvalid())
4357 return;
4358
4359 if (!Alignment.isPowerOf2()) {
4360 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4361 << E->getSourceRange();
4362 return;
4363 }
4364
4365 D->addAttr(::new (Context) AlignValueAttr(Context, CI, ICE.get()));
4366 return;
4367 }
4368
4369 // Save dependent expressions in the AST to be instantiated.
4370 D->addAttr(::new (Context) AlignValueAttr(Context, CI, E));
4371}
4372
4373static void handleAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4374 if (AL.hasParsedType()) {
4375 const ParsedType &TypeArg = AL.getTypeArg();
4376 TypeSourceInfo *TInfo;
4377 (void)S.GetTypeFromParser(
4378 ParsedType::getFromOpaquePtr(TypeArg.getAsOpaquePtr()), &TInfo);
4379 if (AL.isPackExpansion() &&
4381 S.Diag(AL.getEllipsisLoc(),
4382 diag::err_pack_expansion_without_parameter_packs);
4383 return;
4384 }
4385
4386 if (!AL.isPackExpansion() &&
4388 TInfo, Sema::UPPC_Expression))
4389 return;
4390
4391 S.AddAlignedAttr(D, AL, TInfo, AL.isPackExpansion());
4392 return;
4393 }
4394
4395 // check the attribute arguments.
4396 if (AL.getNumArgs() > 1) {
4397 S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
4398 return;
4399 }
4400
4401 if (AL.getNumArgs() == 0) {
4402 D->addAttr(::new (S.Context) AlignedAttr(S.Context, AL, true, nullptr));
4403 return;
4404 }
4405
4406 Expr *E = AL.getArgAsExpr(0);
4408 S.Diag(AL.getEllipsisLoc(),
4409 diag::err_pack_expansion_without_parameter_packs);
4410 return;
4411 }
4412
4414 return;
4415
4416 S.AddAlignedAttr(D, AL, E, AL.isPackExpansion());
4417}
4418
4419/// Perform checking of type validity
4420///
4421/// C++11 [dcl.align]p1:
4422/// An alignment-specifier may be applied to a variable or to a class
4423/// data member, but it shall not be applied to a bit-field, a function
4424/// parameter, the formal parameter of a catch clause, or a variable
4425/// declared with the register storage class specifier. An
4426/// alignment-specifier may also be applied to the declaration of a class
4427/// or enumeration type.
4428/// CWG 2354:
4429/// CWG agreed to remove permission for alignas to be applied to
4430/// enumerations.
4431/// C11 6.7.5/2:
4432/// An alignment attribute shall not be specified in a declaration of
4433/// a typedef, or a bit-field, or a function, or a parameter, or an
4434/// object declared with the register storage-class specifier.
4436 const AlignedAttr &Attr,
4437 SourceLocation AttrLoc) {
4438 int DiagKind = -1;
4439 if (isa<ParmVarDecl>(D)) {
4440 DiagKind = 0;
4441 } else if (const auto *VD = dyn_cast<VarDecl>(D)) {
4442 if (VD->getStorageClass() == SC_Register)
4443 DiagKind = 1;
4444 if (VD->isExceptionVariable())
4445 DiagKind = 2;
4446 } else if (const auto *FD = dyn_cast<FieldDecl>(D)) {
4447 if (FD->isBitField())
4448 DiagKind = 3;
4449 } else if (const auto *ED = dyn_cast<EnumDecl>(D)) {
4450 if (ED->getLangOpts().CPlusPlus)
4451 DiagKind = 4;
4452 } else if (!isa<TagDecl>(D)) {
4453 return S.Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
4455 << (Attr.isC11() ? ExpectedVariableOrField
4457 }
4458 if (DiagKind != -1) {
4459 return S.Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
4460 << &Attr << DiagKind;
4461 }
4462 return false;
4463}
4464
4466 bool IsPackExpansion) {
4467 AlignedAttr TmpAttr(Context, CI, true, E);
4468 SourceLocation AttrLoc = CI.getLoc();
4469
4470 // C++11 alignas(...) and C11 _Alignas(...) have additional requirements.
4471 if (TmpAttr.isAlignas() &&
4472 validateAlignasAppliedType(*this, D, TmpAttr, AttrLoc))
4473 return;
4474
4475 if (E->isValueDependent()) {
4476 // We can't support a dependent alignment on a non-dependent type,
4477 // because we have no way to model that a type is "alignment-dependent"
4478 // but not dependent in any other way.
4479 if (const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4480 if (!TND->getUnderlyingType()->isDependentType()) {
4481 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4482 << E->getSourceRange();
4483 return;
4484 }
4485 }
4486
4487 // Save dependent expressions in the AST to be instantiated.
4488 AlignedAttr *AA = ::new (Context) AlignedAttr(Context, CI, true, E);
4489 AA->setPackExpansion(IsPackExpansion);
4490 D->addAttr(AA);
4491 return;
4492 }
4493
4494 // FIXME: Cache the number on the AL object?
4495 llvm::APSInt Alignment;
4497 E, &Alignment, diag::err_aligned_attribute_argument_not_int);
4498 if (ICE.isInvalid())
4499 return;
4500
4502 if (Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
4503 MaximumAlignment = std::min(MaximumAlignment, uint64_t(8192));
4504 if (Alignment > MaximumAlignment) {
4505 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
4507 return;
4508 }
4509
4510 uint64_t AlignVal = Alignment.getZExtValue();
4511 // C++11 [dcl.align]p2:
4512 // -- if the constant expression evaluates to zero, the alignment
4513 // specifier shall have no effect
4514 // C11 6.7.5p6:
4515 // An alignment specification of zero has no effect.
4516 if (!(TmpAttr.isAlignas() && !Alignment)) {
4517 if (!llvm::isPowerOf2_64(AlignVal)) {
4518 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4519 << E->getSourceRange();
4520 return;
4521 }
4522 }
4523
4524 const auto *VD = dyn_cast<VarDecl>(D);
4525 if (VD) {
4526 unsigned MaxTLSAlign =
4527 Context.toCharUnitsFromBits(Context.getTargetInfo().getMaxTLSAlign())
4528 .getQuantity();
4529 if (MaxTLSAlign && AlignVal > MaxTLSAlign &&
4530 VD->getTLSKind() != VarDecl::TLS_None) {
4531 Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
4532 << (unsigned)AlignVal << VD << MaxTLSAlign;
4533 return;
4534 }
4535 }
4536
4537 // On AIX, an aligned attribute can not decrease the alignment when applied
4538 // to a variable declaration with vector type.
4539 if (VD && Context.getTargetInfo().getTriple().isOSAIX()) {
4540 const Type *Ty = VD->getType().getTypePtr();
4541 if (Ty->isVectorType() && AlignVal < 16) {
4542 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4543 << VD->getType() << 16;
4544 return;
4545 }
4546 }
4547
4548 AlignedAttr *AA = ::new (Context) AlignedAttr(Context, CI, true, ICE.get());
4549 AA->setPackExpansion(IsPackExpansion);
4550 AA->setCachedAlignmentValue(
4551 static_cast<unsigned>(AlignVal * Context.getCharWidth()));
4552 D->addAttr(AA);
4553}
4554
4556 TypeSourceInfo *TS, bool IsPackExpansion) {
4557 AlignedAttr TmpAttr(Context, CI, false, TS);
4558 SourceLocation AttrLoc = CI.getLoc();
4559
4560 // C++11 alignas(...) and C11 _Alignas(...) have additional requirements.
4561 if (TmpAttr.isAlignas() &&
4562 validateAlignasAppliedType(*this, D, TmpAttr, AttrLoc))
4563 return;
4564
4565 if (TS->getType()->isDependentType()) {
4566 // We can't support a dependent alignment on a non-dependent type,
4567 // because we have no way to model that a type is "type-dependent"
4568 // but not dependent in any other way.
4569 if (const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4570 if (!TND->getUnderlyingType()->isDependentType()) {
4571 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4572 << TS->getTypeLoc().getSourceRange();
4573 return;
4574 }
4575 }
4576
4577 AlignedAttr *AA = ::new (Context) AlignedAttr(Context, CI, false, TS);
4578 AA->setPackExpansion(IsPackExpansion);
4579 D->addAttr(AA);
4580 return;
4581 }
4582
4583 const auto *VD = dyn_cast<VarDecl>(D);
4584 unsigned AlignVal = TmpAttr.getAlignment(Context);
4585 // On AIX, an aligned attribute can not decrease the alignment when applied
4586 // to a variable declaration with vector type.
4587 if (VD && Context.getTargetInfo().getTriple().isOSAIX()) {
4588 const Type *Ty = VD->getType().getTypePtr();
4589 if (Ty->isVectorType() &&
4590 Context.toCharUnitsFromBits(AlignVal).getQuantity() < 16) {
4591 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4592 << VD->getType() << 16;
4593 return;
4594 }
4595 }
4596
4597 AlignedAttr *AA = ::new (Context) AlignedAttr(Context, CI, false, TS);
4598 AA->setPackExpansion(IsPackExpansion);
4599 AA->setCachedAlignmentValue(AlignVal);
4600 D->addAttr(AA);
4601}
4602
4604 assert(D->hasAttrs() && "no attributes on decl");
4605
4606 QualType UnderlyingTy, DiagTy;
4607 if (const auto *VD = dyn_cast<ValueDecl>(D)) {
4608 UnderlyingTy = DiagTy = VD->getType();
4609 } else {
4610 UnderlyingTy = DiagTy = Context.getCanonicalTagType(cast<TagDecl>(D));
4611 if (const auto *ED = dyn_cast<EnumDecl>(D))
4612 UnderlyingTy = ED->getIntegerType();
4613 }
4614 if (DiagTy->isDependentType() || DiagTy->isIncompleteType())
4615 return;
4616
4617 // C++11 [dcl.align]p5, C11 6.7.5/4:
4618 // The combined effect of all alignment attributes in a declaration shall
4619 // not specify an alignment that is less strict than the alignment that
4620 // would otherwise be required for the entity being declared.
4621 AlignedAttr *AlignasAttr = nullptr;
4622 AlignedAttr *LastAlignedAttr = nullptr;
4623 unsigned Align = 0;
4624 for (auto *I : D->specific_attrs<AlignedAttr>()) {
4625 if (I->isAlignmentDependent())
4626 return;
4627 if (I->isAlignas())
4628 AlignasAttr = I;
4629 Align = std::max(Align, I->getAlignment(Context));
4630 LastAlignedAttr = I;
4631 }
4632
4633 if (Align && DiagTy->isSizelessType()) {
4634 Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
4635 << LastAlignedAttr << DiagTy;
4636 } else if (AlignasAttr && Align) {
4637 CharUnits RequestedAlign = Context.toCharUnitsFromBits(Align);
4638 CharUnits NaturalAlign = Context.getTypeAlignInChars(UnderlyingTy);
4639 if (NaturalAlign > RequestedAlign)
4640 Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
4641 << DiagTy << (unsigned)NaturalAlign.getQuantity();
4642 }
4643}
4644
4646 CXXRecordDecl *RD, SourceRange Range, bool BestCase,
4647 MSInheritanceModel ExplicitModel) {
4648 assert(RD->hasDefinition() && "RD has no definition!");
4649
4650 // We may not have seen base specifiers or any virtual methods yet. We will
4651 // have to wait until the record is defined to catch any mismatches.
4652 if (!RD->getDefinition()->isCompleteDefinition())
4653 return false;
4654
4655 // The unspecified model never matches what a definition could need.
4656 if (ExplicitModel == MSInheritanceModel::Unspecified)
4657 return false;
4658
4659 if (BestCase) {
4660 if (RD->calculateInheritanceModel() == ExplicitModel)
4661 return false;
4662 } else {
4663 if (RD->calculateInheritanceModel() <= ExplicitModel)
4664 return false;
4665 }
4666
4667 Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
4668 << 0 /*definition*/;
4669 Diag(RD->getDefinition()->getLocation(), diag::note_defined_here) << RD;
4670 return true;
4671}
4672
4673/// parseModeAttrArg - Parses attribute mode string and returns parsed type
4674/// attribute.
4675static void parseModeAttrArg(Sema &S, StringRef Str, unsigned &DestWidth,
4676 bool &IntegerMode, bool &ComplexMode,
4677 FloatModeKind &ExplicitType) {
4678 IntegerMode = true;
4679 ComplexMode = false;
4680 ExplicitType = FloatModeKind::NoFloat;
4681 switch (Str.size()) {
4682 case 2:
4683 switch (Str[0]) {
4684 case 'Q':
4685 DestWidth = 8;
4686 break;
4687 case 'H':
4688 DestWidth = 16;
4689 break;
4690 case 'S':
4691 DestWidth = 32;
4692 break;
4693 case 'D':
4694 DestWidth = 64;
4695 break;
4696 case 'X':
4697 DestWidth = 96;
4698 break;
4699 case 'K': // KFmode - IEEE quad precision (__float128)
4700 ExplicitType = FloatModeKind::Float128;
4701 DestWidth = Str[1] == 'I' ? 0 : 128;
4702 break;
4703 case 'T':
4704 ExplicitType = FloatModeKind::LongDouble;
4705 DestWidth = 128;
4706 break;
4707 case 'I':
4708 ExplicitType = FloatModeKind::Ibm128;
4709 DestWidth = Str[1] == 'I' ? 0 : 128;
4710 break;
4711 }
4712 if (Str[1] == 'F') {
4713 IntegerMode = false;
4714 } else if (Str[1] == 'C') {
4715 IntegerMode = false;
4716 ComplexMode = true;
4717 } else if (Str[1] != 'I') {
4718 DestWidth = 0;
4719 }
4720 break;
4721 case 4:
4722 // FIXME: glibc uses 'word' to define register_t; this is narrower than a
4723 // pointer on PIC16 and other embedded platforms.
4724 if (Str == "word")
4725 DestWidth = S.Context.getTargetInfo().getRegisterWidth();
4726 else if (Str == "byte")
4727 DestWidth = S.Context.getTargetInfo().getCharWidth();
4728 break;
4729 case 7:
4730 if (Str == "pointer")
4732 break;
4733 case 11:
4734 if (Str == "unwind_word")
4735 DestWidth = S.Context.getTargetInfo().getUnwindWordWidth();
4736 break;
4737 }
4738}
4739
4740/// handleModeAttr - This attribute modifies the width of a decl with primitive
4741/// type.
4742///
4743/// Despite what would be logical, the mode attribute is a decl attribute, not a
4744/// type attribute: 'int ** __attribute((mode(HI))) *G;' tries to make 'G' be
4745/// HImode, not an intermediate pointer.
4746static void handleModeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4747 // This attribute isn't documented, but glibc uses it. It changes
4748 // the width of an int or unsigned int to the specified size.
4749 if (!AL.isArgIdent(0)) {
4750 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
4751 << AL << AANT_ArgumentIdentifier;
4752 return;
4753 }
4754
4756
4757 S.AddModeAttr(D, AL, Name);
4758}
4759
4761 IdentifierInfo *Name, bool InInstantiation) {
4762 StringRef Str = Name->getName();
4763 normalizeName(Str);
4764 SourceLocation AttrLoc = CI.getLoc();
4765
4766 unsigned DestWidth = 0;
4767 bool IntegerMode = true;
4768 bool ComplexMode = false;
4770 llvm::APInt VectorSize(64, 0);
4771 if (Str.size() >= 4 && Str[0] == 'V') {
4772 // Minimal length of vector mode is 4: 'V' + NUMBER(>=1) + TYPE(>=2).
4773 size_t StrSize = Str.size();
4774 size_t VectorStringLength = 0;
4775 while ((VectorStringLength + 1) < StrSize &&
4776 isdigit(Str[VectorStringLength + 1]))
4777 ++VectorStringLength;
4778 if (VectorStringLength &&
4779 !Str.substr(1, VectorStringLength).getAsInteger(10, VectorSize) &&
4780 VectorSize.isPowerOf2()) {
4781 parseModeAttrArg(*this, Str.substr(VectorStringLength + 1), DestWidth,
4782 IntegerMode, ComplexMode, ExplicitType);
4783 // Avoid duplicate warning from template instantiation.
4784 if (!InInstantiation)
4785 Diag(AttrLoc, diag::warn_vector_mode_deprecated);
4786 } else {
4787 VectorSize = 0;
4788 }
4789 }
4790
4791 if (!VectorSize)
4792 parseModeAttrArg(*this, Str, DestWidth, IntegerMode, ComplexMode,
4793 ExplicitType);
4794
4795 // FIXME: Sync this with InitializePredefinedMacros; we need to match int8_t
4796 // and friends, at least with glibc.
4797 // FIXME: Make sure floating-point mappings are accurate
4798 // FIXME: Support XF and TF types
4799 if (!DestWidth) {
4800 Diag(AttrLoc, diag::err_machine_mode) << 0 /*Unknown*/ << Name;
4801 return;
4802 }
4803
4804 QualType OldTy;
4805 if (const auto *TD = dyn_cast<TypedefNameDecl>(D))
4806 OldTy = TD->getUnderlyingType();
4807 else if (const auto *ED = dyn_cast<EnumDecl>(D)) {
4808 // Something like 'typedef enum { X } __attribute__((mode(XX))) T;'.
4809 // Try to get type from enum declaration, default to int.
4810 OldTy = ED->getIntegerType();
4811 if (OldTy.isNull())
4812 OldTy = Context.IntTy;
4813 } else
4814 OldTy = cast<ValueDecl>(D)->getType();
4815
4816 if (OldTy->isDependentType()) {
4817 D->addAttr(::new (Context) ModeAttr(Context, CI, Name));
4818 return;
4819 }
4820
4821 // Base type can also be a vector type (see PR17453).
4822 // Distinguish between base type and base element type.
4823 QualType OldElemTy = OldTy;
4824 if (const auto *VT = OldTy->getAs<VectorType>())
4825 OldElemTy = VT->getElementType();
4826
4827 // GCC allows 'mode' attribute on enumeration types (even incomplete), except
4828 // for vector modes. So, 'enum X __attribute__((mode(QI)));' forms a complete
4829 // type, 'enum { A } __attribute__((mode(V4SI)))' is rejected.
4830 if ((isa<EnumDecl>(D) || OldElemTy->isEnumeralType()) &&
4831 VectorSize.getBoolValue()) {
4832 Diag(AttrLoc, diag::err_enum_mode_vector_type) << Name << CI.getRange();
4833 return;
4834 }
4835 bool IntegralOrAnyEnumType = (OldElemTy->isIntegralOrEnumerationType() &&
4836 !OldElemTy->isBitIntType()) ||
4837 OldElemTy->isEnumeralType();
4838
4839 if (!OldElemTy->getAs<BuiltinType>() && !OldElemTy->isComplexType() &&
4840 !IntegralOrAnyEnumType)
4841 Diag(AttrLoc, diag::err_mode_not_primitive);
4842 else if (IntegerMode) {
4843 if (!IntegralOrAnyEnumType)
4844 Diag(AttrLoc, diag::err_mode_wrong_type);
4845 } else if (ComplexMode) {
4846 if (!OldElemTy->isComplexType())
4847 Diag(AttrLoc, diag::err_mode_wrong_type);
4848 } else {
4849 if (!OldElemTy->isFloatingType())
4850 Diag(AttrLoc, diag::err_mode_wrong_type);
4851 }
4852
4853 QualType NewElemTy;
4854
4855 if (IntegerMode)
4856 NewElemTy = Context.getIntTypeForBitwidth(DestWidth,
4857 OldElemTy->isSignedIntegerType());
4858 else
4859 NewElemTy = Context.getRealTypeForBitwidth(DestWidth, ExplicitType);
4860
4861 if (NewElemTy.isNull()) {
4862 // Only emit diagnostic on host for 128-bit mode attribute
4863 if (!(DestWidth == 128 &&
4864 (getLangOpts().CUDAIsDevice || getLangOpts().SYCLIsDevice)))
4865 Diag(AttrLoc, diag::err_machine_mode) << 1 /*Unsupported*/ << Name;
4866 return;
4867 }
4868
4869 if (ComplexMode) {
4870 NewElemTy = Context.getComplexType(NewElemTy);
4871 }
4872
4873 QualType NewTy = NewElemTy;
4874 if (VectorSize.getBoolValue()) {
4875 NewTy = Context.getVectorType(NewTy, VectorSize.getZExtValue(),
4877 } else if (const auto *OldVT = OldTy->getAs<VectorType>()) {
4878 // Complex machine mode does not support base vector types.
4879 if (ComplexMode) {
4880 Diag(AttrLoc, diag::err_complex_mode_vector_type);
4881 return;
4882 }
4883 unsigned NumElements = Context.getTypeSize(OldElemTy) *
4884 OldVT->getNumElements() /
4885 Context.getTypeSize(NewElemTy);
4886 NewTy =
4887 Context.getVectorType(NewElemTy, NumElements, OldVT->getVectorKind());
4888 }
4889
4890 if (NewTy.isNull()) {
4891 Diag(AttrLoc, diag::err_mode_wrong_type);
4892 return;
4893 }
4894
4895 // Install the new type.
4896 if (auto *TD = dyn_cast<TypedefNameDecl>(D))
4897 TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
4898 else if (auto *ED = dyn_cast<EnumDecl>(D))
4899 ED->setIntegerType(NewTy);
4900 else
4901 cast<ValueDecl>(D)->setType(NewTy);
4902
4903 D->addAttr(::new (Context) ModeAttr(Context, CI, Name));
4904}
4905
4906static void handleNonStringAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4907 // This only applies to fields and variable declarations which have an array
4908 // type or pointer type, with character elements.
4909 QualType QT = cast<ValueDecl>(D)->getType();
4910 if ((!QT->isArrayType() && !QT->isPointerType()) ||
4912 S.Diag(D->getBeginLoc(), diag::warn_attribute_non_character_array)
4913 << AL << AL.isRegularKeywordAttribute() << QT << AL.getRange();
4914 return;
4915 }
4916
4917 D->addAttr(::new (S.Context) NonStringAttr(S.Context, AL));
4918}
4919
4920static void handleNoDebugAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
4921 D->addAttr(::new (S.Context) NoDebugAttr(S.Context, AL));
4922}
4923
4925 const AttributeCommonInfo &CI,
4926 const IdentifierInfo *Ident) {
4927 if (OptimizeNoneAttr *Optnone = D->getAttr<OptimizeNoneAttr>()) {
4928 Diag(CI.getLoc(), diag::warn_attribute_ignored) << Ident;
4929 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
4930 return nullptr;
4931 }
4932
4933 if (D->hasAttr<AlwaysInlineAttr>())
4934 return nullptr;
4935
4936 return ::new (Context) AlwaysInlineAttr(Context, CI);
4937}
4938
4939InternalLinkageAttr *Sema::mergeInternalLinkageAttr(Decl *D,
4940 const ParsedAttr &AL) {
4941 if (const auto *VD = dyn_cast<VarDecl>(D)) {
4942 // Attribute applies to Var but not any subclass of it (like ParmVar,
4943 // ImplicitParm or VarTemplateSpecialization).
4944 if (VD->getKind() != Decl::Var) {
4945 Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
4946 << AL << AL.isRegularKeywordAttribute()
4949 return nullptr;
4950 }
4951 // Attribute does not apply to non-static local variables.
4952 if (VD->hasLocalStorage()) {
4953 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
4954 return nullptr;
4955 }
4956 }
4957
4958 return ::new (Context) InternalLinkageAttr(Context, AL);
4959}
4960InternalLinkageAttr *
4961Sema::mergeInternalLinkageAttr(Decl *D, const InternalLinkageAttr &AL) {
4962 if (const auto *VD = dyn_cast<VarDecl>(D)) {
4963 // Attribute applies to Var but not any subclass of it (like ParmVar,
4964 // ImplicitParm or VarTemplateSpecialization).
4965 if (VD->getKind() != Decl::Var) {
4966 Diag(AL.getLocation(), diag::warn_attribute_wrong_decl_type)
4967 << &AL << AL.isRegularKeywordAttribute()
4970 return nullptr;
4971 }
4972 // Attribute does not apply to non-static local variables.
4973 if (VD->hasLocalStorage()) {
4974 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
4975 return nullptr;
4976 }
4977 }
4978
4979 return ::new (Context) InternalLinkageAttr(Context, AL);
4980}
4981
4983 if (OptimizeNoneAttr *Optnone = D->getAttr<OptimizeNoneAttr>()) {
4984 Diag(CI.getLoc(), diag::warn_attribute_ignored) << "'minsize'";
4985 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
4986 return nullptr;
4987 }
4988
4989 if (D->hasAttr<MinSizeAttr>())
4990 return nullptr;
4991
4992 return ::new (Context) MinSizeAttr(Context, CI);
4993}
4994
4996 const AttributeCommonInfo &CI) {
4997 if (AlwaysInlineAttr *Inline = D->getAttr<AlwaysInlineAttr>()) {
4998 Diag(Inline->getLocation(), diag::warn_attribute_ignored) << Inline;
4999 Diag(CI.getLoc(), diag::note_conflicting_attribute);
5000 D->dropAttr<AlwaysInlineAttr>();
5001 }
5002 if (MinSizeAttr *MinSize = D->getAttr<MinSizeAttr>()) {
5003 Diag(MinSize->getLocation(), diag::warn_attribute_ignored) << MinSize;
5004 Diag(CI.getLoc(), diag::note_conflicting_attribute);
5005 D->dropAttr<MinSizeAttr>();
5006 }
5007
5008 if (D->hasAttr<OptimizeNoneAttr>())
5009 return nullptr;
5010
5011 return ::new (Context) OptimizeNoneAttr(Context, CI);
5012}
5013
5014static void handleAlwaysInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5015 if (AlwaysInlineAttr *Inline =
5016 S.mergeAlwaysInlineAttr(D, AL, AL.getAttrName()))
5017 D->addAttr(Inline);
5018}
5019
5020static void handleMinSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5021 if (MinSizeAttr *MinSize = S.mergeMinSizeAttr(D, AL))
5022 D->addAttr(MinSize);
5023}
5024
5025static void handleOptimizeNoneAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5026 if (OptimizeNoneAttr *Optnone = S.mergeOptimizeNoneAttr(D, AL))
5027 D->addAttr(Optnone);
5028}
5029
5030static void handleConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5031 const auto *VD = cast<VarDecl>(D);
5032 if (VD->hasLocalStorage()) {
5033 S.Diag(AL.getLoc(), diag::err_cuda_nonstatic_constdev);
5034 return;
5035 }
5036 // constexpr variable may already get an implicit constant attr, which should
5037 // be replaced by the explicit constant attr.
5038 if (auto *A = D->getAttr<CUDAConstantAttr>()) {
5039 if (!A->isImplicit())
5040 return;
5041 D->dropAttr<CUDAConstantAttr>();
5042 }
5043 D->addAttr(::new (S.Context) CUDAConstantAttr(S.Context, AL));
5044}
5045
5046static void handleSharedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5047 const auto *VD = cast<VarDecl>(D);
5048 // extern __shared__ is only allowed on arrays with no length (e.g.
5049 // "int x[]").
5050 if (!S.getLangOpts().GPURelocatableDeviceCode && VD->hasExternalStorage() &&
5051 !isa<IncompleteArrayType>(VD->getType())) {
5052 S.Diag(AL.getLoc(), diag::err_cuda_extern_shared) << VD;
5053 return;
5054 }
5055 if (S.getLangOpts().CUDA && VD->hasLocalStorage() &&
5056 S.CUDA().DiagIfHostCode(AL.getLoc(), diag::err_cuda_host_shared)
5057 << S.CUDA().CurrentTarget())
5058 return;
5059 D->addAttr(::new (S.Context) CUDASharedAttr(S.Context, AL));
5060}
5061
5062static void handleGlobalAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5063 const auto *FD = cast<FunctionDecl>(D);
5064 if (!FD->getReturnType()->isVoidType() &&
5065 !FD->getReturnType()->getAs<AutoType>() &&
5067 SourceRange RTRange = FD->getReturnTypeSourceRange();
5068 S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
5069 << FD->getType()
5070 << (RTRange.isValid() ? FixItHint::CreateReplacement(RTRange, "void")
5071 : FixItHint());
5072 return;
5073 }
5074 if (const auto *Method = dyn_cast<CXXMethodDecl>(FD)) {
5075 if (Method->isInstance()) {
5076 S.Diag(Method->getBeginLoc(), diag::err_kern_is_nonstatic_method)
5077 << Method;
5078 return;
5079 }
5080 S.Diag(Method->getBeginLoc(), diag::warn_kern_is_method) << Method;
5081 }
5082 // Only warn for "inline" when compiling for host, to cut down on noise.
5083 if (FD->isInlineSpecified() && !S.getLangOpts().CUDAIsDevice)
5084 S.Diag(FD->getBeginLoc(), diag::warn_kern_is_inline) << FD;
5085
5086 if (AL.getKind() == ParsedAttr::AT_DeviceKernel)
5087 D->addAttr(::new (S.Context) DeviceKernelAttr(S.Context, AL));
5088 else
5089 D->addAttr(::new (S.Context) CUDAGlobalAttr(S.Context, AL));
5090 // In host compilation the kernel is emitted as a stub function, which is
5091 // a helper function for launching the kernel. The instructions in the helper
5092 // function has nothing to do with the source code of the kernel. Do not emit
5093 // debug info for the stub function to avoid confusing the debugger.
5094 if (S.LangOpts.HIP && !S.LangOpts.CUDAIsDevice)
5095 D->addAttr(NoDebugAttr::CreateImplicit(S.Context));
5096}
5097
5098static void handleDeviceAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5099 if (const auto *VD = dyn_cast<VarDecl>(D)) {
5100 if (VD->hasLocalStorage()) {
5101 S.Diag(AL.getLoc(), diag::err_cuda_nonstatic_constdev);
5102 return;
5103 }
5104 }
5105
5106 if (auto *A = D->getAttr<CUDADeviceAttr>()) {
5107 if (!A->isImplicit())
5108 return;
5109 D->dropAttr<CUDADeviceAttr>();
5110 }
5111 D->addAttr(::new (S.Context) CUDADeviceAttr(S.Context, AL));
5112}
5113
5114static void handleManagedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5115 if (const auto *VD = dyn_cast<VarDecl>(D)) {
5116 if (VD->hasLocalStorage()) {
5117 S.Diag(AL.getLoc(), diag::err_cuda_nonstatic_constdev);
5118 return;
5119 }
5120 }
5121 if (!D->hasAttr<HIPManagedAttr>())
5122 D->addAttr(::new (S.Context) HIPManagedAttr(S.Context, AL));
5123 if (!D->hasAttr<CUDADeviceAttr>())
5124 D->addAttr(CUDADeviceAttr::CreateImplicit(S.Context));
5125}
5126
5127static void handleGridConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5128 if (D->isInvalidDecl())
5129 return;
5130 // Whether __grid_constant__ is allowed to be used will be checked in
5131 // Sema::CheckFunctionDeclaration as we need complete function decl to make
5132 // the call.
5133 D->addAttr(::new (S.Context) CUDAGridConstantAttr(S.Context, AL));
5134}
5135
5136static void handleGNUInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5137 const auto *Fn = cast<FunctionDecl>(D);
5138 if (!Fn->isInlineSpecified()) {
5139 S.Diag(AL.getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
5140 return;
5141 }
5142
5143 if (S.LangOpts.CPlusPlus && Fn->getStorageClass() != SC_Extern)
5144 S.Diag(AL.getLoc(), diag::warn_gnu_inline_cplusplus_without_extern);
5145
5146 D->addAttr(::new (S.Context) GNUInlineAttr(S.Context, AL));
5147}
5148
5149static void handleCallConvAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5150 if (hasDeclarator(D)) return;
5151
5152 // Diagnostic is emitted elsewhere: here we store the (valid) AL
5153 // in the Decl node for syntactic reasoning, e.g., pretty-printing.
5154 CallingConv CC;
5156 AL, CC, /*FD*/ nullptr,
5157 S.CUDA().IdentifyTarget(dyn_cast<FunctionDecl>(D))))
5158 return;
5159
5160 if (!isa<ObjCMethodDecl>(D)) {
5161 S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
5163 return;
5164 }
5165
5166 switch (AL.getKind()) {
5167 case ParsedAttr::AT_FastCall:
5168 D->addAttr(::new (S.Context) FastCallAttr(S.Context, AL));
5169 return;
5170 case ParsedAttr::AT_StdCall:
5171 D->addAttr(::new (S.Context) StdCallAttr(S.Context, AL));
5172 return;
5173 case ParsedAttr::AT_ThisCall:
5174 D->addAttr(::new (S.Context) ThisCallAttr(S.Context, AL));
5175 return;
5176 case ParsedAttr::AT_CDecl:
5177 D->addAttr(::new (S.Context) CDeclAttr(S.Context, AL));
5178 return;
5179 case ParsedAttr::AT_Pascal:
5180 D->addAttr(::new (S.Context) PascalAttr(S.Context, AL));
5181 return;
5182 case ParsedAttr::AT_SwiftCall:
5183 D->addAttr(::new (S.Context) SwiftCallAttr(S.Context, AL));
5184 return;
5185 case ParsedAttr::AT_SwiftAsyncCall:
5186 D->addAttr(::new (S.Context) SwiftAsyncCallAttr(S.Context, AL));
5187 return;
5188 case ParsedAttr::AT_VectorCall:
5189 D->addAttr(::new (S.Context) VectorCallAttr(S.Context, AL));
5190 return;
5191 case ParsedAttr::AT_MSABI:
5192 D->addAttr(::new (S.Context) MSABIAttr(S.Context, AL));
5193 return;
5194 case ParsedAttr::AT_SysVABI:
5195 D->addAttr(::new (S.Context) SysVABIAttr(S.Context, AL));
5196 return;
5197 case ParsedAttr::AT_RegCall:
5198 D->addAttr(::new (S.Context) RegCallAttr(S.Context, AL));
5199 return;
5200 case ParsedAttr::AT_Pcs: {
5201 PcsAttr::PCSType PCS;
5202 switch (CC) {
5203 case CC_AAPCS:
5204 PCS = PcsAttr::AAPCS;
5205 break;
5206 case CC_AAPCS_VFP:
5207 PCS = PcsAttr::AAPCS_VFP;
5208 break;
5209 default:
5210 llvm_unreachable("unexpected calling convention in pcs attribute");
5211 }
5212
5213 D->addAttr(::new (S.Context) PcsAttr(S.Context, AL, PCS));
5214 return;
5215 }
5216 case ParsedAttr::AT_AArch64VectorPcs:
5217 D->addAttr(::new (S.Context) AArch64VectorPcsAttr(S.Context, AL));
5218 return;
5219 case ParsedAttr::AT_AArch64SVEPcs:
5220 D->addAttr(::new (S.Context) AArch64SVEPcsAttr(S.Context, AL));
5221 return;
5222 case ParsedAttr::AT_DeviceKernel: {
5223 // The attribute should already be applied.
5224 assert(D->hasAttr<DeviceKernelAttr>() && "Expected attribute");
5225 return;
5226 }
5227 case ParsedAttr::AT_IntelOclBicc:
5228 D->addAttr(::new (S.Context) IntelOclBiccAttr(S.Context, AL));
5229 return;
5230 case ParsedAttr::AT_PreserveMost:
5231 D->addAttr(::new (S.Context) PreserveMostAttr(S.Context, AL));
5232 return;
5233 case ParsedAttr::AT_PreserveAll:
5234 D->addAttr(::new (S.Context) PreserveAllAttr(S.Context, AL));
5235 return;
5236 case ParsedAttr::AT_M68kRTD:
5237 D->addAttr(::new (S.Context) M68kRTDAttr(S.Context, AL));
5238 return;
5239 case ParsedAttr::AT_PreserveNone:
5240 D->addAttr(::new (S.Context) PreserveNoneAttr(S.Context, AL));
5241 return;
5242 case ParsedAttr::AT_RISCVVectorCC:
5243 D->addAttr(::new (S.Context) RISCVVectorCCAttr(S.Context, AL));
5244 return;
5245 case ParsedAttr::AT_RISCVVLSCC: {
5246 // If the riscv_abi_vlen doesn't have any argument, default ABI_VLEN is 128.
5247 unsigned VectorLength = 128;
5248 if (AL.getNumArgs() &&
5250 return;
5252 S.Diag(AL.getLoc(), diag::err_argument_invalid_range)
5253 << VectorLength << 32 << 65536;
5254 return;
5255 }
5256 if (!llvm::isPowerOf2_64(VectorLength)) {
5257 S.Diag(AL.getLoc(), diag::err_argument_not_power_of_2);
5258 return;
5259 }
5260
5261 D->addAttr(::new (S.Context) RISCVVLSCCAttr(S.Context, AL, VectorLength));
5262 return;
5263 }
5264 default:
5265 llvm_unreachable("unexpected attribute kind");
5266 }
5267}
5268
5269static void handleDeviceKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5270 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
5271 bool IsFunctionTemplate = FD && FD->getDescribedFunctionTemplate();
5272 llvm::Triple Triple = S.getASTContext().getTargetInfo().getTriple();
5273 const LangOptions &LangOpts = S.getLangOpts();
5274 // OpenCL has its own error messages.
5275 if (!LangOpts.OpenCL && FD && !FD->isExternallyVisible()) {
5276 S.Diag(AL.getLoc(), diag::err_hidden_device_kernel) << FD;
5277 AL.setInvalid();
5278 return;
5279 }
5280 if (Triple.isNVPTX()) {
5281 handleGlobalAttr(S, D, AL);
5282 } else {
5283 // OpenCL C++ will throw a more specific error.
5284 if (!LangOpts.OpenCLCPlusPlus && (!FD || IsFunctionTemplate)) {
5285 S.Diag(AL.getLoc(), diag::err_attribute_wrong_decl_type_str)
5286 << AL << AL.isRegularKeywordAttribute() << "functions";
5287 AL.setInvalid();
5288 return;
5289 }
5291 }
5292 // TODO: isGPU() should probably return true for SPIR.
5293 bool TargetDeviceEnvironment = Triple.isGPU() || Triple.isSPIR() ||
5294 LangOpts.isTargetDevice() || LangOpts.OpenCL;
5295 if (!TargetDeviceEnvironment) {
5296 S.Diag(AL.getLoc(), diag::warn_cconv_unsupported)
5298 AL.setInvalid();
5299 return;
5300 }
5301
5302 // Make sure we validate the CC with the target
5303 // and warn/error if necessary.
5304 handleCallConvAttr(S, D, AL);
5305}
5306
5307static void handleSuppressAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5308 if (AL.getAttributeSpellingListIndex() == SuppressAttr::CXX11_gsl_suppress) {
5309 // Suppression attribute with GSL spelling requires at least 1 argument.
5310 if (!AL.checkAtLeastNumArgs(S, 1))
5311 return;
5312 }
5313
5314 std::vector<StringRef> DiagnosticIdentifiers;
5315 for (unsigned I = 0, E = AL.getNumArgs(); I != E; ++I) {
5316 StringRef RuleName;
5317
5318 if (!S.checkStringLiteralArgumentAttr(AL, I, RuleName, nullptr))
5319 return;
5320
5321 DiagnosticIdentifiers.push_back(RuleName);
5322 }
5323 D->addAttr(::new (S.Context)
5324 SuppressAttr(S.Context, AL, DiagnosticIdentifiers.data(),
5325 DiagnosticIdentifiers.size()));
5326}
5327
5328static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5329 TypeSourceInfo *DerefTypeLoc = nullptr;
5330 QualType ParmType;
5331 if (AL.hasParsedType()) {
5332 ParmType = S.GetTypeFromParser(AL.getTypeArg(), &DerefTypeLoc);
5333
5334 unsigned SelectIdx = ~0U;
5335 if (ParmType->isReferenceType())
5336 SelectIdx = 0;
5337 else if (ParmType->isArrayType())
5338 SelectIdx = 1;
5339
5340 if (SelectIdx != ~0U) {
5341 S.Diag(AL.getLoc(), diag::err_attribute_invalid_argument)
5342 << SelectIdx << AL;
5343 return;
5344 }
5345 }
5346
5347 // To check if earlier decl attributes do not conflict the newly parsed ones
5348 // we always add (and check) the attribute to the canonical decl. We need
5349 // to repeat the check for attribute mutual exclusion because we're attaching
5350 // all of the attributes to the canonical declaration rather than the current
5351 // declaration.
5352 D = D->getCanonicalDecl();
5353 if (AL.getKind() == ParsedAttr::AT_Owner) {
5355 return;
5356 if (const auto *OAttr = D->getAttr<OwnerAttr>()) {
5357 const Type *ExistingDerefType = OAttr->getDerefTypeLoc()
5358 ? OAttr->getDerefType().getTypePtr()
5359 : nullptr;
5360 if (ExistingDerefType != ParmType.getTypePtrOrNull()) {
5361 S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)
5362 << AL << OAttr
5363 << (AL.isRegularKeywordAttribute() ||
5364 OAttr->isRegularKeywordAttribute());
5365 S.Diag(OAttr->getLocation(), diag::note_conflicting_attribute);
5366 }
5367 return;
5368 }
5369 for (Decl *Redecl : D->redecls()) {
5370 Redecl->addAttr(::new (S.Context) OwnerAttr(S.Context, AL, DerefTypeLoc));
5371 }
5372 } else {
5374 return;
5375 if (const auto *PAttr = D->getAttr<PointerAttr>()) {
5376 const Type *ExistingDerefType = PAttr->getDerefTypeLoc()
5377 ? PAttr->getDerefType().getTypePtr()
5378 : nullptr;
5379 if (ExistingDerefType != ParmType.getTypePtrOrNull()) {
5380 S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)
5381 << AL << PAttr
5382 << (AL.isRegularKeywordAttribute() ||
5383 PAttr->isRegularKeywordAttribute());
5384 S.Diag(PAttr->getLocation(), diag::note_conflicting_attribute);
5385 }
5386 return;
5387 }
5388 for (Decl *Redecl : D->redecls()) {
5389 Redecl->addAttr(::new (S.Context)
5390 PointerAttr(S.Context, AL, DerefTypeLoc));
5391 }
5392 }
5393}
5394
5395static void handleRandomizeLayoutAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5397 return;
5398 if (!D->hasAttr<RandomizeLayoutAttr>())
5399 D->addAttr(::new (S.Context) RandomizeLayoutAttr(S.Context, AL));
5400}
5401
5403 const ParsedAttr &AL) {
5405 return;
5406 if (!D->hasAttr<NoRandomizeLayoutAttr>())
5407 D->addAttr(::new (S.Context) NoRandomizeLayoutAttr(S.Context, AL));
5408}
5409
5411 const FunctionDecl *FD,
5412 CUDAFunctionTarget CFT) {
5413 if (Attrs.isInvalid())
5414 return true;
5415
5416 if (Attrs.hasProcessingCache()) {
5417 CC = (CallingConv) Attrs.getProcessingCache();
5418 return false;
5419 }
5420
5421 if (Attrs.getKind() == ParsedAttr::AT_RISCVVLSCC) {
5422 // riscv_vls_cc only accepts 0 or 1 argument.
5423 if (!Attrs.checkAtLeastNumArgs(*this, 0) ||
5424 !Attrs.checkAtMostNumArgs(*this, 1)) {
5425 Attrs.setInvalid();
5426 return true;
5427 }
5428 } else {
5429 unsigned ReqArgs = Attrs.getKind() == ParsedAttr::AT_Pcs ? 1 : 0;
5430 if (!Attrs.checkExactlyNumArgs(*this, ReqArgs)) {
5431 Attrs.setInvalid();
5432 return true;
5433 }
5434 }
5435
5436 bool IsTargetDefaultMSABI =
5437 Context.getTargetInfo().getTriple().isOSWindows() ||
5438 Context.getTargetInfo().getTriple().isUEFI();
5439 // TODO: diagnose uses of these conventions on the wrong target.
5440 switch (Attrs.getKind()) {
5441 case ParsedAttr::AT_CDecl:
5442 CC = CC_C;
5443 break;
5444 case ParsedAttr::AT_FastCall:
5445 CC = CC_X86FastCall;
5446 break;
5447 case ParsedAttr::AT_StdCall:
5448 CC = CC_X86StdCall;
5449 break;
5450 case ParsedAttr::AT_ThisCall:
5451 CC = CC_X86ThisCall;
5452 break;
5453 case ParsedAttr::AT_Pascal:
5454 CC = CC_X86Pascal;
5455 break;
5456 case ParsedAttr::AT_SwiftCall:
5457 CC = CC_Swift;
5458 break;
5459 case ParsedAttr::AT_SwiftAsyncCall:
5460 CC = CC_SwiftAsync;
5461 break;
5462 case ParsedAttr::AT_VectorCall:
5463 CC = CC_X86VectorCall;
5464 break;
5465 case ParsedAttr::AT_AArch64VectorPcs:
5467 break;
5468 case ParsedAttr::AT_AArch64SVEPcs:
5469 CC = CC_AArch64SVEPCS;
5470 break;
5471 case ParsedAttr::AT_RegCall:
5472 CC = CC_X86RegCall;
5473 break;
5474 case ParsedAttr::AT_MSABI:
5475 CC = IsTargetDefaultMSABI ? CC_C : CC_Win64;
5476 break;
5477 case ParsedAttr::AT_SysVABI:
5478 CC = IsTargetDefaultMSABI ? CC_X86_64SysV : CC_C;
5479 break;
5480 case ParsedAttr::AT_Pcs: {
5481 StringRef StrRef;
5482 if (!checkStringLiteralArgumentAttr(Attrs, 0, StrRef)) {
5483 Attrs.setInvalid();
5484 return true;
5485 }
5486 if (StrRef == "aapcs") {
5487 CC = CC_AAPCS;
5488 break;
5489 } else if (StrRef == "aapcs-vfp") {
5490 CC = CC_AAPCS_VFP;
5491 break;
5492 }
5493
5494 Attrs.setInvalid();
5495 Diag(Attrs.getLoc(), diag::err_invalid_pcs);
5496 return true;
5497 }
5498 case ParsedAttr::AT_IntelOclBicc:
5499 CC = CC_IntelOclBicc;
5500 break;
5501 case ParsedAttr::AT_PreserveMost:
5502 CC = CC_PreserveMost;
5503 break;
5504 case ParsedAttr::AT_PreserveAll:
5505 CC = CC_PreserveAll;
5506 break;
5507 case ParsedAttr::AT_M68kRTD:
5508 CC = CC_M68kRTD;
5509 break;
5510 case ParsedAttr::AT_PreserveNone:
5511 CC = CC_PreserveNone;
5512 break;
5513 case ParsedAttr::AT_RISCVVectorCC:
5514 CC = CC_RISCVVectorCall;
5515 break;
5516 case ParsedAttr::AT_RISCVVLSCC: {
5517 // If the riscv_abi_vlen doesn't have any argument, we set set it to default
5518 // value 128.
5519 unsigned ABIVLen = 128;
5520 if (Attrs.getNumArgs() &&
5521 !checkUInt32Argument(Attrs, Attrs.getArgAsExpr(0), ABIVLen)) {
5522 Attrs.setInvalid();
5523 return true;
5524 }
5525 if (Attrs.getNumArgs() && (ABIVLen < 32 || ABIVLen > 65536)) {
5526 Attrs.setInvalid();
5527 Diag(Attrs.getLoc(), diag::err_argument_invalid_range)
5528 << ABIVLen << 32 << 65536;
5529 return true;
5530 }
5531 if (!llvm::isPowerOf2_64(ABIVLen)) {
5532 Attrs.setInvalid();
5533 Diag(Attrs.getLoc(), diag::err_argument_not_power_of_2);
5534 return true;
5535 }
5537 llvm::Log2_64(ABIVLen) - 5);
5538 break;
5539 }
5540 case ParsedAttr::AT_DeviceKernel: {
5541 // Validation was handled in handleDeviceKernelAttr.
5542 CC = CC_DeviceKernel;
5543 break;
5544 }
5545 default: llvm_unreachable("unexpected attribute kind");
5546 }
5547
5549 const TargetInfo &TI = Context.getTargetInfo();
5550 auto *Aux = Context.getAuxTargetInfo();
5551 // CUDA functions may have host and/or device attributes which indicate
5552 // their targeted execution environment, therefore the calling convention
5553 // of functions in CUDA should be checked against the target deduced based
5554 // on their host/device attributes.
5555 if (LangOpts.CUDA) {
5556 assert(FD || CFT != CUDAFunctionTarget::InvalidTarget);
5557 auto CudaTarget = FD ? CUDA().IdentifyTarget(FD) : CFT;
5558 bool CheckHost = false, CheckDevice = false;
5559 switch (CudaTarget) {
5561 CheckHost = true;
5562 CheckDevice = true;
5563 break;
5565 CheckHost = true;
5566 break;
5569 CheckDevice = true;
5570 break;
5572 llvm_unreachable("unexpected cuda target");
5573 }
5574 auto *HostTI = LangOpts.CUDAIsDevice ? Aux : &TI;
5575 auto *DeviceTI = LangOpts.CUDAIsDevice ? &TI : Aux;
5576 if (CheckHost && HostTI)
5577 A = HostTI->checkCallingConvention(CC);
5578 if (A == TargetInfo::CCCR_OK && CheckDevice && DeviceTI)
5579 A = DeviceTI->checkCallingConvention(CC);
5580 } else if (LangOpts.SYCLIsDevice && TI.getTriple().isAMDGPU() &&
5581 CC == CC_X86VectorCall) {
5582 // Assuming SYCL Device AMDGPU CC_X86VectorCall functions are always to be
5583 // emitted on the host. The MSVC STL has CC-based specializations so we
5584 // cannot change the CC to be the default as that will cause a clash with
5585 // another specialization.
5586 A = TI.checkCallingConvention(CC);
5587 if (Aux && A != TargetInfo::CCCR_OK)
5588 A = Aux->checkCallingConvention(CC);
5589 } else {
5590 A = TI.checkCallingConvention(CC);
5591 }
5592
5593 switch (A) {
5595 break;
5596
5598 // Treat an ignored convention as if it was an explicit C calling convention
5599 // attribute. For example, __stdcall on Win x64 functions as __cdecl, so
5600 // that command line flags that change the default convention to
5601 // __vectorcall don't affect declarations marked __stdcall.
5602 CC = CC_C;
5603 break;
5604
5606 Diag(Attrs.getLoc(), diag::error_cconv_unsupported)
5608 break;
5609
5611 Diag(Attrs.getLoc(), diag::warn_cconv_unsupported)
5613
5614 // This convention is not valid for the target. Use the default function or
5615 // method calling convention.
5616 bool IsCXXMethod = false, IsVariadic = false;
5617 if (FD) {
5618 IsCXXMethod = FD->isCXXInstanceMember();
5619 IsVariadic = FD->isVariadic();
5620 }
5621 CC = Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod);
5622 break;
5623 }
5624 }
5625
5626 Attrs.setProcessingCache((unsigned) CC);
5627 return false;
5628}
5629
5630bool Sema::CheckRegparmAttr(const ParsedAttr &AL, unsigned &numParams) {
5631 if (AL.isInvalid())
5632 return true;
5633
5634 if (!AL.checkExactlyNumArgs(*this, 1)) {
5635 AL.setInvalid();
5636 return true;
5637 }
5638
5639 uint32_t NP;
5640 Expr *NumParamsExpr = AL.getArgAsExpr(0);
5641 if (!checkUInt32Argument(AL, NumParamsExpr, NP)) {
5642 AL.setInvalid();
5643 return true;
5644 }
5645
5646 if (Context.getTargetInfo().getRegParmMax() == 0) {
5647 Diag(AL.getLoc(), diag::err_attribute_regparm_wrong_platform)
5648 << NumParamsExpr->getSourceRange();
5649 AL.setInvalid();
5650 return true;
5651 }
5652
5653 numParams = NP;
5654 if (numParams > Context.getTargetInfo().getRegParmMax()) {
5655 Diag(AL.getLoc(), diag::err_attribute_regparm_invalid_number)
5656 << Context.getTargetInfo().getRegParmMax() << NumParamsExpr->getSourceRange();
5657 AL.setInvalid();
5658 return true;
5659 }
5660
5661 return false;
5662}
5663
5664// Helper to get OffloadArch.
5666 if (!TI.getTriple().isNVPTX())
5667 llvm_unreachable("getOffloadArch is only valid for NVPTX triple");
5668 auto &TO = TI.getTargetOpts();
5669 return StringToOffloadArch(TO.CPU);
5670}
5671
5672// Checks whether an argument of launch_bounds attribute is
5673// acceptable, performs implicit conversion to Rvalue, and returns
5674// non-nullptr Expr result on success. Otherwise, it returns nullptr
5675// and may output an error.
5677 const CUDALaunchBoundsAttr &AL,
5678 const unsigned Idx) {
5680 return nullptr;
5681
5682 // Accept template arguments for now as they depend on something else.
5683 // We'll get to check them when they eventually get instantiated.
5684 if (E->isValueDependent())
5685 return E;
5686
5687 std::optional<llvm::APSInt> I = llvm::APSInt(64);
5688 if (!(I = E->getIntegerConstantExpr(S.Context))) {
5689 S.Diag(E->getExprLoc(), diag::err_attribute_argument_n_type)
5690 << &AL << Idx << AANT_ArgumentIntegerConstant << E->getSourceRange();
5691 return nullptr;
5692 }
5693 // Make sure we can fit it in 32 bits.
5694 if (!I->isIntN(32)) {
5695 S.Diag(E->getExprLoc(), diag::err_ice_too_large)
5696 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
5697 return nullptr;
5698 }
5699 if (*I < 0)
5700 S.Diag(E->getExprLoc(), diag::warn_attribute_argument_n_negative)
5701 << &AL << Idx << E->getSourceRange();
5702
5703 // We may need to perform implicit conversion of the argument.
5705 S.Context, S.Context.getConstType(S.Context.IntTy), /*consume*/ false);
5706 ExprResult ValArg = S.PerformCopyInitialization(Entity, SourceLocation(), E);
5707 assert(!ValArg.isInvalid() &&
5708 "Unexpected PerformCopyInitialization() failure.");
5709
5710 return ValArg.getAs<Expr>();
5711}
5712
5713CUDALaunchBoundsAttr *
5715 Expr *MinBlocks, Expr *MaxBlocks) {
5716 CUDALaunchBoundsAttr TmpAttr(Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5717 MaxThreads = makeLaunchBoundsArgExpr(*this, MaxThreads, TmpAttr, 0);
5718 if (!MaxThreads)
5719 return nullptr;
5720
5721 if (MinBlocks) {
5722 MinBlocks = makeLaunchBoundsArgExpr(*this, MinBlocks, TmpAttr, 1);
5723 if (!MinBlocks)
5724 return nullptr;
5725 }
5726
5727 if (MaxBlocks) {
5728 // '.maxclusterrank' ptx directive requires .target sm_90 or higher.
5729 auto SM = getOffloadArch(Context.getTargetInfo());
5731 Diag(MaxBlocks->getBeginLoc(), diag::warn_cuda_maxclusterrank_sm_90)
5732 << OffloadArchToString(SM) << CI << MaxBlocks->getSourceRange();
5733 // Ignore it by setting MaxBlocks to null;
5734 MaxBlocks = nullptr;
5735 } else {
5736 MaxBlocks = makeLaunchBoundsArgExpr(*this, MaxBlocks, TmpAttr, 2);
5737 if (!MaxBlocks)
5738 return nullptr;
5739 }
5740 }
5741
5742 return ::new (Context)
5743 CUDALaunchBoundsAttr(Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5744}
5745
5747 Expr *MaxThreads, Expr *MinBlocks,
5748 Expr *MaxBlocks) {
5749 if (auto *Attr = CreateLaunchBoundsAttr(CI, MaxThreads, MinBlocks, MaxBlocks))
5750 D->addAttr(Attr);
5751}
5752
5753static void handleLaunchBoundsAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5754 if (!AL.checkAtLeastNumArgs(S, 1) || !AL.checkAtMostNumArgs(S, 3))
5755 return;
5756
5757 S.AddLaunchBoundsAttr(D, AL, AL.getArgAsExpr(0),
5758 AL.getNumArgs() > 1 ? AL.getArgAsExpr(1) : nullptr,
5759 AL.getNumArgs() > 2 ? AL.getArgAsExpr(2) : nullptr);
5760}
5761
5762static std::pair<Expr *, int>
5763makeClusterDimsArgExpr(Sema &S, Expr *E, const CUDAClusterDimsAttr &AL,
5764 const unsigned Idx) {
5765 if (!E || S.DiagnoseUnexpandedParameterPack(E))
5766 return {};
5767
5768 // Accept template arguments for now as they depend on something else.
5769 // We'll get to check them when they eventually get instantiated.
5770 if (E->isInstantiationDependent())
5771 return {E, 1};
5772
5773 std::optional<llvm::APSInt> I = E->getIntegerConstantExpr(S.Context);
5774 if (!I) {
5775 S.Diag(E->getExprLoc(), diag::err_attribute_argument_n_type)
5776 << &AL << Idx << AANT_ArgumentIntegerConstant << E->getSourceRange();
5777 return {};
5778 }
5779 // Make sure we can fit it in 4 bits.
5780 if (!I->isIntN(4)) {
5781 S.Diag(E->getExprLoc(), diag::err_ice_too_large)
5782 << toString(*I, 10, false) << 4 << /*Unsigned=*/1;
5783 return {};
5784 }
5785 if (*I < 0) {
5786 S.Diag(E->getExprLoc(), diag::warn_attribute_argument_n_negative)
5787 << &AL << Idx << E->getSourceRange();
5788 }
5789
5790 return {ConstantExpr::Create(S.getASTContext(), E, APValue(*I)),
5791 I->getZExtValue()};
5792}
5793
5795 Expr *X, Expr *Y, Expr *Z) {
5796 CUDAClusterDimsAttr TmpAttr(Context, CI, X, Y, Z);
5797
5798 auto [NewX, ValX] = makeClusterDimsArgExpr(*this, X, TmpAttr, /*Idx=*/0);
5799 auto [NewY, ValY] = makeClusterDimsArgExpr(*this, Y, TmpAttr, /*Idx=*/1);
5800 auto [NewZ, ValZ] = makeClusterDimsArgExpr(*this, Z, TmpAttr, /*Idx=*/2);
5801
5802 if (!NewX || (Y && !NewY) || (Z && !NewZ))
5803 return nullptr;
5804
5805 int FlatDim = ValX * ValY * ValZ;
5806 const llvm::Triple TT =
5807 (!Context.getLangOpts().CUDAIsDevice && Context.getAuxTargetInfo())
5808 ? Context.getAuxTargetInfo()->getTriple()
5809 : Context.getTargetInfo().getTriple();
5810 int MaxDim = 1;
5811 if (TT.isNVPTX())
5812 MaxDim = 8;
5813 else if (TT.isAMDGPU())
5814 MaxDim = 16;
5815 else
5816 return nullptr;
5817
5818 // A maximum of 8 thread blocks in a cluster is supported as a portable
5819 // cluster size in CUDA. The number is 16 for AMDGPU.
5820 if (FlatDim > MaxDim) {
5821 Diag(CI.getLoc(), diag::err_cluster_dims_too_large) << MaxDim << FlatDim;
5822 return nullptr;
5823 }
5824
5825 return CUDAClusterDimsAttr::Create(Context, NewX, NewY, NewZ, CI);
5826}
5827
5829 Expr *Y, Expr *Z) {
5830 if (auto *Attr = createClusterDimsAttr(CI, X, Y, Z))
5831 D->addAttr(Attr);
5832}
5833
5835 D->addAttr(CUDANoClusterAttr::Create(Context, CI));
5836}
5837
5838static void handleClusterDimsAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5839 const TargetInfo &TTI = S.Context.getTargetInfo();
5841 if ((TTI.getTriple().isNVPTX() && Arch < clang::OffloadArch::SM_90) ||
5842 (TTI.getTriple().isAMDGPU() &&
5843 !TTI.hasFeatureEnabled(TTI.getTargetOpts().FeatureMap, "clusters"))) {
5844 S.Diag(AL.getLoc(), diag::err_cluster_attr_not_supported) << AL;
5845 return;
5846 }
5847
5848 if (!AL.checkAtLeastNumArgs(S, /*Num=*/1) ||
5849 !AL.checkAtMostNumArgs(S, /*Num=*/3))
5850 return;
5851
5852 S.addClusterDimsAttr(D, AL, AL.getArgAsExpr(0),
5853 AL.getNumArgs() > 1 ? AL.getArgAsExpr(1) : nullptr,
5854 AL.getNumArgs() > 2 ? AL.getArgAsExpr(2) : nullptr);
5855}
5856
5857static void handleNoClusterAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5858 const TargetInfo &TTI = S.Context.getTargetInfo();
5860 if ((TTI.getTriple().isNVPTX() && Arch < clang::OffloadArch::SM_90) ||
5861 (TTI.getTriple().isAMDGPU() &&
5862 !TTI.hasFeatureEnabled(TTI.getTargetOpts().FeatureMap, "clusters"))) {
5863 S.Diag(AL.getLoc(), diag::err_cluster_attr_not_supported) << AL;
5864 return;
5865 }
5866
5867 S.addNoClusterAttr(D, AL);
5868}
5869
5871 const ParsedAttr &AL) {
5872 if (!AL.isArgIdent(0)) {
5873 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
5874 << AL << /* arg num = */ 1 << AANT_ArgumentIdentifier;
5875 return;
5876 }
5877
5878 ParamIdx ArgumentIdx;
5880 D, AL, 2, AL.getArgAsExpr(1), ArgumentIdx,
5881 /*CanIndexImplicitThis=*/false,
5882 /*CanIndexVariadicArguments=*/true))
5883 return;
5884
5885 ParamIdx TypeTagIdx;
5887 D, AL, 3, AL.getArgAsExpr(2), TypeTagIdx,
5888 /*CanIndexImplicitThis=*/false,
5889 /*CanIndexVariadicArguments=*/true))
5890 return;
5891
5892 bool IsPointer = AL.getAttrName()->getName() == "pointer_with_type_tag";
5893 if (IsPointer) {
5894 // Ensure that buffer has a pointer type.
5895 unsigned ArgumentIdxAST = ArgumentIdx.getASTIndex();
5896 if (ArgumentIdxAST >= getFunctionOrMethodNumParams(D) ||
5897 !getFunctionOrMethodParamType(D, ArgumentIdxAST)->isPointerType())
5898 S.Diag(AL.getLoc(), diag::err_attribute_pointers_only) << AL << 0;
5899 }
5900
5901 D->addAttr(::new (S.Context) ArgumentWithTypeTagAttr(
5902 S.Context, AL, AL.getArgAsIdent(0)->getIdentifierInfo(), ArgumentIdx,
5903 TypeTagIdx, IsPointer));
5904}
5905
5907 const ParsedAttr &AL) {
5908 if (!AL.isArgIdent(0)) {
5909 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
5910 << AL << 1 << AANT_ArgumentIdentifier;
5911 return;
5912 }
5913
5914 if (!AL.checkExactlyNumArgs(S, 1))
5915 return;
5916
5917 if (!isa<VarDecl>(D)) {
5918 S.Diag(AL.getLoc(), diag::err_attribute_wrong_decl_type)
5920 return;
5921 }
5922
5923 IdentifierInfo *PointerKind = AL.getArgAsIdent(0)->getIdentifierInfo();
5924 TypeSourceInfo *MatchingCTypeLoc = nullptr;
5925 S.GetTypeFromParser(AL.getMatchingCType(), &MatchingCTypeLoc);
5926 assert(MatchingCTypeLoc && "no type source info for attribute argument");
5927
5928 D->addAttr(::new (S.Context) TypeTagForDatatypeAttr(
5929 S.Context, AL, PointerKind, MatchingCTypeLoc, AL.getLayoutCompatible(),
5930 AL.getMustBeNull()));
5931}
5932
5933static void handleXRayLogArgsAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5934 ParamIdx ArgCount;
5935
5937 ArgCount,
5938 true /* CanIndexImplicitThis */))
5939 return;
5940
5941 // ArgCount isn't a parameter index [0;n), it's a count [1;n]
5942 D->addAttr(::new (S.Context)
5943 XRayLogArgsAttr(S.Context, AL, ArgCount.getSourceIndex()));
5944}
5945
5947 const ParsedAttr &AL) {
5948 if (S.Context.getTargetInfo().getTriple().isOSAIX()) {
5949 S.Diag(AL.getLoc(), diag::err_aix_attr_unsupported) << AL;
5950 return;
5951 }
5952 uint32_t Count = 0, Offset = 0;
5953 StringRef Section;
5954 if (!S.checkUInt32Argument(AL, AL.getArgAsExpr(0), Count, 0, true))
5955 return;
5956 if (AL.getNumArgs() >= 2) {
5957 Expr *Arg = AL.getArgAsExpr(1);
5958 if (!S.checkUInt32Argument(AL, Arg, Offset, 1, true))
5959 return;
5960 if (Count < Offset) {
5961 S.Diag(S.getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
5962 << &AL << 0 << Count << Arg->getBeginLoc();
5963 return;
5964 }
5965 }
5966 if (AL.getNumArgs() == 3) {
5967 SourceLocation LiteralLoc;
5968 if (!S.checkStringLiteralArgumentAttr(AL, 2, Section, &LiteralLoc))
5969 return;
5970 if (llvm::Error E = S.isValidSectionSpecifier(Section)) {
5971 S.Diag(LiteralLoc,
5972 diag::err_attribute_patchable_function_entry_invalid_section)
5973 << toString(std::move(E));
5974 return;
5975 }
5976 if (Section.empty()) {
5977 S.Diag(LiteralLoc,
5978 diag::err_attribute_patchable_function_entry_invalid_section)
5979 << "section must not be empty";
5980 return;
5981 }
5982 }
5983 D->addAttr(::new (S.Context) PatchableFunctionEntryAttr(S.Context, AL, Count,
5984 Offset, Section));
5985}
5986
5987static void handleBuiltinAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
5988 if (!AL.isArgIdent(0)) {
5989 S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
5990 << AL << 1 << AANT_ArgumentIdentifier;
5991 return;
5992 }
5993
5995 unsigned BuiltinID = Ident->getBuiltinID();
5996 StringRef AliasName = cast<FunctionDecl>(D)->getIdentifier()->getName();
5997
5998 bool IsAArch64 = S.Context.getTargetInfo().getTriple().isAArch64();
5999 bool IsARM = S.Context.getTargetInfo().getTriple().isARM();
6000 bool IsRISCV = S.Context.getTargetInfo().getTriple().isRISCV();
6001 bool IsSPIRV = S.Context.getTargetInfo().getTriple().isSPIRV();
6002 bool IsHLSL = S.Context.getLangOpts().HLSL;
6003 if ((IsAArch64 && !S.ARM().SveAliasValid(BuiltinID, AliasName)) ||
6004 (IsARM && !S.ARM().MveAliasValid(BuiltinID, AliasName) &&
6005 !S.ARM().CdeAliasValid(BuiltinID, AliasName)) ||
6006 (IsRISCV && !S.RISCV().isAliasValid(BuiltinID, AliasName)) ||
6007 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSPIRV)) {
6008 S.Diag(AL.getLoc(), diag::err_attribute_builtin_alias) << AL;
6009 return;
6010 }
6011
6012 D->addAttr(::new (S.Context) BuiltinAliasAttr(S.Context, AL, Ident));
6013}
6014
6015static void handleNullableTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6016 if (AL.isUsedAsTypeAttr())
6017 return;
6018
6019 if (auto *CRD = dyn_cast<CXXRecordDecl>(D);
6020 !CRD || !(CRD->isClass() || CRD->isStruct())) {
6021 S.Diag(AL.getRange().getBegin(), diag::err_attribute_wrong_decl_type)
6023 return;
6024 }
6025
6027}
6028
6029static void handlePreferredTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6030 if (!AL.hasParsedType()) {
6031 S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
6032 return;
6033 }
6034
6035 TypeSourceInfo *ParmTSI = nullptr;
6036 QualType QT = S.GetTypeFromParser(AL.getTypeArg(), &ParmTSI);
6037 assert(ParmTSI && "no type source info for attribute argument");
6038 S.RequireCompleteType(ParmTSI->getTypeLoc().getBeginLoc(), QT,
6039 diag::err_incomplete_type);
6040
6041 D->addAttr(::new (S.Context) PreferredTypeAttr(S.Context, AL, ParmTSI));
6042}
6043
6044//===----------------------------------------------------------------------===//
6045// Microsoft specific attribute handlers.
6046//===----------------------------------------------------------------------===//
6047
6049 StringRef UuidAsWritten, MSGuidDecl *GuidDecl) {
6050 if (const auto *UA = D->getAttr<UuidAttr>()) {
6051 if (declaresSameEntity(UA->getGuidDecl(), GuidDecl))
6052 return nullptr;
6053 if (!UA->getGuid().empty()) {
6054 Diag(UA->getLocation(), diag::err_mismatched_uuid);
6055 Diag(CI.getLoc(), diag::note_previous_uuid);
6056 D->dropAttr<UuidAttr>();
6057 }
6058 }
6059
6060 return ::new (Context) UuidAttr(Context, CI, UuidAsWritten, GuidDecl);
6061}
6062
6063static void handleUuidAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6064 if (!S.LangOpts.CPlusPlus) {
6065 S.Diag(AL.getLoc(), diag::err_attribute_not_supported_in_lang)
6066 << AL << AttributeLangSupport::C;
6067 return;
6068 }
6069
6070 StringRef OrigStrRef;
6071 SourceLocation LiteralLoc;
6072 if (!S.checkStringLiteralArgumentAttr(AL, 0, OrigStrRef, &LiteralLoc))
6073 return;
6074
6075 // GUID format is "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" or
6076 // "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}", normalize to the former.
6077 StringRef StrRef = OrigStrRef;
6078 if (StrRef.size() == 38 && StrRef.front() == '{' && StrRef.back() == '}')
6079 StrRef = StrRef.drop_front().drop_back();
6080
6081 // Validate GUID length.
6082 if (StrRef.size() != 36) {
6083 S.Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6084 return;
6085 }
6086
6087 for (unsigned i = 0; i < 36; ++i) {
6088 if (i == 8 || i == 13 || i == 18 || i == 23) {
6089 if (StrRef[i] != '-') {
6090 S.Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6091 return;
6092 }
6093 } else if (!isHexDigit(StrRef[i])) {
6094 S.Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6095 return;
6096 }
6097 }
6098
6099 // Convert to our parsed format and canonicalize.
6100 MSGuidDecl::Parts Parsed;
6101 StrRef.substr(0, 8).getAsInteger(16, Parsed.Part1);
6102 StrRef.substr(9, 4).getAsInteger(16, Parsed.Part2);
6103 StrRef.substr(14, 4).getAsInteger(16, Parsed.Part3);
6104 for (unsigned i = 0; i != 8; ++i)
6105 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
6106 .getAsInteger(16, Parsed.Part4And5[i]);
6107 MSGuidDecl *Guid = S.Context.getMSGuidDecl(Parsed);
6108
6109 // FIXME: It'd be nice to also emit a fixit removing uuid(...) (and, if it's
6110 // the only thing in the [] list, the [] too), and add an insertion of
6111 // __declspec(uuid(...)). But sadly, neither the SourceLocs of the commas
6112 // separating attributes nor of the [ and the ] are in the AST.
6113 // Cf "SourceLocations of attribute list delimiters - [[ ... , ... ]] etc"
6114 // on cfe-dev.
6115 if (AL.isMicrosoftAttribute()) // Check for [uuid(...)] spelling.
6116 S.Diag(AL.getLoc(), diag::warn_atl_uuid_deprecated);
6117
6118 UuidAttr *UA = S.mergeUuidAttr(D, AL, OrigStrRef, Guid);
6119 if (UA)
6120 D->addAttr(UA);
6121}
6122
6123static void handleMSInheritanceAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6124 if (!S.LangOpts.CPlusPlus) {
6125 S.Diag(AL.getLoc(), diag::err_attribute_not_supported_in_lang)
6126 << AL << AttributeLangSupport::C;
6127 return;
6128 }
6129 MSInheritanceAttr *IA = S.mergeMSInheritanceAttr(
6130 D, AL, /*BestCase=*/true, (MSInheritanceModel)AL.getSemanticSpelling());
6131 if (IA) {
6132 D->addAttr(IA);
6134 }
6135}
6136
6137static void handleDeclspecThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6138 const auto *VD = cast<VarDecl>(D);
6140 S.Diag(AL.getLoc(), diag::err_thread_unsupported);
6141 return;
6142 }
6143 if (VD->getTSCSpec() != TSCS_unspecified) {
6144 S.Diag(AL.getLoc(), diag::err_declspec_thread_on_thread_variable);
6145 return;
6146 }
6147 if (VD->hasLocalStorage()) {
6148 S.Diag(AL.getLoc(), diag::err_thread_non_global) << "__declspec(thread)";
6149 return;
6150 }
6151 D->addAttr(::new (S.Context) ThreadAttr(S.Context, AL));
6152}
6153
6154static void handleMSConstexprAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6156 S.Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored)
6157 << AL << AL.getRange();
6158 return;
6159 }
6160 auto *FD = cast<FunctionDecl>(D);
6161 if (FD->isConstexprSpecified() || FD->isConsteval()) {
6162 S.Diag(AL.getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6163 << FD->isConsteval() << FD;
6164 return;
6165 }
6166 if (auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6167 if (!S.getLangOpts().CPlusPlus20 && MD->isVirtual()) {
6168 S.Diag(AL.getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6169 << /*virtual*/ 2 << MD;
6170 return;
6171 }
6172 }
6173 D->addAttr(::new (S.Context) MSConstexprAttr(S.Context, AL));
6174}
6175
6176static void handleAbiTagAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6178 for (unsigned I = 0, E = AL.getNumArgs(); I != E; ++I) {
6179 StringRef Tag;
6180 if (!S.checkStringLiteralArgumentAttr(AL, I, Tag))
6181 return;
6182 Tags.push_back(Tag);
6183 }
6184
6185 if (const auto *NS = dyn_cast<NamespaceDecl>(D)) {
6186 if (!NS->isInline()) {
6187 S.Diag(AL.getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
6188 return;
6189 }
6190 if (NS->isAnonymousNamespace()) {
6191 S.Diag(AL.getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
6192 return;
6193 }
6194 if (AL.getNumArgs() == 0)
6195 Tags.push_back(NS->getName());
6196 } else if (!AL.checkAtLeastNumArgs(S, 1))
6197 return;
6198
6199 // Store tags sorted and without duplicates.
6200 llvm::sort(Tags);
6201 Tags.erase(llvm::unique(Tags), Tags.end());
6202
6203 D->addAttr(::new (S.Context)
6204 AbiTagAttr(S.Context, AL, Tags.data(), Tags.size()));
6205}
6206
6207static bool hasBTFDeclTagAttr(Decl *D, StringRef Tag) {
6208 for (const auto *I : D->specific_attrs<BTFDeclTagAttr>()) {
6209 if (I->getBTFDeclTag() == Tag)
6210 return true;
6211 }
6212 return false;
6213}
6214
6215static void handleBTFDeclTagAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6216 StringRef Str;
6217 if (!S.checkStringLiteralArgumentAttr(AL, 0, Str))
6218 return;
6219 if (hasBTFDeclTagAttr(D, Str))
6220 return;
6221
6222 D->addAttr(::new (S.Context) BTFDeclTagAttr(S.Context, AL, Str));
6223}
6224
6225BTFDeclTagAttr *Sema::mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL) {
6226 if (hasBTFDeclTagAttr(D, AL.getBTFDeclTag()))
6227 return nullptr;
6228 return ::new (Context) BTFDeclTagAttr(Context, AL, AL.getBTFDeclTag());
6229}
6230
6231static void handleInterruptAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6232 // Dispatch the interrupt attribute based on the current target.
6233 switch (S.Context.getTargetInfo().getTriple().getArch()) {
6234 case llvm::Triple::msp430:
6235 S.MSP430().handleInterruptAttr(D, AL);
6236 break;
6237 case llvm::Triple::mipsel:
6238 case llvm::Triple::mips:
6239 S.MIPS().handleInterruptAttr(D, AL);
6240 break;
6241 case llvm::Triple::m68k:
6242 S.M68k().handleInterruptAttr(D, AL);
6243 break;
6244 case llvm::Triple::x86:
6245 case llvm::Triple::x86_64:
6246 S.X86().handleAnyInterruptAttr(D, AL);
6247 break;
6248 case llvm::Triple::avr:
6249 S.AVR().handleInterruptAttr(D, AL);
6250 break;
6251 case llvm::Triple::riscv32:
6252 case llvm::Triple::riscv64:
6253 S.RISCV().handleInterruptAttr(D, AL);
6254 break;
6255 default:
6256 S.ARM().handleInterruptAttr(D, AL);
6257 break;
6258 }
6259}
6260
6261static void handleLayoutVersion(Sema &S, Decl *D, const ParsedAttr &AL) {
6262 uint32_t Version;
6263 Expr *VersionExpr = AL.getArgAsExpr(0);
6264 if (!S.checkUInt32Argument(AL, AL.getArgAsExpr(0), Version))
6265 return;
6266
6267 // TODO: Investigate what happens with the next major version of MSVC.
6268 if (Version != LangOptions::MSVC2015 / 100) {
6269 S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds)
6270 << AL << Version << VersionExpr->getSourceRange();
6271 return;
6272 }
6273
6274 // The attribute expects a "major" version number like 19, but new versions of
6275 // MSVC have moved to updating the "minor", or less significant numbers, so we
6276 // have to multiply by 100 now.
6277 Version *= 100;
6278
6279 D->addAttr(::new (S.Context) LayoutVersionAttr(S.Context, AL, Version));
6280}
6281
6283 const AttributeCommonInfo &CI) {
6284 if (D->hasAttr<DLLExportAttr>()) {
6285 Diag(CI.getLoc(), diag::warn_attribute_ignored) << "'dllimport'";
6286 return nullptr;
6287 }
6288
6289 if (D->hasAttr<DLLImportAttr>())
6290 return nullptr;
6291
6292 return ::new (Context) DLLImportAttr(Context, CI);
6293}
6294
6296 const AttributeCommonInfo &CI) {
6297 if (DLLImportAttr *Import = D->getAttr<DLLImportAttr>()) {
6298 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
6299 D->dropAttr<DLLImportAttr>();
6300 }
6301
6302 if (D->hasAttr<DLLExportAttr>())
6303 return nullptr;
6304
6305 return ::new (Context) DLLExportAttr(Context, CI);
6306}
6307
6308static void handleDLLAttr(Sema &S, Decl *D, const ParsedAttr &A) {
6311 S.Diag(A.getRange().getBegin(), diag::warn_attribute_ignored) << A;
6312 return;
6313 }
6314
6315 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
6316 if (FD->isInlined() && A.getKind() == ParsedAttr::AT_DLLImport &&
6318 // MinGW doesn't allow dllimport on inline functions.
6319 S.Diag(A.getRange().getBegin(), diag::warn_attribute_ignored_on_inline)
6320 << A;
6321 return;
6322 }
6323 }
6324
6325 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
6327 MD->getParent()->isLambda()) {
6328 S.Diag(A.getRange().getBegin(), diag::err_attribute_dll_lambda) << A;
6329 return;
6330 }
6331 }
6332
6333 Attr *NewAttr = A.getKind() == ParsedAttr::AT_DLLExport
6334 ? (Attr *)S.mergeDLLExportAttr(D, A)
6335 : (Attr *)S.mergeDLLImportAttr(D, A);
6336 if (NewAttr)
6337 D->addAttr(NewAttr);
6338}
6339
6340MSInheritanceAttr *
6342 bool BestCase,
6343 MSInheritanceModel Model) {
6344 if (MSInheritanceAttr *IA = D->getAttr<MSInheritanceAttr>()) {
6345 if (IA->getInheritanceModel() == Model)
6346 return nullptr;
6347 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
6348 << 1 /*previous declaration*/;
6349 Diag(CI.getLoc(), diag::note_previous_ms_inheritance);
6350 D->dropAttr<MSInheritanceAttr>();
6351 }
6352
6353 auto *RD = cast<CXXRecordDecl>(D);
6354 if (RD->hasDefinition()) {
6355 if (checkMSInheritanceAttrOnDefinition(RD, CI.getRange(), BestCase,
6356 Model)) {
6357 return nullptr;
6358 }
6359 } else {
6361 Diag(CI.getLoc(), diag::warn_ignored_ms_inheritance)
6362 << 1 /*partial specialization*/;
6363 return nullptr;
6364 }
6365 if (RD->getDescribedClassTemplate()) {
6366 Diag(CI.getLoc(), diag::warn_ignored_ms_inheritance)
6367 << 0 /*primary template*/;
6368 return nullptr;
6369 }
6370 }
6371
6372 return ::new (Context) MSInheritanceAttr(Context, CI, BestCase);
6373}
6374
6375static void handleCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6376 // The capability attributes take a single string parameter for the name of
6377 // the capability they represent. The lockable attribute does not take any
6378 // parameters. However, semantically, both attributes represent the same
6379 // concept, and so they use the same semantic attribute. Eventually, the
6380 // lockable attribute will be removed.
6381 //
6382 // For backward compatibility, any capability which has no specified string
6383 // literal will be considered a "mutex."
6384 StringRef N("mutex");
6385 SourceLocation LiteralLoc;
6386 if (AL.getKind() == ParsedAttr::AT_Capability &&
6387 !S.checkStringLiteralArgumentAttr(AL, 0, N, &LiteralLoc))
6388 return;
6389
6390 D->addAttr(::new (S.Context) CapabilityAttr(S.Context, AL, N));
6391}
6392
6394 const ParsedAttr &AL) {
6395 // Do not permit 'reentrant_capability' without 'capability(..)'. Note that
6396 // the check here requires 'capability' to be before 'reentrant_capability'.
6397 // This helps enforce a canonical style. Also avoids placing an additional
6398 // branch into ProcessDeclAttributeList().
6399 if (!D->hasAttr<CapabilityAttr>()) {
6400 S.Diag(AL.getLoc(), diag::warn_thread_attribute_requires_preceded)
6401 << AL << cast<NamedDecl>(D) << "'capability'";
6402 return;
6403 }
6404
6405 D->addAttr(::new (S.Context) ReentrantCapabilityAttr(S.Context, AL));
6406}
6407
6408static void handleAssertCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6410 if (!checkLockFunAttrCommon(S, D, AL, Args))
6411 return;
6412
6413 D->addAttr(::new (S.Context)
6414 AssertCapabilityAttr(S.Context, AL, Args.data(), Args.size()));
6415}
6416
6418 const ParsedAttr &AL) {
6419 if (const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6420 ParmDecl && !checkFunParamsAreScopedLockable(S, ParmDecl, AL))
6421 return;
6422
6424 if (!checkLockFunAttrCommon(S, D, AL, Args))
6425 return;
6426
6427 D->addAttr(::new (S.Context) AcquireCapabilityAttr(S.Context, AL, Args.data(),
6428 Args.size()));
6429}
6430
6432 const ParsedAttr &AL) {
6434 if (!checkTryLockFunAttrCommon(S, D, AL, Args))
6435 return;
6436
6437 D->addAttr(::new (S.Context) TryAcquireCapabilityAttr(
6438 S.Context, AL, AL.getArgAsExpr(0), Args.data(), Args.size()));
6439}
6440
6442 const ParsedAttr &AL) {
6443 if (const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6444 ParmDecl && !checkFunParamsAreScopedLockable(S, ParmDecl, AL))
6445 return;
6446 // Check that all arguments are lockable objects.
6448 checkAttrArgsAreCapabilityObjs(S, D, AL, Args, 0, true);
6449
6450 D->addAttr(::new (S.Context) ReleaseCapabilityAttr(S.Context, AL, Args.data(),
6451 Args.size()));
6452}
6453
6455 const ParsedAttr &AL) {
6456 if (const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6457 ParmDecl && !checkFunParamsAreScopedLockable(S, ParmDecl, AL))
6458 return;
6459
6460 if (!AL.checkAtLeastNumArgs(S, 1))
6461 return;
6462
6463 // check that all arguments are lockable objects
6465 checkAttrArgsAreCapabilityObjs(S, D, AL, Args);
6466 if (Args.empty())
6467 return;
6468
6469 RequiresCapabilityAttr *RCA = ::new (S.Context)
6470 RequiresCapabilityAttr(S.Context, AL, Args.data(), Args.size());
6471
6472 D->addAttr(RCA);
6473}
6474
6475static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6476 if (const auto *NSD = dyn_cast<NamespaceDecl>(D)) {
6477 if (NSD->isAnonymousNamespace()) {
6478 S.Diag(AL.getLoc(), diag::warn_deprecated_anonymous_namespace);
6479 // Do not want to attach the attribute to the namespace because that will
6480 // cause confusing diagnostic reports for uses of declarations within the
6481 // namespace.
6482 return;
6483 }
6486 S.Diag(AL.getRange().getBegin(), diag::warn_deprecated_ignored_on_using)
6487 << AL;
6488 return;
6489 }
6490
6491 // Handle the cases where the attribute has a text message.
6492 StringRef Str, Replacement;
6493 if (AL.isArgExpr(0) && AL.getArgAsExpr(0) &&
6494 !S.checkStringLiteralArgumentAttr(AL, 0, Str))
6495 return;
6496
6497 // Support a single optional message only for Declspec and [[]] spellings.
6499 AL.checkAtMostNumArgs(S, 1);
6500 else if (AL.isArgExpr(1) && AL.getArgAsExpr(1) &&
6501 !S.checkStringLiteralArgumentAttr(AL, 1, Replacement))
6502 return;
6503
6504 if (!S.getLangOpts().CPlusPlus14 && AL.isCXX11Attribute() && !AL.isGNUScope())
6505 S.Diag(AL.getLoc(), diag::ext_cxx14_attr) << AL;
6506
6507 D->addAttr(::new (S.Context) DeprecatedAttr(S.Context, AL, Str, Replacement));
6508}
6509
6510static bool isGlobalVar(const Decl *D) {
6511 if (const auto *S = dyn_cast<VarDecl>(D))
6512 return S->hasGlobalStorage();
6513 return false;
6514}
6515
6516static bool isSanitizerAttributeAllowedOnGlobals(StringRef Sanitizer) {
6517 return Sanitizer == "address" || Sanitizer == "hwaddress" ||
6518 Sanitizer == "memtag";
6519}
6520
6521static void handleNoSanitizeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6522 if (!AL.checkAtLeastNumArgs(S, 1))
6523 return;
6524
6525 std::vector<StringRef> Sanitizers;
6526
6527 for (unsigned I = 0, E = AL.getNumArgs(); I != E; ++I) {
6528 StringRef SanitizerName;
6529 SourceLocation LiteralLoc;
6530
6531 if (!S.checkStringLiteralArgumentAttr(AL, I, SanitizerName, &LiteralLoc))
6532 return;
6533
6534 if (parseSanitizerValue(SanitizerName, /*AllowGroups=*/true) ==
6535 SanitizerMask() &&
6536 SanitizerName != "coverage")
6537 S.Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6538 else if (isGlobalVar(D) && !isSanitizerAttributeAllowedOnGlobals(SanitizerName))
6539 S.Diag(D->getLocation(), diag::warn_attribute_type_not_supported_global)
6540 << AL << SanitizerName;
6541 Sanitizers.push_back(SanitizerName);
6542 }
6543
6544 D->addAttr(::new (S.Context) NoSanitizeAttr(S.Context, AL, Sanitizers.data(),
6545 Sanitizers.size()));
6546}
6547
6549getNoSanitizeAttrInfo(const ParsedAttr &NoSanitizeSpecificAttr) {
6550 // FIXME: Rather than create a NoSanitizeSpecificAttr, this creates a
6551 // NoSanitizeAttr object; but we need to calculate the correct spelling list
6552 // index rather than incorrectly assume the index for NoSanitizeSpecificAttr
6553 // has the same spellings as the index for NoSanitizeAttr. We don't have a
6554 // general way to "translate" between the two, so this hack attempts to work
6555 // around the issue with hard-coded indices. This is critical for calling
6556 // getSpelling() or prettyPrint() on the resulting semantic attribute object
6557 // without failing assertions.
6558 unsigned TranslatedSpellingIndex = 0;
6559 if (NoSanitizeSpecificAttr.isStandardAttributeSyntax())
6560 TranslatedSpellingIndex = 1;
6561
6562 AttributeCommonInfo Info = NoSanitizeSpecificAttr;
6563 Info.setAttributeSpellingListIndex(TranslatedSpellingIndex);
6564 return Info;
6565}
6566
6568 const ParsedAttr &AL) {
6569 StringRef SanitizerName = "address";
6571 D->addAttr(::new (S.Context)
6572 NoSanitizeAttr(S.Context, Info, &SanitizerName, 1));
6573}
6574
6575static void handleNoSanitizeThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6576 StringRef SanitizerName = "thread";
6578 D->addAttr(::new (S.Context)
6579 NoSanitizeAttr(S.Context, Info, &SanitizerName, 1));
6580}
6581
6582static void handleNoSanitizeMemoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6583 StringRef SanitizerName = "memory";
6585 D->addAttr(::new (S.Context)
6586 NoSanitizeAttr(S.Context, Info, &SanitizerName, 1));
6587}
6588
6589static void handleInternalLinkageAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6590 if (InternalLinkageAttr *Internal = S.mergeInternalLinkageAttr(D, AL))
6591 D->addAttr(Internal);
6592}
6593
6594static void handleZeroCallUsedRegsAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6595 // Check that the argument is a string literal.
6596 StringRef KindStr;
6597 SourceLocation LiteralLoc;
6598 if (!S.checkStringLiteralArgumentAttr(AL, 0, KindStr, &LiteralLoc))
6599 return;
6600
6601 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
6602 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
6603 S.Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6604 << AL << KindStr;
6605 return;
6606 }
6607
6608 D->dropAttr<ZeroCallUsedRegsAttr>();
6609 D->addAttr(ZeroCallUsedRegsAttr::Create(S.Context, Kind, AL));
6610}
6611
6612static void handleCountedByAttrField(Sema &S, Decl *D, const ParsedAttr &AL) {
6613 auto *FD = dyn_cast<FieldDecl>(D);
6614 assert(FD);
6615
6616 auto *CountExpr = AL.getArgAsExpr(0);
6617 if (!CountExpr)
6618 return;
6619
6620 bool CountInBytes;
6621 bool OrNull;
6622 switch (AL.getKind()) {
6623 case ParsedAttr::AT_CountedBy:
6624 CountInBytes = false;
6625 OrNull = false;
6626 break;
6627 case ParsedAttr::AT_CountedByOrNull:
6628 CountInBytes = false;
6629 OrNull = true;
6630 break;
6631 case ParsedAttr::AT_SizedBy:
6632 CountInBytes = true;
6633 OrNull = false;
6634 break;
6635 case ParsedAttr::AT_SizedByOrNull:
6636 CountInBytes = true;
6637 OrNull = true;
6638 break;
6639 default:
6640 llvm_unreachable("unexpected counted_by family attribute");
6641 }
6642
6643 if (S.CheckCountedByAttrOnField(FD, CountExpr, CountInBytes, OrNull))
6644 return;
6645
6647 FD->getType(), CountExpr, CountInBytes, OrNull);
6648 FD->setType(CAT);
6649}
6650
6652 const ParsedAttr &AL) {
6653 StringRef KindStr;
6654 SourceLocation LiteralLoc;
6655 if (!S.checkStringLiteralArgumentAttr(AL, 0, KindStr, &LiteralLoc))
6656 return;
6657
6658 FunctionReturnThunksAttr::Kind Kind;
6659 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
6660 S.Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6661 << AL << KindStr;
6662 return;
6663 }
6664 // FIXME: it would be good to better handle attribute merging rather than
6665 // silently replacing the existing attribute, so long as it does not break
6666 // the expected codegen tests.
6667 D->dropAttr<FunctionReturnThunksAttr>();
6668 D->addAttr(FunctionReturnThunksAttr::Create(S.Context, Kind, AL));
6669}
6670
6672 const ParsedAttr &AL) {
6673 assert(isa<TypedefNameDecl>(D) && "This attribute only applies to a typedef");
6675}
6676
6677static void handleNoMergeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6678 auto *VDecl = dyn_cast<VarDecl>(D);
6679 if (VDecl && !VDecl->isFunctionPointerType()) {
6680 S.Diag(AL.getLoc(), diag::warn_attribute_ignored_non_function_pointer)
6681 << AL << VDecl;
6682 return;
6683 }
6684 D->addAttr(NoMergeAttr::Create(S.Context, AL));
6685}
6686
6687static void handleNoUniqueAddressAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6688 D->addAttr(NoUniqueAddressAttr::Create(S.Context, AL));
6689}
6690
6691static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A) {
6692 if (!cast<VarDecl>(D)->hasGlobalStorage()) {
6693 S.Diag(D->getLocation(), diag::err_destroy_attr_on_non_static_var)
6694 << (A.getKind() == ParsedAttr::AT_AlwaysDestroy);
6695 return;
6696 }
6697
6698 if (A.getKind() == ParsedAttr::AT_AlwaysDestroy)
6700 else
6702}
6703
6704static void handleUninitializedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6705 assert(cast<VarDecl>(D)->getStorageDuration() == SD_Automatic &&
6706 "uninitialized is only valid on automatic duration variables");
6707 D->addAttr(::new (S.Context) UninitializedAttr(S.Context, AL));
6708}
6709
6710static void handleMIGServerRoutineAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6711 // Check that the return type is a `typedef int kern_return_t` or a typedef
6712 // around it, because otherwise MIG convention checks make no sense.
6713 // BlockDecl doesn't store a return type, so it's annoying to check,
6714 // so let's skip it for now.
6715 if (!isa<BlockDecl>(D)) {
6717 bool IsKernReturnT = false;
6718 while (const auto *TT = T->getAs<TypedefType>()) {
6719 IsKernReturnT = (TT->getDecl()->getName() == "kern_return_t");
6720 T = TT->desugar();
6721 }
6722 if (!IsKernReturnT || T.getCanonicalType() != S.getASTContext().IntTy) {
6723 S.Diag(D->getBeginLoc(),
6724 diag::warn_mig_server_routine_does_not_return_kern_return_t);
6725 return;
6726 }
6727 }
6728
6730}
6731
6732static void handleMSAllocatorAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6733 // Warn if the return type is not a pointer or reference type.
6734 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6735 QualType RetTy = FD->getReturnType();
6736 if (!RetTy->isPointerOrReferenceType()) {
6737 S.Diag(AL.getLoc(), diag::warn_declspec_allocator_nonpointer)
6738 << AL.getRange() << RetTy;
6739 return;
6740 }
6741 }
6742
6744}
6745
6746static void handleAcquireHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6747 if (AL.isUsedAsTypeAttr())
6748 return;
6749 // Warn if the parameter is definitely not an output parameter.
6750 if (const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
6751 if (PVD->getType()->isIntegerType()) {
6752 S.Diag(AL.getLoc(), diag::err_attribute_output_parameter)
6753 << AL.getRange();
6754 return;
6755 }
6756 }
6757 StringRef Argument;
6758 if (!S.checkStringLiteralArgumentAttr(AL, 0, Argument))
6759 return;
6760 D->addAttr(AcquireHandleAttr::Create(S.Context, Argument, AL));
6761}
6762
6763template<typename Attr>
6764static void handleHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6765 StringRef Argument;
6766 if (!S.checkStringLiteralArgumentAttr(AL, 0, Argument))
6767 return;
6768 D->addAttr(Attr::Create(S.Context, Argument, AL));
6769}
6770
6771template<typename Attr>
6772static void handleUnsafeBufferUsage(Sema &S, Decl *D, const ParsedAttr &AL) {
6773 D->addAttr(Attr::Create(S.Context, AL));
6774}
6775
6776static void handleCFGuardAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6777 // The guard attribute takes a single identifier argument.
6778
6779 if (!AL.isArgIdent(0)) {
6780 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
6781 << AL << AANT_ArgumentIdentifier;
6782 return;
6783 }
6784
6785 CFGuardAttr::GuardArg Arg;
6787 if (!CFGuardAttr::ConvertStrToGuardArg(II->getName(), Arg)) {
6788 S.Diag(AL.getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
6789 return;
6790 }
6791
6792 D->addAttr(::new (S.Context) CFGuardAttr(S.Context, AL, Arg));
6793}
6794
6795
6796template <typename AttrTy>
6797static const AttrTy *findEnforceTCBAttrByName(Decl *D, StringRef Name) {
6798 auto Attrs = D->specific_attrs<AttrTy>();
6799 auto I = llvm::find_if(Attrs,
6800 [Name](const AttrTy *A) {
6801 return A->getTCBName() == Name;
6802 });
6803 return I == Attrs.end() ? nullptr : *I;
6804}
6805
6806template <typename AttrTy, typename ConflictingAttrTy>
6807static void handleEnforceTCBAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
6808 StringRef Argument;
6809 if (!S.checkStringLiteralArgumentAttr(AL, 0, Argument))
6810 return;
6811
6812 // A function cannot be have both regular and leaf membership in the same TCB.
6813 if (const ConflictingAttrTy *ConflictingAttr =
6815 // We could attach a note to the other attribute but in this case
6816 // there's no need given how the two are very close to each other.
6817 S.Diag(AL.getLoc(), diag::err_tcb_conflicting_attributes)
6818 << AL.getAttrName()->getName() << ConflictingAttr->getAttrName()->getName()
6819 << Argument;
6820
6821 // Error recovery: drop the non-leaf attribute so that to suppress
6822 // all future warnings caused by erroneous attributes. The leaf attribute
6823 // needs to be kept because it can only suppresses warnings, not cause them.
6824 D->dropAttr<EnforceTCBAttr>();
6825 return;
6826 }
6827
6828 D->addAttr(AttrTy::Create(S.Context, Argument, AL));
6829}
6830
6831template <typename AttrTy, typename ConflictingAttrTy>
6832static AttrTy *mergeEnforceTCBAttrImpl(Sema &S, Decl *D, const AttrTy &AL) {
6833 // Check if the new redeclaration has different leaf-ness in the same TCB.
6834 StringRef TCBName = AL.getTCBName();
6835 if (const ConflictingAttrTy *ConflictingAttr =
6837 S.Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
6838 << ConflictingAttr->getAttrName()->getName()
6839 << AL.getAttrName()->getName() << TCBName;
6840
6841 // Add a note so that the user could easily find the conflicting attribute.
6842 S.Diag(AL.getLoc(), diag::note_conflicting_attribute);
6843
6844 // More error recovery.
6845 D->dropAttr<EnforceTCBAttr>();
6846 return nullptr;
6847 }
6848
6849 ASTContext &Context = S.getASTContext();
6850 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
6851}
6852
6853EnforceTCBAttr *Sema::mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL) {
6855 *this, D, AL);
6856}
6857
6859 Decl *D, const EnforceTCBLeafAttr &AL) {
6861 *this, D, AL);
6862}
6863
6865 const ParsedAttr &AL) {
6867 const uint32_t NumArgs = AL.getNumArgs();
6868 if (NumArgs > 4) {
6869 S.Diag(AL.getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
6870 AL.setInvalid();
6871 }
6872
6873 if (NumArgs == 0) {
6874 S.Diag(AL.getLoc(), diag::err_attribute_too_few_arguments) << AL;
6875 AL.setInvalid();
6876 return;
6877 }
6878
6879 if (D->getAttr<VTablePointerAuthenticationAttr>()) {
6880 S.Diag(AL.getLoc(), diag::err_duplicated_vtable_pointer_auth) << Decl;
6881 AL.setInvalid();
6882 }
6883
6884 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
6885 if (AL.isArgIdent(0)) {
6886 IdentifierLoc *IL = AL.getArgAsIdent(0);
6887 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
6888 IL->getIdentifierInfo()->getName(), KeyType)) {
6889 S.Diag(IL->getLoc(), diag::err_invalid_authentication_key)
6890 << IL->getIdentifierInfo();
6891 AL.setInvalid();
6892 }
6893 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
6894 !S.getLangOpts().PointerAuthCalls) {
6895 S.Diag(AL.getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
6896 AL.setInvalid();
6897 }
6898 } else {
6899 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
6900 << AL << AANT_ArgumentIdentifier;
6901 return;
6902 }
6903
6904 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
6905 AddressDiscriminationMode::DefaultAddressDiscrimination;
6906 if (AL.getNumArgs() > 1) {
6907 if (AL.isArgIdent(1)) {
6908 IdentifierLoc *IL = AL.getArgAsIdent(1);
6909 if (!VTablePointerAuthenticationAttr::
6910 ConvertStrToAddressDiscriminationMode(
6911 IL->getIdentifierInfo()->getName(), AddressDiversityMode)) {
6912 S.Diag(IL->getLoc(), diag::err_invalid_address_discrimination)
6913 << IL->getIdentifierInfo();
6914 AL.setInvalid();
6915 }
6916 if (AddressDiversityMode ==
6917 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
6918 !S.getLangOpts().PointerAuthCalls) {
6919 S.Diag(IL->getLoc(), diag::err_no_default_vtable_pointer_auth) << 1;
6920 AL.setInvalid();
6921 }
6922 } else {
6923 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
6924 << AL << AANT_ArgumentIdentifier;
6925 }
6926 }
6927
6928 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
6929 DefaultExtraDiscrimination;
6930 if (AL.getNumArgs() > 2) {
6931 if (AL.isArgIdent(2)) {
6932 IdentifierLoc *IL = AL.getArgAsIdent(2);
6933 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
6934 IL->getIdentifierInfo()->getName(), ED)) {
6935 S.Diag(IL->getLoc(), diag::err_invalid_extra_discrimination)
6936 << IL->getIdentifierInfo();
6937 AL.setInvalid();
6938 }
6939 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
6940 !S.getLangOpts().PointerAuthCalls) {
6941 S.Diag(AL.getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
6942 AL.setInvalid();
6943 }
6944 } else {
6945 S.Diag(AL.getLoc(), diag::err_attribute_argument_type)
6946 << AL << AANT_ArgumentIdentifier;
6947 }
6948 }
6949
6950 uint32_t CustomDiscriminationValue = 0;
6951 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
6952 if (NumArgs < 4) {
6953 S.Diag(AL.getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
6954 AL.setInvalid();
6955 return;
6956 }
6957 if (NumArgs > 4) {
6958 S.Diag(AL.getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
6959 AL.setInvalid();
6960 }
6961
6962 if (!AL.isArgExpr(3) || !S.checkUInt32Argument(AL, AL.getArgAsExpr(3),
6963 CustomDiscriminationValue)) {
6964 S.Diag(AL.getLoc(), diag::err_invalid_custom_discrimination);
6965 AL.setInvalid();
6966 }
6967 } else if (NumArgs > 3) {
6968 S.Diag(AL.getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
6969 AL.setInvalid();
6970 }
6971
6972 Decl->addAttr(::new (S.Context) VTablePointerAuthenticationAttr(
6973 S.Context, AL, KeyType, AddressDiversityMode, ED,
6974 CustomDiscriminationValue));
6975}
6976
6977static bool modularFormatAttrsEquiv(const ModularFormatAttr *Existing,
6978 IdentifierInfo *ModularImplFn,
6979 StringRef ImplName,
6980 ArrayRef<StringRef> Aspects) {
6981 return Existing->getModularImplFn() == ModularImplFn &&
6982 Existing->getImplName() == ImplName &&
6983 Existing->aspects_size() == Aspects.size() &&
6984 llvm::equal(Existing->aspects(), Aspects);
6985}
6986
6987ModularFormatAttr *
6989 IdentifierInfo *ModularImplFn, StringRef ImplName,
6991 if (const auto *Existing = D->getAttr<ModularFormatAttr>()) {
6992 if (!modularFormatAttrsEquiv(Existing, ModularImplFn, ImplName, Aspects)) {
6993 Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
6994 Diag(CI.getLoc(), diag::note_conflicting_attribute);
6995 }
6996 return nullptr;
6997 }
6998 return ::new (Context) ModularFormatAttr(Context, CI, ModularImplFn, ImplName,
6999 Aspects.data(), Aspects.size());
7000}
7001
7002static void handleModularFormat(Sema &S, Decl *D, const ParsedAttr &AL) {
7003 bool Valid = true;
7004 StringRef ImplName;
7005 if (!S.checkStringLiteralArgumentAttr(AL, 1, ImplName))
7006 Valid = false;
7007 SmallVector<StringRef> Aspects;
7008 llvm::DenseSet<StringRef> SeenAspects;
7009 for (unsigned I = 2, E = AL.getNumArgs(); I != E; ++I) {
7010 StringRef Aspect;
7011 if (!S.checkStringLiteralArgumentAttr(AL, I, Aspect))
7012 return;
7013 if (!SeenAspects.insert(Aspect).second) {
7014 S.Diag(AL.getArgAsExpr(I)->getExprLoc(),
7015 diag::err_modular_format_duplicate_aspect)
7016 << Aspect;
7017 Valid = false;
7018 continue;
7019 }
7020 Aspects.push_back(Aspect);
7021 }
7022 if (!Valid)
7023 return;
7024
7025 // Store aspects sorted.
7026 llvm::sort(Aspects);
7027 IdentifierInfo *ModularImplFn = AL.getArgAsIdent(0)->getIdentifierInfo();
7028
7029 if (const auto *Existing = D->getAttr<ModularFormatAttr>()) {
7030 if (!modularFormatAttrsEquiv(Existing, ModularImplFn, ImplName, Aspects)) {
7031 S.Diag(AL.getLoc(), diag::err_duplicate_attribute) << *Existing;
7032 S.Diag(Existing->getLoc(), diag::note_conflicting_attribute);
7033 }
7034 // Ignore the later declaration in favor of the earlier one.
7035 return;
7036 }
7037
7038 D->addAttr(::new (S.Context) ModularFormatAttr(
7039 S.Context, AL, ModularImplFn, ImplName, Aspects.data(), Aspects.size()));
7040}
7041
7042//===----------------------------------------------------------------------===//
7043// Top Level Sema Entry Points
7044//===----------------------------------------------------------------------===//
7045
7046// Returns true if the attribute must delay setting its arguments until after
7047// template instantiation, and false otherwise.
7049 // Only attributes that accept expression parameter packs can delay arguments.
7050 if (!AL.acceptsExprPack())
7051 return false;
7052
7053 bool AttrHasVariadicArg = AL.hasVariadicArg();
7054 unsigned AttrNumArgs = AL.getNumArgMembers();
7055 for (size_t I = 0; I < std::min(AL.getNumArgs(), AttrNumArgs); ++I) {
7056 bool IsLastAttrArg = I == (AttrNumArgs - 1);
7057 // If the argument is the last argument and it is variadic it can contain
7058 // any expression.
7059 if (IsLastAttrArg && AttrHasVariadicArg)
7060 return false;
7061 Expr *E = AL.getArgAsExpr(I);
7062 bool ArgMemberCanHoldExpr = AL.isParamExpr(I);
7063 // If the expression is a pack expansion then arguments must be delayed
7064 // unless the argument is an expression and it is the last argument of the
7065 // attribute.
7067 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
7068 // Last case is if the expression is value dependent then it must delay
7069 // arguments unless the corresponding argument is able to hold the
7070 // expression.
7071 if (E->isValueDependent() && !ArgMemberCanHoldExpr)
7072 return true;
7073 }
7074 return false;
7075}
7076
7077/// ProcessDeclAttribute - Apply the specific attribute to the specified decl if
7078/// the attribute applies to decls. If the attribute is a type attribute, just
7079/// silently ignore it if a GNU attribute.
7080static void
7082 const Sema::ProcessDeclAttributeOptions &Options) {
7084 return;
7085
7086 // Ignore C++11 attributes on declarator chunks: they appertain to the type
7087 // instead. Note, isCXX11Attribute() will look at whether the attribute is
7088 // [[]] or alignas, while isC23Attribute() will only look at [[]]. This is
7089 // important for ensuring that alignas in C23 is properly handled on a
7090 // structure member declaration because it is a type-specifier-qualifier in
7091 // C but still applies to the declaration rather than the type.
7092 if ((S.getLangOpts().CPlusPlus ? AL.isCXX11Attribute()
7093 : AL.isC23Attribute()) &&
7094 !Options.IncludeCXX11Attributes)
7095 return;
7096
7097 // Unknown attributes are automatically warned on. Target-specific attributes
7098 // which do not apply to the current target architecture are treated as
7099 // though they were unknown attributes.
7102 if (AL.isRegularKeywordAttribute()) {
7103 S.Diag(AL.getLoc(), diag::err_keyword_not_supported_on_target)
7104 << AL.getAttrName() << AL.getRange();
7105 } else if (AL.isDeclspecAttribute()) {
7106 S.Diag(AL.getLoc(), diag::warn_unhandled_ms_attribute_ignored)
7107 << AL.getAttrName() << AL.getRange();
7108 } else {
7110 }
7111 return;
7112 }
7113
7114 // Check if argument population must delayed to after template instantiation.
7115 bool MustDelayArgs = MustDelayAttributeArguments(AL);
7116
7117 // Argument number check must be skipped if arguments are delayed.
7118 if (S.checkCommonAttributeFeatures(D, AL, MustDelayArgs))
7119 return;
7120
7121 if (MustDelayArgs) {
7123 return;
7124 }
7125
7126 switch (AL.getKind()) {
7127 default:
7129 break;
7130 if (!AL.isStmtAttr()) {
7131 assert(AL.isTypeAttr() && "Non-type attribute not handled");
7132 }
7133 if (AL.isTypeAttr()) {
7134 if (Options.IgnoreTypeAttributes)
7135 break;
7137 // Non-[[]] type attributes are handled in processTypeAttrs(); silently
7138 // move on.
7139 break;
7140 }
7141
7142 // According to the C and C++ standards, we should never see a
7143 // [[]] type attribute on a declaration. However, we have in the past
7144 // allowed some type attributes to "slide" to the `DeclSpec`, so we need
7145 // to continue to support this legacy behavior. We only do this, however,
7146 // if
7147 // - we actually have a `DeclSpec`, i.e. if we're looking at a
7148 // `DeclaratorDecl`, or
7149 // - we are looking at an alias-declaration, where historically we have
7150 // allowed type attributes after the identifier to slide to the type.
7153 // Suggest moving the attribute to the type instead, but only for our
7154 // own vendor attributes; moving other vendors' attributes might hurt
7155 // portability.
7156 if (AL.isClangScope()) {
7157 S.Diag(AL.getLoc(), diag::warn_type_attribute_deprecated_on_decl)
7158 << AL << D->getLocation();
7159 }
7160
7161 // Allow this type attribute to be handled in processTypeAttrs();
7162 // silently move on.
7163 break;
7164 }
7165
7166 if (AL.getKind() == ParsedAttr::AT_Regparm) {
7167 // `regparm` is a special case: It's a type attribute but we still want
7168 // to treat it as if it had been written on the declaration because that
7169 // way we'll be able to handle it directly in `processTypeAttr()`.
7170 // If we treated `regparm` it as if it had been written on the
7171 // `DeclSpec`, the logic in `distributeFunctionTypeAttrFromDeclSepc()`
7172 // would try to move it to the declarator, but that doesn't work: We
7173 // can't remove the attribute from the list of declaration attributes
7174 // because it might be needed by other declarators in the same
7175 // declaration.
7176 break;
7177 }
7178
7179 if (AL.getKind() == ParsedAttr::AT_VectorSize) {
7180 // `vector_size` is a special case: It's a type attribute semantically,
7181 // but GCC expects the [[]] syntax to be written on the declaration (and
7182 // warns that the attribute has no effect if it is placed on the
7183 // decl-specifier-seq).
7184 // Silently move on and allow the attribute to be handled in
7185 // processTypeAttr().
7186 break;
7187 }
7188
7189 if (AL.getKind() == ParsedAttr::AT_NoDeref) {
7190 // FIXME: `noderef` currently doesn't work correctly in [[]] syntax.
7191 // See https://github.com/llvm/llvm-project/issues/55790 for details.
7192 // We allow processTypeAttrs() to emit a warning and silently move on.
7193 break;
7194 }
7195 }
7196 // N.B., ClangAttrEmitter.cpp emits a diagnostic helper that ensures a
7197 // statement attribute is not written on a declaration, but this code is
7198 // needed for type attributes as well as statement attributes in Attr.td
7199 // that do not list any subjects.
7200 S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
7201 << AL << AL.isRegularKeywordAttribute() << D->getLocation();
7202 break;
7203 case ParsedAttr::AT_Interrupt:
7204 handleInterruptAttr(S, D, AL);
7205 break;
7206 case ParsedAttr::AT_ARMInterruptSaveFP:
7207 S.ARM().handleInterruptSaveFPAttr(D, AL);
7208 break;
7209 case ParsedAttr::AT_X86ForceAlignArgPointer:
7211 break;
7212 case ParsedAttr::AT_ReadOnlyPlacement:
7214 break;
7215 case ParsedAttr::AT_DLLExport:
7216 case ParsedAttr::AT_DLLImport:
7217 handleDLLAttr(S, D, AL);
7218 break;
7219 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
7221 break;
7222 case ParsedAttr::AT_AMDGPUWavesPerEU:
7224 break;
7225 case ParsedAttr::AT_AMDGPUNumSGPR:
7227 break;
7228 case ParsedAttr::AT_AMDGPUNumVGPR:
7230 break;
7231 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
7233 break;
7234 case ParsedAttr::AT_AVRSignal:
7235 S.AVR().handleSignalAttr(D, AL);
7236 break;
7237 case ParsedAttr::AT_BPFPreserveAccessIndex:
7239 break;
7240 case ParsedAttr::AT_BPFPreserveStaticOffset:
7242 break;
7243 case ParsedAttr::AT_BTFDeclTag:
7244 handleBTFDeclTagAttr(S, D, AL);
7245 break;
7246 case ParsedAttr::AT_WebAssemblyExportName:
7248 break;
7249 case ParsedAttr::AT_WebAssemblyImportModule:
7251 break;
7252 case ParsedAttr::AT_WebAssemblyImportName:
7254 break;
7255 case ParsedAttr::AT_IBOutlet:
7256 S.ObjC().handleIBOutlet(D, AL);
7257 break;
7258 case ParsedAttr::AT_IBOutletCollection:
7259 S.ObjC().handleIBOutletCollection(D, AL);
7260 break;
7261 case ParsedAttr::AT_IFunc:
7262 handleIFuncAttr(S, D, AL);
7263 break;
7264 case ParsedAttr::AT_Alias:
7265 handleAliasAttr(S, D, AL);
7266 break;
7267 case ParsedAttr::AT_Aligned:
7268 handleAlignedAttr(S, D, AL);
7269 break;
7270 case ParsedAttr::AT_AlignValue:
7271 handleAlignValueAttr(S, D, AL);
7272 break;
7273 case ParsedAttr::AT_AllocSize:
7274 handleAllocSizeAttr(S, D, AL);
7275 break;
7276 case ParsedAttr::AT_AlwaysInline:
7277 handleAlwaysInlineAttr(S, D, AL);
7278 break;
7279 case ParsedAttr::AT_AnalyzerNoReturn:
7281 break;
7282 case ParsedAttr::AT_TLSModel:
7283 handleTLSModelAttr(S, D, AL);
7284 break;
7285 case ParsedAttr::AT_Annotate:
7286 handleAnnotateAttr(S, D, AL);
7287 break;
7288 case ParsedAttr::AT_Availability:
7289 handleAvailabilityAttr(S, D, AL);
7290 break;
7291 case ParsedAttr::AT_CarriesDependency:
7292 handleDependencyAttr(S, scope, D, AL);
7293 break;
7294 case ParsedAttr::AT_CPUDispatch:
7295 case ParsedAttr::AT_CPUSpecific:
7296 handleCPUSpecificAttr(S, D, AL);
7297 break;
7298 case ParsedAttr::AT_Common:
7299 handleCommonAttr(S, D, AL);
7300 break;
7301 case ParsedAttr::AT_CUDAConstant:
7302 handleConstantAttr(S, D, AL);
7303 break;
7304 case ParsedAttr::AT_PassObjectSize:
7305 handlePassObjectSizeAttr(S, D, AL);
7306 break;
7307 case ParsedAttr::AT_Constructor:
7308 handleConstructorAttr(S, D, AL);
7309 break;
7310 case ParsedAttr::AT_Deprecated:
7311 handleDeprecatedAttr(S, D, AL);
7312 break;
7313 case ParsedAttr::AT_Destructor:
7314 handleDestructorAttr(S, D, AL);
7315 break;
7316 case ParsedAttr::AT_EnableIf:
7317 handleEnableIfAttr(S, D, AL);
7318 break;
7319 case ParsedAttr::AT_Error:
7320 handleErrorAttr(S, D, AL);
7321 break;
7322 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
7324 break;
7325 case ParsedAttr::AT_DiagnoseIf:
7326 handleDiagnoseIfAttr(S, D, AL);
7327 break;
7328 case ParsedAttr::AT_DiagnoseAsBuiltin:
7330 break;
7331 case ParsedAttr::AT_NoBuiltin:
7332 handleNoBuiltinAttr(S, D, AL);
7333 break;
7334 case ParsedAttr::AT_CFIUncheckedCallee:
7336 break;
7337 case ParsedAttr::AT_ExtVectorType:
7338 handleExtVectorTypeAttr(S, D, AL);
7339 break;
7340 case ParsedAttr::AT_ExternalSourceSymbol:
7342 break;
7343 case ParsedAttr::AT_MinSize:
7344 handleMinSizeAttr(S, D, AL);
7345 break;
7346 case ParsedAttr::AT_OptimizeNone:
7347 handleOptimizeNoneAttr(S, D, AL);
7348 break;
7349 case ParsedAttr::AT_EnumExtensibility:
7351 break;
7352 case ParsedAttr::AT_SYCLKernel:
7353 S.SYCL().handleKernelAttr(D, AL);
7354 break;
7355 case ParsedAttr::AT_SYCLExternal:
7357 break;
7358 case ParsedAttr::AT_SYCLKernelEntryPoint:
7360 break;
7361 case ParsedAttr::AT_SYCLSpecialClass:
7363 break;
7364 case ParsedAttr::AT_Format:
7365 handleFormatAttr(S, D, AL);
7366 break;
7367 case ParsedAttr::AT_FormatMatches:
7368 handleFormatMatchesAttr(S, D, AL);
7369 break;
7370 case ParsedAttr::AT_FormatArg:
7371 handleFormatArgAttr(S, D, AL);
7372 break;
7373 case ParsedAttr::AT_Callback:
7374 handleCallbackAttr(S, D, AL);
7375 break;
7376 case ParsedAttr::AT_LifetimeCaptureBy:
7378 break;
7379 case ParsedAttr::AT_CalledOnce:
7380 handleCalledOnceAttr(S, D, AL);
7381 break;
7382 case ParsedAttr::AT_CUDAGlobal:
7383 handleGlobalAttr(S, D, AL);
7384 break;
7385 case ParsedAttr::AT_CUDADevice:
7386 handleDeviceAttr(S, D, AL);
7387 break;
7388 case ParsedAttr::AT_CUDAGridConstant:
7389 handleGridConstantAttr(S, D, AL);
7390 break;
7391 case ParsedAttr::AT_HIPManaged:
7392 handleManagedAttr(S, D, AL);
7393 break;
7394 case ParsedAttr::AT_GNUInline:
7395 handleGNUInlineAttr(S, D, AL);
7396 break;
7397 case ParsedAttr::AT_CUDALaunchBounds:
7398 handleLaunchBoundsAttr(S, D, AL);
7399 break;
7400 case ParsedAttr::AT_CUDAClusterDims:
7401 handleClusterDimsAttr(S, D, AL);
7402 break;
7403 case ParsedAttr::AT_CUDANoCluster:
7404 handleNoClusterAttr(S, D, AL);
7405 break;
7406 case ParsedAttr::AT_Restrict:
7407 handleRestrictAttr(S, D, AL);
7408 break;
7409 case ParsedAttr::AT_MallocSpan:
7410 handleMallocSpanAttr(S, D, AL);
7411 break;
7412 case ParsedAttr::AT_Mode:
7413 handleModeAttr(S, D, AL);
7414 break;
7415 case ParsedAttr::AT_NonString:
7416 handleNonStringAttr(S, D, AL);
7417 break;
7418 case ParsedAttr::AT_NonNull:
7419 if (auto *PVD = dyn_cast<ParmVarDecl>(D))
7420 handleNonNullAttrParameter(S, PVD, AL);
7421 else
7422 handleNonNullAttr(S, D, AL);
7423 break;
7424 case ParsedAttr::AT_ReturnsNonNull:
7425 handleReturnsNonNullAttr(S, D, AL);
7426 break;
7427 case ParsedAttr::AT_NoEscape:
7428 handleNoEscapeAttr(S, D, AL);
7429 break;
7430 case ParsedAttr::AT_MaybeUndef:
7432 break;
7433 case ParsedAttr::AT_AssumeAligned:
7434 handleAssumeAlignedAttr(S, D, AL);
7435 break;
7436 case ParsedAttr::AT_AllocAlign:
7437 handleAllocAlignAttr(S, D, AL);
7438 break;
7439 case ParsedAttr::AT_Ownership:
7440 handleOwnershipAttr(S, D, AL);
7441 break;
7442 case ParsedAttr::AT_Naked:
7443 handleNakedAttr(S, D, AL);
7444 break;
7445 case ParsedAttr::AT_NoReturn:
7446 handleNoReturnAttr(S, D, AL);
7447 break;
7448 case ParsedAttr::AT_CXX11NoReturn:
7450 break;
7451 case ParsedAttr::AT_AnyX86NoCfCheck:
7452 handleNoCfCheckAttr(S, D, AL);
7453 break;
7454 case ParsedAttr::AT_NoThrow:
7455 if (!AL.isUsedAsTypeAttr())
7457 break;
7458 case ParsedAttr::AT_CUDAShared:
7459 handleSharedAttr(S, D, AL);
7460 break;
7461 case ParsedAttr::AT_VecReturn:
7462 handleVecReturnAttr(S, D, AL);
7463 break;
7464 case ParsedAttr::AT_ObjCOwnership:
7465 S.ObjC().handleOwnershipAttr(D, AL);
7466 break;
7467 case ParsedAttr::AT_ObjCPreciseLifetime:
7469 break;
7470 case ParsedAttr::AT_ObjCReturnsInnerPointer:
7472 break;
7473 case ParsedAttr::AT_ObjCRequiresSuper:
7474 S.ObjC().handleRequiresSuperAttr(D, AL);
7475 break;
7476 case ParsedAttr::AT_ObjCBridge:
7477 S.ObjC().handleBridgeAttr(D, AL);
7478 break;
7479 case ParsedAttr::AT_ObjCBridgeMutable:
7480 S.ObjC().handleBridgeMutableAttr(D, AL);
7481 break;
7482 case ParsedAttr::AT_ObjCBridgeRelated:
7483 S.ObjC().handleBridgeRelatedAttr(D, AL);
7484 break;
7485 case ParsedAttr::AT_ObjCDesignatedInitializer:
7487 break;
7488 case ParsedAttr::AT_ObjCRuntimeName:
7489 S.ObjC().handleRuntimeName(D, AL);
7490 break;
7491 case ParsedAttr::AT_ObjCBoxable:
7492 S.ObjC().handleBoxable(D, AL);
7493 break;
7494 case ParsedAttr::AT_NSErrorDomain:
7495 S.ObjC().handleNSErrorDomain(D, AL);
7496 break;
7497 case ParsedAttr::AT_CFConsumed:
7498 case ParsedAttr::AT_NSConsumed:
7499 case ParsedAttr::AT_OSConsumed:
7500 S.ObjC().AddXConsumedAttr(D, AL,
7502 /*IsTemplateInstantiation=*/false);
7503 break;
7504 case ParsedAttr::AT_OSReturnsRetainedOnZero:
7506 S, D, AL, S.ObjC().isValidOSObjectOutParameter(D),
7507 diag::warn_ns_attribute_wrong_parameter_type,
7508 /*Extra Args=*/AL, /*pointer-to-OSObject-pointer*/ 3, AL.getRange());
7509 break;
7510 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
7512 S, D, AL, S.ObjC().isValidOSObjectOutParameter(D),
7513 diag::warn_ns_attribute_wrong_parameter_type,
7514 /*Extra Args=*/AL, /*pointer-to-OSObject-poointer*/ 3, AL.getRange());
7515 break;
7516 case ParsedAttr::AT_NSReturnsAutoreleased:
7517 case ParsedAttr::AT_NSReturnsNotRetained:
7518 case ParsedAttr::AT_NSReturnsRetained:
7519 case ParsedAttr::AT_CFReturnsNotRetained:
7520 case ParsedAttr::AT_CFReturnsRetained:
7521 case ParsedAttr::AT_OSReturnsNotRetained:
7522 case ParsedAttr::AT_OSReturnsRetained:
7524 break;
7525 case ParsedAttr::AT_WorkGroupSizeHint:
7527 break;
7528 case ParsedAttr::AT_ReqdWorkGroupSize:
7530 break;
7531 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
7532 S.OpenCL().handleSubGroupSize(D, AL);
7533 break;
7534 case ParsedAttr::AT_VecTypeHint:
7535 handleVecTypeHint(S, D, AL);
7536 break;
7537 case ParsedAttr::AT_InitPriority:
7538 handleInitPriorityAttr(S, D, AL);
7539 break;
7540 case ParsedAttr::AT_Packed:
7541 handlePackedAttr(S, D, AL);
7542 break;
7543 case ParsedAttr::AT_PreferredName:
7544 handlePreferredName(S, D, AL);
7545 break;
7546 case ParsedAttr::AT_NoSpecializations:
7547 handleNoSpecializations(S, D, AL);
7548 break;
7549 case ParsedAttr::AT_Section:
7550 handleSectionAttr(S, D, AL);
7551 break;
7552 case ParsedAttr::AT_CodeModel:
7553 handleCodeModelAttr(S, D, AL);
7554 break;
7555 case ParsedAttr::AT_RandomizeLayout:
7556 handleRandomizeLayoutAttr(S, D, AL);
7557 break;
7558 case ParsedAttr::AT_NoRandomizeLayout:
7560 break;
7561 case ParsedAttr::AT_CodeSeg:
7562 handleCodeSegAttr(S, D, AL);
7563 break;
7564 case ParsedAttr::AT_Target:
7565 handleTargetAttr(S, D, AL);
7566 break;
7567 case ParsedAttr::AT_TargetVersion:
7568 handleTargetVersionAttr(S, D, AL);
7569 break;
7570 case ParsedAttr::AT_TargetClones:
7571 handleTargetClonesAttr(S, D, AL);
7572 break;
7573 case ParsedAttr::AT_MinVectorWidth:
7574 handleMinVectorWidthAttr(S, D, AL);
7575 break;
7576 case ParsedAttr::AT_Unavailable:
7578 break;
7579 case ParsedAttr::AT_OMPAssume:
7580 S.OpenMP().handleOMPAssumeAttr(D, AL);
7581 break;
7582 case ParsedAttr::AT_ObjCDirect:
7583 S.ObjC().handleDirectAttr(D, AL);
7584 break;
7585 case ParsedAttr::AT_ObjCDirectMembers:
7586 S.ObjC().handleDirectMembersAttr(D, AL);
7588 break;
7589 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
7591 break;
7592 case ParsedAttr::AT_Unused:
7593 handleUnusedAttr(S, D, AL);
7594 break;
7595 case ParsedAttr::AT_Visibility:
7596 handleVisibilityAttr(S, D, AL, false);
7597 break;
7598 case ParsedAttr::AT_TypeVisibility:
7599 handleVisibilityAttr(S, D, AL, true);
7600 break;
7601 case ParsedAttr::AT_WarnUnusedResult:
7602 handleWarnUnusedResult(S, D, AL);
7603 break;
7604 case ParsedAttr::AT_WeakRef:
7605 handleWeakRefAttr(S, D, AL);
7606 break;
7607 case ParsedAttr::AT_WeakImport:
7608 handleWeakImportAttr(S, D, AL);
7609 break;
7610 case ParsedAttr::AT_TransparentUnion:
7612 break;
7613 case ParsedAttr::AT_ObjCMethodFamily:
7614 S.ObjC().handleMethodFamilyAttr(D, AL);
7615 break;
7616 case ParsedAttr::AT_ObjCNSObject:
7617 S.ObjC().handleNSObject(D, AL);
7618 break;
7619 case ParsedAttr::AT_ObjCIndependentClass:
7620 S.ObjC().handleIndependentClass(D, AL);
7621 break;
7622 case ParsedAttr::AT_Blocks:
7623 S.ObjC().handleBlocksAttr(D, AL);
7624 break;
7625 case ParsedAttr::AT_Sentinel:
7626 handleSentinelAttr(S, D, AL);
7627 break;
7628 case ParsedAttr::AT_Cleanup:
7629 handleCleanupAttr(S, D, AL);
7630 break;
7631 case ParsedAttr::AT_NoDebug:
7632 handleNoDebugAttr(S, D, AL);
7633 break;
7634 case ParsedAttr::AT_CmseNSEntry:
7635 S.ARM().handleCmseNSEntryAttr(D, AL);
7636 break;
7637 case ParsedAttr::AT_StdCall:
7638 case ParsedAttr::AT_CDecl:
7639 case ParsedAttr::AT_FastCall:
7640 case ParsedAttr::AT_ThisCall:
7641 case ParsedAttr::AT_Pascal:
7642 case ParsedAttr::AT_RegCall:
7643 case ParsedAttr::AT_SwiftCall:
7644 case ParsedAttr::AT_SwiftAsyncCall:
7645 case ParsedAttr::AT_VectorCall:
7646 case ParsedAttr::AT_MSABI:
7647 case ParsedAttr::AT_SysVABI:
7648 case ParsedAttr::AT_Pcs:
7649 case ParsedAttr::AT_IntelOclBicc:
7650 case ParsedAttr::AT_PreserveMost:
7651 case ParsedAttr::AT_PreserveAll:
7652 case ParsedAttr::AT_AArch64VectorPcs:
7653 case ParsedAttr::AT_AArch64SVEPcs:
7654 case ParsedAttr::AT_M68kRTD:
7655 case ParsedAttr::AT_PreserveNone:
7656 case ParsedAttr::AT_RISCVVectorCC:
7657 case ParsedAttr::AT_RISCVVLSCC:
7658 handleCallConvAttr(S, D, AL);
7659 break;
7660 case ParsedAttr::AT_DeviceKernel:
7661 handleDeviceKernelAttr(S, D, AL);
7662 break;
7663 case ParsedAttr::AT_Suppress:
7664 handleSuppressAttr(S, D, AL);
7665 break;
7666 case ParsedAttr::AT_Owner:
7667 case ParsedAttr::AT_Pointer:
7669 break;
7670 case ParsedAttr::AT_OpenCLAccess:
7671 S.OpenCL().handleAccessAttr(D, AL);
7672 break;
7673 case ParsedAttr::AT_OpenCLNoSVM:
7674 S.OpenCL().handleNoSVMAttr(D, AL);
7675 break;
7676 case ParsedAttr::AT_SwiftContext:
7678 break;
7679 case ParsedAttr::AT_SwiftAsyncContext:
7681 break;
7682 case ParsedAttr::AT_SwiftErrorResult:
7684 break;
7685 case ParsedAttr::AT_SwiftIndirectResult:
7687 break;
7688 case ParsedAttr::AT_InternalLinkage:
7689 handleInternalLinkageAttr(S, D, AL);
7690 break;
7691 case ParsedAttr::AT_ZeroCallUsedRegs:
7693 break;
7694 case ParsedAttr::AT_FunctionReturnThunks:
7696 break;
7697 case ParsedAttr::AT_NoMerge:
7698 handleNoMergeAttr(S, D, AL);
7699 break;
7700 case ParsedAttr::AT_NoUniqueAddress:
7701 handleNoUniqueAddressAttr(S, D, AL);
7702 break;
7703
7704 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
7706 break;
7707
7708 case ParsedAttr::AT_CountedBy:
7709 case ParsedAttr::AT_CountedByOrNull:
7710 case ParsedAttr::AT_SizedBy:
7711 case ParsedAttr::AT_SizedByOrNull:
7712 handleCountedByAttrField(S, D, AL);
7713 break;
7714
7715 // Microsoft attributes:
7716 case ParsedAttr::AT_LayoutVersion:
7717 handleLayoutVersion(S, D, AL);
7718 break;
7719 case ParsedAttr::AT_Uuid:
7720 handleUuidAttr(S, D, AL);
7721 break;
7722 case ParsedAttr::AT_MSInheritance:
7723 handleMSInheritanceAttr(S, D, AL);
7724 break;
7725 case ParsedAttr::AT_Thread:
7726 handleDeclspecThreadAttr(S, D, AL);
7727 break;
7728 case ParsedAttr::AT_MSConstexpr:
7729 handleMSConstexprAttr(S, D, AL);
7730 break;
7731 case ParsedAttr::AT_HybridPatchable:
7733 break;
7734
7735 // HLSL attributes:
7736 case ParsedAttr::AT_RootSignature:
7737 S.HLSL().handleRootSignatureAttr(D, AL);
7738 break;
7739 case ParsedAttr::AT_HLSLNumThreads:
7740 S.HLSL().handleNumThreadsAttr(D, AL);
7741 break;
7742 case ParsedAttr::AT_HLSLWaveSize:
7743 S.HLSL().handleWaveSizeAttr(D, AL);
7744 break;
7745 case ParsedAttr::AT_HLSLVkExtBuiltinInput:
7747 break;
7748 case ParsedAttr::AT_HLSLVkConstantId:
7749 S.HLSL().handleVkConstantIdAttr(D, AL);
7750 break;
7751 case ParsedAttr::AT_HLSLVkBinding:
7752 S.HLSL().handleVkBindingAttr(D, AL);
7753 break;
7754 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
7756 break;
7757 case ParsedAttr::AT_HLSLPackOffset:
7758 S.HLSL().handlePackOffsetAttr(D, AL);
7759 break;
7760 case ParsedAttr::AT_HLSLShader:
7761 S.HLSL().handleShaderAttr(D, AL);
7762 break;
7763 case ParsedAttr::AT_HLSLResourceBinding:
7765 break;
7766 case ParsedAttr::AT_HLSLParamModifier:
7767 S.HLSL().handleParamModifierAttr(D, AL);
7768 break;
7769 case ParsedAttr::AT_HLSLUnparsedSemantic:
7770 S.HLSL().handleSemanticAttr(D, AL);
7771 break;
7772 case ParsedAttr::AT_HLSLVkLocation:
7773 S.HLSL().handleVkLocationAttr(D, AL);
7774 break;
7775
7776 case ParsedAttr::AT_AbiTag:
7777 handleAbiTagAttr(S, D, AL);
7778 break;
7779 case ParsedAttr::AT_CFGuard:
7780 handleCFGuardAttr(S, D, AL);
7781 break;
7782
7783 // Thread safety attributes:
7784 case ParsedAttr::AT_PtGuardedVar:
7785 handlePtGuardedVarAttr(S, D, AL);
7786 break;
7787 case ParsedAttr::AT_NoSanitize:
7788 handleNoSanitizeAttr(S, D, AL);
7789 break;
7790 case ParsedAttr::AT_NoSanitizeAddress:
7792 break;
7793 case ParsedAttr::AT_NoSanitizeThread:
7795 break;
7796 case ParsedAttr::AT_NoSanitizeMemory:
7798 break;
7799 case ParsedAttr::AT_GuardedBy:
7800 handleGuardedByAttr(S, D, AL);
7801 break;
7802 case ParsedAttr::AT_PtGuardedBy:
7803 handlePtGuardedByAttr(S, D, AL);
7804 break;
7805 case ParsedAttr::AT_LockReturned:
7806 handleLockReturnedAttr(S, D, AL);
7807 break;
7808 case ParsedAttr::AT_LocksExcluded:
7809 handleLocksExcludedAttr(S, D, AL);
7810 break;
7811 case ParsedAttr::AT_AcquiredBefore:
7812 handleAcquiredBeforeAttr(S, D, AL);
7813 break;
7814 case ParsedAttr::AT_AcquiredAfter:
7815 handleAcquiredAfterAttr(S, D, AL);
7816 break;
7817
7818 // Capability analysis attributes.
7819 case ParsedAttr::AT_Capability:
7820 case ParsedAttr::AT_Lockable:
7821 handleCapabilityAttr(S, D, AL);
7822 break;
7823 case ParsedAttr::AT_ReentrantCapability:
7825 break;
7826 case ParsedAttr::AT_RequiresCapability:
7828 break;
7829
7830 case ParsedAttr::AT_AssertCapability:
7832 break;
7833 case ParsedAttr::AT_AcquireCapability:
7835 break;
7836 case ParsedAttr::AT_ReleaseCapability:
7838 break;
7839 case ParsedAttr::AT_TryAcquireCapability:
7841 break;
7842
7843 // Consumed analysis attributes.
7844 case ParsedAttr::AT_Consumable:
7845 handleConsumableAttr(S, D, AL);
7846 break;
7847 case ParsedAttr::AT_CallableWhen:
7848 handleCallableWhenAttr(S, D, AL);
7849 break;
7850 case ParsedAttr::AT_ParamTypestate:
7851 handleParamTypestateAttr(S, D, AL);
7852 break;
7853 case ParsedAttr::AT_ReturnTypestate:
7854 handleReturnTypestateAttr(S, D, AL);
7855 break;
7856 case ParsedAttr::AT_SetTypestate:
7857 handleSetTypestateAttr(S, D, AL);
7858 break;
7859 case ParsedAttr::AT_TestTypestate:
7860 handleTestTypestateAttr(S, D, AL);
7861 break;
7862
7863 // Type safety attributes.
7864 case ParsedAttr::AT_ArgumentWithTypeTag:
7866 break;
7867 case ParsedAttr::AT_TypeTagForDatatype:
7869 break;
7870
7871 // Swift attributes.
7872 case ParsedAttr::AT_SwiftAsyncName:
7873 S.Swift().handleAsyncName(D, AL);
7874 break;
7875 case ParsedAttr::AT_SwiftAttr:
7876 S.Swift().handleAttrAttr(D, AL);
7877 break;
7878 case ParsedAttr::AT_SwiftBridge:
7879 S.Swift().handleBridge(D, AL);
7880 break;
7881 case ParsedAttr::AT_SwiftError:
7882 S.Swift().handleError(D, AL);
7883 break;
7884 case ParsedAttr::AT_SwiftName:
7885 S.Swift().handleName(D, AL);
7886 break;
7887 case ParsedAttr::AT_SwiftNewType:
7888 S.Swift().handleNewType(D, AL);
7889 break;
7890 case ParsedAttr::AT_SwiftAsync:
7891 S.Swift().handleAsyncAttr(D, AL);
7892 break;
7893 case ParsedAttr::AT_SwiftAsyncError:
7894 S.Swift().handleAsyncError(D, AL);
7895 break;
7896
7897 // XRay attributes.
7898 case ParsedAttr::AT_XRayLogArgs:
7899 handleXRayLogArgsAttr(S, D, AL);
7900 break;
7901
7902 case ParsedAttr::AT_PatchableFunctionEntry:
7904 break;
7905
7906 case ParsedAttr::AT_AlwaysDestroy:
7907 case ParsedAttr::AT_NoDestroy:
7908 handleDestroyAttr(S, D, AL);
7909 break;
7910
7911 case ParsedAttr::AT_Uninitialized:
7912 handleUninitializedAttr(S, D, AL);
7913 break;
7914
7915 case ParsedAttr::AT_ObjCExternallyRetained:
7917 break;
7918
7919 case ParsedAttr::AT_MIGServerRoutine:
7921 break;
7922
7923 case ParsedAttr::AT_MSAllocator:
7924 handleMSAllocatorAttr(S, D, AL);
7925 break;
7926
7927 case ParsedAttr::AT_ArmBuiltinAlias:
7928 S.ARM().handleBuiltinAliasAttr(D, AL);
7929 break;
7930
7931 case ParsedAttr::AT_ArmLocallyStreaming:
7933 break;
7934
7935 case ParsedAttr::AT_ArmNew:
7936 S.ARM().handleNewAttr(D, AL);
7937 break;
7938
7939 case ParsedAttr::AT_AcquireHandle:
7940 handleAcquireHandleAttr(S, D, AL);
7941 break;
7942
7943 case ParsedAttr::AT_ReleaseHandle:
7945 break;
7946
7947 case ParsedAttr::AT_UnsafeBufferUsage:
7949 break;
7950
7951 case ParsedAttr::AT_UseHandle:
7953 break;
7954
7955 case ParsedAttr::AT_EnforceTCB:
7957 break;
7958
7959 case ParsedAttr::AT_EnforceTCBLeaf:
7961 break;
7962
7963 case ParsedAttr::AT_BuiltinAlias:
7964 handleBuiltinAliasAttr(S, D, AL);
7965 break;
7966
7967 case ParsedAttr::AT_PreferredType:
7968 handlePreferredTypeAttr(S, D, AL);
7969 break;
7970
7971 case ParsedAttr::AT_UsingIfExists:
7973 break;
7974
7975 case ParsedAttr::AT_TypeNullable:
7976 handleNullableTypeAttr(S, D, AL);
7977 break;
7978
7979 case ParsedAttr::AT_VTablePointerAuthentication:
7981 break;
7982
7983 case ParsedAttr::AT_ModularFormat:
7984 handleModularFormat(S, D, AL);
7985 break;
7986 }
7987}
7988
7989static bool isKernelDecl(Decl *D) {
7990 const FunctionType *FnTy = D->getFunctionType();
7991 return D->hasAttr<DeviceKernelAttr>() ||
7992 (FnTy && FnTy->getCallConv() == CallingConv::CC_DeviceKernel) ||
7993 D->hasAttr<CUDAGlobalAttr>();
7994}
7995
7997 Scope *S, Decl *D, const ParsedAttributesView &AttrList,
7998 const ProcessDeclAttributeOptions &Options) {
7999 if (AttrList.empty())
8000 return;
8001
8002 for (const ParsedAttr &AL : AttrList)
8003 ProcessDeclAttribute(*this, S, D, AL, Options);
8004
8005 // FIXME: We should be able to handle these cases in TableGen.
8006 // GCC accepts
8007 // static int a9 __attribute__((weakref));
8008 // but that looks really pointless. We reject it.
8009 if (D->hasAttr<WeakRefAttr>() && !D->hasAttr<AliasAttr>()) {
8010 Diag(AttrList.begin()->getLoc(), diag::err_attribute_weakref_without_alias)
8011 << cast<NamedDecl>(D);
8012 D->dropAttr<WeakRefAttr>();
8013 return;
8014 }
8015
8016 // FIXME: We should be able to handle this in TableGen as well. It would be
8017 // good to have a way to specify "these attributes must appear as a group",
8018 // for these. Additionally, it would be good to have a way to specify "these
8019 // attribute must never appear as a group" for attributes like cold and hot.
8020 if (!(D->hasAttr<DeviceKernelAttr>() ||
8021 (D->hasAttr<CUDAGlobalAttr>() &&
8022 Context.getTargetInfo().getTriple().isSPIRV()))) {
8023 // These attributes cannot be applied to a non-kernel function.
8024 if (const auto *A = D->getAttr<ReqdWorkGroupSizeAttr>()) {
8025 // FIXME: This emits a different error message than
8026 // diag::err_attribute_wrong_decl_type + ExpectedKernelFunction.
8027 Diag(D->getLocation(), diag::err_opencl_kernel_attr) << A;
8028 D->setInvalidDecl();
8029 } else if (const auto *A = D->getAttr<WorkGroupSizeHintAttr>()) {
8030 Diag(D->getLocation(), diag::err_opencl_kernel_attr) << A;
8031 D->setInvalidDecl();
8032 } else if (const auto *A = D->getAttr<VecTypeHintAttr>()) {
8033 Diag(D->getLocation(), diag::err_opencl_kernel_attr) << A;
8034 D->setInvalidDecl();
8035 } else if (const auto *A = D->getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
8036 Diag(D->getLocation(), diag::err_opencl_kernel_attr) << A;
8037 D->setInvalidDecl();
8038 }
8039 }
8040 if (!isKernelDecl(D)) {
8041 if (const auto *A = D->getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
8042 Diag(D->getLocation(), diag::err_attribute_wrong_decl_type)
8043 << A << A->isRegularKeywordAttribute() << ExpectedKernelFunction;
8044 D->setInvalidDecl();
8045 } else if (const auto *A = D->getAttr<AMDGPUWavesPerEUAttr>()) {
8046 Diag(D->getLocation(), diag::err_attribute_wrong_decl_type)
8047 << A << A->isRegularKeywordAttribute() << ExpectedKernelFunction;
8048 D->setInvalidDecl();
8049 } else if (const auto *A = D->getAttr<AMDGPUNumSGPRAttr>()) {
8050 Diag(D->getLocation(), diag::err_attribute_wrong_decl_type)
8051 << A << A->isRegularKeywordAttribute() << ExpectedKernelFunction;
8052 D->setInvalidDecl();
8053 } else if (const auto *A = D->getAttr<AMDGPUNumVGPRAttr>()) {
8054 Diag(D->getLocation(), diag::err_attribute_wrong_decl_type)
8055 << A << A->isRegularKeywordAttribute() << ExpectedKernelFunction;
8056 D->setInvalidDecl();
8057 }
8058 }
8059
8060 // CUDA/HIP: restrict explicit CUDA target attributes on deduction guides.
8061 //
8062 // Deduction guides are not callable functions and never participate in
8063 // codegen; they are always treated as host+device for CUDA/HIP semantic
8064 // checks. We therefore allow either no CUDA target attributes or an explicit
8065 // '__host__ __device__' annotation, but reject guides that are host-only,
8066 // device-only, or marked '__global__'. The use of explicit CUDA/HIP target
8067 // attributes on deduction guides is deprecated and will be rejected in a
8068 // future Clang version.
8069 if (getLangOpts().CUDA)
8070 if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
8071 bool HasHost = Guide->hasAttr<CUDAHostAttr>();
8072 bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
8073 bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
8074
8075 if (HasGlobal || HasHost != HasDevice) {
8076 Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
8077 Guide->setInvalidDecl();
8078 } else if (HasHost && HasDevice) {
8079 Diag(Guide->getLocation(),
8080 diag::warn_deduction_guide_target_attr_deprecated);
8081 }
8082 }
8083
8084 // Do not permit 'constructor' or 'destructor' attributes on __device__ code.
8085 if (getLangOpts().CUDAIsDevice && D->hasAttr<CUDADeviceAttr>() &&
8086 (D->hasAttr<ConstructorAttr>() || D->hasAttr<DestructorAttr>()) &&
8087 !getLangOpts().GPUAllowDeviceInit) {
8088 Diag(D->getLocation(), diag::err_cuda_ctor_dtor_attrs)
8089 << (D->hasAttr<ConstructorAttr>() ? "constructors" : "destructors");
8090 D->setInvalidDecl();
8091 }
8092
8093 // Do this check after processing D's attributes because the attribute
8094 // objc_method_family can change whether the given method is in the init
8095 // family, and it can be applied after objc_designated_initializer. This is a
8096 // bit of a hack, but we need it to be compatible with versions of clang that
8097 // processed the attribute list in the wrong order.
8098 if (D->hasAttr<ObjCDesignatedInitializerAttr>() &&
8099 cast<ObjCMethodDecl>(D)->getMethodFamily() != OMF_init) {
8100 Diag(D->getLocation(), diag::err_designated_init_attr_non_init);
8101 D->dropAttr<ObjCDesignatedInitializerAttr>();
8102 }
8103}
8104
8106 const ParsedAttributesView &AttrList) {
8107 for (const ParsedAttr &AL : AttrList)
8108 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
8109 handleTransparentUnionAttr(*this, D, AL);
8110 break;
8111 }
8112
8113 // For BPFPreserveAccessIndexAttr, we want to populate the attributes
8114 // to fields and inner records as well.
8115 if (D && D->hasAttr<BPFPreserveAccessIndexAttr>())
8117}
8118
8120 AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList) {
8121 for (const ParsedAttr &AL : AttrList) {
8122 if (AL.getKind() == ParsedAttr::AT_Annotate) {
8123 ProcessDeclAttribute(*this, nullptr, ASDecl, AL,
8125 } else {
8126 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
8127 return true;
8128 }
8129 }
8130 return false;
8131}
8132
8133/// checkUnusedDeclAttributes - Check a list of attributes to see if it
8134/// contains any decl attributes that we should warn about.
8136 for (const ParsedAttr &AL : A) {
8137 // Only warn if the attribute is an unignored, non-type attribute.
8138 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
8139 continue;
8140 if (AL.getKind() == ParsedAttr::IgnoredAttribute)
8141 continue;
8142
8143 if (AL.getKind() == ParsedAttr::UnknownAttribute) {
8145 } else {
8146 S.Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
8147 << AL.getRange();
8148 }
8149 }
8150}
8151
8159
8162 StringRef ScopeName = AL.getNormalizedScopeName();
8163 std::optional<StringRef> CorrectedScopeName =
8164 AL.tryGetCorrectedScopeName(ScopeName);
8165 if (CorrectedScopeName) {
8166 ScopeName = *CorrectedScopeName;
8167 }
8168
8169 StringRef AttrName = AL.getNormalizedAttrName(ScopeName);
8170 std::optional<StringRef> CorrectedAttrName = AL.tryGetCorrectedAttrName(
8171 ScopeName, AttrName, Context.getTargetInfo(), getLangOpts());
8172 if (CorrectedAttrName) {
8173 AttrName = *CorrectedAttrName;
8174 }
8175
8176 if (CorrectedScopeName || CorrectedAttrName) {
8177 std::string CorrectedFullName =
8178 AL.getNormalizedFullName(ScopeName, AttrName);
8180 Diag(CorrectedScopeName ? NR.getBegin() : AL.getRange().getBegin(),
8181 diag::warn_unknown_attribute_ignored_suggestion);
8182
8183 D << AL << CorrectedFullName;
8184
8185 if (AL.isExplicitScope()) {
8186 D << FixItHint::CreateReplacement(NR, CorrectedFullName) << NR;
8187 } else {
8188 if (CorrectedScopeName) {
8190 ScopeName);
8191 }
8192 if (CorrectedAttrName) {
8193 D << FixItHint::CreateReplacement(AL.getRange(), AttrName);
8194 }
8195 }
8196 } else {
8197 Diag(NR.getBegin(), diag::warn_unknown_attribute_ignored) << AL << NR;
8198 }
8199}
8200
8202 SourceLocation Loc) {
8203 assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
8204 NamedDecl *NewD = nullptr;
8205 if (auto *FD = dyn_cast<FunctionDecl>(ND)) {
8206 FunctionDecl *NewFD;
8207 // FIXME: Missing call to CheckFunctionDeclaration().
8208 // FIXME: Mangling?
8209 // FIXME: Is the qualifier info correct?
8210 // FIXME: Is the DeclContext correct?
8211 NewFD = FunctionDecl::Create(
8212 FD->getASTContext(), FD->getDeclContext(), Loc, Loc,
8214 getCurFPFeatures().isFPConstrained(), false /*isInlineSpecified*/,
8217 NewD = NewFD;
8218
8219 if (FD->getQualifier())
8220 NewFD->setQualifierInfo(FD->getQualifierLoc());
8221
8222 // Fake up parameter variables; they are declared as if this were
8223 // a typedef.
8224 QualType FDTy = FD->getType();
8225 if (const auto *FT = FDTy->getAs<FunctionProtoType>()) {
8227 for (const auto &AI : FT->param_types()) {
8228 ParmVarDecl *Param = BuildParmVarDeclForTypedef(NewFD, Loc, AI);
8229 Param->setScopeInfo(0, Params.size());
8230 Params.push_back(Param);
8231 }
8232 NewFD->setParams(Params);
8233 }
8234 } else if (auto *VD = dyn_cast<VarDecl>(ND)) {
8235 NewD = VarDecl::Create(VD->getASTContext(), VD->getDeclContext(),
8236 VD->getInnerLocStart(), VD->getLocation(), II,
8237 VD->getType(), VD->getTypeSourceInfo(),
8238 VD->getStorageClass());
8239 if (VD->getQualifier())
8240 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
8241 }
8242 return NewD;
8243}
8244
8246 if (W.getAlias()) { // clone decl, impersonate __attribute(weak,alias(...))
8247 IdentifierInfo *NDId = ND->getIdentifier();
8248 NamedDecl *NewD = DeclClonePragmaWeak(ND, W.getAlias(), W.getLocation());
8249 NewD->addAttr(
8250 AliasAttr::CreateImplicit(Context, NDId->getName(), W.getLocation()));
8251 NewD->addAttr(WeakAttr::CreateImplicit(Context, W.getLocation()));
8252 WeakTopLevelDecl.push_back(NewD);
8253 // FIXME: "hideous" code from Sema::LazilyCreateBuiltin
8254 // to insert Decl at TU scope, sorry.
8255 DeclContext *SavedContext = CurContext;
8256 CurContext = Context.getTranslationUnitDecl();
8259 PushOnScopeChains(NewD, S);
8260 CurContext = SavedContext;
8261 } else { // just add weak to existing
8262 ND->addAttr(WeakAttr::CreateImplicit(Context, W.getLocation()));
8263 }
8264}
8265
8267 // It's valid to "forward-declare" #pragma weak, in which case we
8268 // have to do this.
8270 if (WeakUndeclaredIdentifiers.empty())
8271 return;
8272 NamedDecl *ND = nullptr;
8273 if (auto *VD = dyn_cast<VarDecl>(D))
8274 if (VD->isExternC())
8275 ND = VD;
8276 if (auto *FD = dyn_cast<FunctionDecl>(D))
8277 if (FD->isExternC())
8278 ND = FD;
8279 if (!ND)
8280 return;
8281 if (IdentifierInfo *Id = ND->getIdentifier()) {
8282 auto I = WeakUndeclaredIdentifiers.find(Id);
8283 if (I != WeakUndeclaredIdentifiers.end()) {
8284 auto &WeakInfos = I->second;
8285 for (const auto &W : WeakInfos)
8286 DeclApplyPragmaWeak(S, ND, W);
8287 std::remove_reference_t<decltype(WeakInfos)> EmptyWeakInfos;
8288 WeakInfos.swap(EmptyWeakInfos);
8289 }
8290 }
8291}
8292
8293/// ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in
8294/// it, apply them to D. This is a bit tricky because PD can have attributes
8295/// specified in many different places, and we need to find and apply them all.
8297 // Ordering of attributes can be important, so we take care to process
8298 // attributes in the order in which they appeared in the source code.
8299
8300 auto ProcessAttributesWithSliding =
8301 [&](const ParsedAttributesView &Src,
8302 const ProcessDeclAttributeOptions &Options) {
8303 ParsedAttributesView NonSlidingAttrs;
8304 for (ParsedAttr &AL : Src) {
8305 // FIXME: this sliding is specific to standard attributes and should
8306 // eventually be deprecated and removed as those are not intended to
8307 // slide to anything.
8308 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
8309 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
8310 // Skip processing the attribute, but do check if it appertains to
8311 // the declaration. This is needed for the `MatrixType` attribute,
8312 // which, despite being a type attribute, defines a `SubjectList`
8313 // that only allows it to be used on typedef declarations.
8314 AL.diagnoseAppertainsTo(*this, D);
8315 } else {
8316 NonSlidingAttrs.addAtEnd(&AL);
8317 }
8318 }
8319 ProcessDeclAttributeList(S, D, NonSlidingAttrs, Options);
8320 };
8321
8322 // First, process attributes that appeared on the declaration itself (but
8323 // only if they don't have the legacy behavior of "sliding" to the DeclSepc).
8324 ProcessAttributesWithSliding(PD.getDeclarationAttributes(), {});
8325
8326 // Apply decl attributes from the DeclSpec if present.
8327 ProcessAttributesWithSliding(PD.getDeclSpec().getAttributes(),
8329 .WithIncludeCXX11Attributes(false)
8330 .WithIgnoreTypeAttributes(true));
8331
8332 // Walk the declarator structure, applying decl attributes that were in a type
8333 // position to the decl itself. This handles cases like:
8334 // int *__attr__(x)** D;
8335 // when X is a decl attribute.
8336 for (unsigned i = 0, e = PD.getNumTypeObjects(); i != e; ++i) {
8339 .WithIncludeCXX11Attributes(false)
8340 .WithIgnoreTypeAttributes(true));
8341 }
8342
8343 // Finally, apply any attributes on the decl itself.
8345
8346 // Apply additional attributes specified by '#pragma clang attribute'.
8347 AddPragmaAttributes(S, D);
8348
8349 // Look for API notes that map to attributes.
8350 ProcessAPINotes(D);
8351}
8352
8353/// Is the given declaration allowed to use a forbidden type?
8354/// If so, it'll still be annotated with an attribute that makes it
8355/// illegal to actually use.
8357 const DelayedDiagnostic &diag,
8358 UnavailableAttr::ImplicitReason &reason) {
8359 // Private ivars are always okay. Unfortunately, people don't
8360 // always properly make their ivars private, even in system headers.
8361 // Plus we need to make fields okay, too.
8362 if (!isa<FieldDecl>(D) && !isa<ObjCPropertyDecl>(D) &&
8364 return false;
8365
8366 // Silently accept unsupported uses of __weak in both user and system
8367 // declarations when it's been disabled, for ease of integration with
8368 // -fno-objc-arc files. We do have to take some care against attempts
8369 // to define such things; for now, we've only done that for ivars
8370 // and properties.
8372 if (diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_disabled ||
8373 diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_no_runtime) {
8374 reason = UnavailableAttr::IR_ForbiddenWeak;
8375 return true;
8376 }
8377 }
8378
8379 // Allow all sorts of things in system headers.
8381 // Currently, all the failures dealt with this way are due to ARC
8382 // restrictions.
8383 reason = UnavailableAttr::IR_ARCForbiddenType;
8384 return true;
8385 }
8386
8387 return false;
8388}
8389
8390/// Handle a delayed forbidden-type diagnostic.
8392 Decl *D) {
8393 auto Reason = UnavailableAttr::IR_None;
8394 if (D && isForbiddenTypeAllowed(S, D, DD, Reason)) {
8395 assert(Reason && "didn't set reason?");
8396 D->addAttr(UnavailableAttr::CreateImplicit(S.Context, "", Reason, DD.Loc));
8397 return;
8398 }
8399 if (S.getLangOpts().ObjCAutoRefCount)
8400 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
8401 // FIXME: we may want to suppress diagnostics for all
8402 // kind of forbidden type messages on unavailable functions.
8403 if (FD->hasAttr<UnavailableAttr>() &&
8405 diag::err_arc_array_param_no_ownership) {
8406 DD.Triggered = true;
8407 return;
8408 }
8409 }
8410
8413 DD.Triggered = true;
8414}
8415
8416
8421
8422 // When delaying diagnostics to run in the context of a parsed
8423 // declaration, we only want to actually emit anything if parsing
8424 // succeeds.
8425 if (!decl) return;
8426
8427 // We emit all the active diagnostics in this pool or any of its
8428 // parents. In general, we'll get one pool for the decl spec
8429 // and a child pool for each declarator; in a decl group like:
8430 // deprecated_typedef foo, *bar, baz();
8431 // only the declarator pops will be passed decls. This is correct;
8432 // we really do need to consider delayed diagnostics from the decl spec
8433 // for each of the different declarations.
8434 const DelayedDiagnosticPool *pool = &poppedPool;
8435 do {
8436 bool AnyAccessFailures = false;
8438 i = pool->pool_begin(), e = pool->pool_end(); i != e; ++i) {
8439 // This const_cast is a bit lame. Really, Triggered should be mutable.
8440 DelayedDiagnostic &diag = const_cast<DelayedDiagnostic&>(*i);
8441 if (diag.Triggered)
8442 continue;
8443
8444 switch (diag.Kind) {
8446 // Don't bother giving deprecation/unavailable diagnostics if
8447 // the decl is invalid.
8448 if (!decl->isInvalidDecl())
8450 break;
8451
8453 // Only produce one access control diagnostic for a structured binding
8454 // declaration: we don't need to tell the user that all the fields are
8455 // inaccessible one at a time.
8456 if (AnyAccessFailures && isa<DecompositionDecl>(decl))
8457 continue;
8459 if (diag.Triggered)
8460 AnyAccessFailures = true;
8461 break;
8462
8465 break;
8466 }
8467 }
8468 } while ((pool = pool->getParent()));
8469}
8470
8473 assert(curPool && "re-emitting in undelayed context not supported");
8474 curPool->steal(pool);
8475}
8476
8478 VarDecl *VD = cast<VarDecl>(D);
8479 if (VD->getType()->isDependentType())
8480 return;
8481
8482 // Obtains the FunctionDecl that was found when handling the attribute
8483 // earlier.
8484 CleanupAttr *Attr = D->getAttr<CleanupAttr>();
8485 FunctionDecl *FD = Attr->getFunctionDecl();
8486 DeclarationNameInfo NI = FD->getNameInfo();
8487
8488 // We're currently more strict than GCC about what function types we accept.
8489 // If this ever proves to be a problem it should be easy to fix.
8490 QualType Ty = this->Context.getPointerType(VD->getType());
8491 QualType ParamTy = FD->getParamDecl(0)->getType();
8493 FD->getParamDecl(0)->getLocation(), ParamTy, Ty))) {
8494 this->Diag(Attr->getArgLoc(),
8495 diag::err_attribute_cleanup_func_arg_incompatible_type)
8496 << NI.getName() << ParamTy << Ty;
8497 D->dropAttr<CleanupAttr>();
8498 return;
8499 }
8500}
Defines the clang::ASTContext interface.
#define V(N, I)
static SmallString< 64 > normalizeName(StringRef AttrName, StringRef ScopeName, AttributeCommonInfo::Syntax SyntaxUsed)
static OffloadArch getOffloadArch(CodeGenModule &CGM)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::Expr interface and subclasses for C++ expressions.
TokenType getType() const
Returns the token's type, e.g.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
#define X(type, name)
Definition Value.h:97
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
Definition MachO.h:51
llvm::MachO::Record Record
Definition MachO.h:31
#define SM(sm)
static unsigned getNumAttributeArgs(const ParsedAttr &AL)
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis functions specific to AVR.
This file declares semantic analysis functions specific to BPF.
This file declares semantic analysis for CUDA constructs.
static void handleCleanupAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWeakImportAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkGuardedByAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, Expr *&Arg)
static void handleCodeSegAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static const RecordDecl * getRecordDecl(QualType QT)
Checks that the passed in QualType either is of RecordType or points to RecordType.
static void handlePatchableFunctionEntryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCountedByAttrField(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFormatAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUninitializedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRequiresCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeviceKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleBTFDeclTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleOptimizeNoneAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnableIfAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSectionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleStandardNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &A)
static void handleMIGServerRoutineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleZeroCallUsedRegsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDiagnoseAsBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnumExtensibilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static T * mergeVisibilityAttr(Sema &S, Decl *D, const AttributeCommonInfo &CI, typename T::VisibilityType value)
static void handleFormatMatchesAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleLayoutVersion(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkForConsumableClass(Sema &S, const CXXMethodDecl *MD, const ParsedAttr &AL)
static void handleDLLAttr(Sema &S, Decl *D, const ParsedAttr &A)
static void handleConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlignValueAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static Expr * makeAttributeArgExpr(Sema &S, Expr *E, const Attribute &Attr, const unsigned Idx)
static void handleLifetimeCaptureByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoCfCheckAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static void handleMallocSpanAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoSpecializations(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsSmartPointer(Sema &S, const RecordDecl *Record)
static void handleReturnsNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void checkUnusedDeclAttributes(Sema &S, const ParsedAttributesView &A)
checkUnusedDeclAttributes - Check a list of attributes to see if it contains any decl attributes that...
static void handleGNUInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWorkGroupSize(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleBuiltinAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTransparentUnionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVTablePointerAuthentication(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnforceTCBAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void checkAttrArgsAreCapabilityObjs(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args, unsigned Sidx=0, bool ParamIdxOk=false)
Checks that all attribute arguments, starting from Sidx, resolve to a capability object.
static void handleErrorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkCodeSegName(Sema &S, SourceLocation LiteralLoc, StringRef CodeSegName)
static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTryAcquireCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleModularFormat(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGridConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSetTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFormatArgAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((format_arg((idx)))) attribute based on https://gcc.gnu.org/onlinedocs/gcc/Common-Fu...
static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL, const Sema::ProcessDeclAttributeOptions &Options)
ProcessDeclAttribute - Apply the specific attribute to the specified decl if the attribute applies to...
static void handleTargetAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleXRayLogArgsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePassObjectSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoMergeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleManagedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonStringAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleParamTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUnsafeBufferUsage(Sema &S, Decl *D, const ParsedAttr &AL)
static bool attrNonNullArgCheck(Sema &S, QualType T, const ParsedAttr &AL, SourceRange AttrParmRange, SourceRange TypeRange, bool isReturnValue=false)
static void handleAcquireCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCPUSpecificAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePackedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleIFuncAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAbiTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAttrWithMessage(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWeakRefAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleExtVectorTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isValidCodeModelAttr(llvm::Triple &Triple, StringRef Str)
static void handleCalledOnceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle 'called_once' attribute.
static void handleLockReturnedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkFunctionConditionAttr(Sema &S, Decl *D, const ParsedAttr &AL, Expr *&Cond, StringRef &Msg)
static void handleAcquiredAfterAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleExternalSourceSymbolAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonNullAttrParameter(Sema &S, ParmVarDecl *D, const ParsedAttr &AL)
static bool checkParamIsIntegerType(Sema &S, const Decl *D, const AttrInfo &AI, unsigned AttrArgNo)
Checks to be sure that the given parameter number is in bounds, and is an integral type.
static bool checkFunParamsAreScopedLockable(Sema &S, const ParmVarDecl *ParamDecl, const ParsedAttr &AL)
static bool checkRecordTypeForCapability(Sema &S, QualType Ty)
static void handleArgumentWithTypeTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkAcquireOrderAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void handleLocksExcludedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSAllocatorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static AttrTy * mergeEnforceTCBAttrImpl(Sema &S, Decl *D, const AttrTy &AL)
static void handleConstructorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAllocSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleConsumableAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoSanitizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReturnTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTargetClonesAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isKernelDecl(Decl *D)
static void handleAllocAlignAttr(Sema &S, Decl *D, const ParsedAttr &AL)
FormatAttrKind
@ CFStringFormat
@ IgnoredFormat
@ InvalidFormat
@ StrftimeFormat
@ SupportedFormat
@ NSStringFormat
static void handlePreferredTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeviceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePtGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlwaysInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAssertCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVisibilityAttr(Sema &S, Decl *D, const ParsedAttr &AL, bool isTypeVisibility)
static void handleAnnotateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static FormatAttrKind getFormatAttrKind(StringRef Format)
getFormatAttrKind - Map from format attribute names to supported format types.
static void handleNullableTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUuidAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAcquireHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoSanitizeAddressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSConstexprAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCommonAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTestTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkTryLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void parseModeAttrArg(Sema &S, StringRef Str, unsigned &DestWidth, bool &IntegerMode, bool &ComplexMode, FloatModeKind &ExplicitType)
parseModeAttrArg - Parses attribute mode string and returns parsed type attribute.
static void handleExcludeFromExplicitInstantiationAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCFIUncheckedCalleeAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static void handleLaunchBoundsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkAvailabilityAttr(Sema &S, SourceRange Range, IdentifierInfo *Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted)
static void handleDependencyAttr(Sema &S, Scope *Scope, Decl *D, const ParsedAttr &AL)
static void handleNoBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoUniqueAddressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool validateAlignasAppliedType(Sema &S, Decl *D, const AlignedAttr &Attr, SourceLocation AttrLoc)
Perform checking of type validity.
static void handleNakedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFunctionReturnThunksAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static unsigned getNumAttributeArgs(const ParsedAttr &AL)
static void handleGlobalAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSentinelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCodeModelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCallableWhenAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool hasBTFDeclTagAttr(Decl *D, StringRef Tag)
static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &DD, Decl *D)
Handle a delayed forbidden-type diagnostic.
static void handleNoClusterAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void handleAssumeAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSharedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSInheritanceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVecTypeHint(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRestrictAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMinVectorWidthAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUnusedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static Expr * makeLaunchBoundsArgExpr(Sema &S, Expr *E, const CUDALaunchBoundsAttr &AL, const unsigned Idx)
static void handleDeclspecThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleInterruptAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCallbackAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((callback(CalleeIdx, PayloadIdx0, ...))) attributes.
static AttributeCommonInfo getNoSanitizeAttrInfo(const ParsedAttr &NoSanitizeSpecificAttr)
static void handleInitPriorityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((init_priority(priority))) attributes based on http://gcc.gnu.org/onlinedocs/gcc/C_0...
static void handlePtGuardedVarAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkRecordDeclForAttr(const RecordDecl *RD)
static void handleNoSanitizeThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A)
static bool isKnownToAlwaysThrow(const FunctionDecl *FD)
static void handleTypeTagForDatatypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRandomizeLayoutAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void markUsedForAliasOrIfunc(Sema &S, Decl *D, const ParsedAttr &AL, StringRef Str)
static bool isCapabilityExpr(Sema &S, const Expr *Ex)
static void handleNoDebugAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSuppressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static std::pair< Expr *, int > makeClusterDimsArgExpr(Sema &S, Expr *E, const CUDAClusterDimsAttr &AL, const unsigned Idx)
static void handleNoSanitizeMemoryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static const AttrTy * findEnforceTCBAttrByName(Decl *D, StringRef Name)
static void handleNoEscapeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAvailableOnlyInDefaultEvalMethod(Sema &S, Decl *D, const ParsedAttr &AL)
static bool MustDelayAttributeArguments(const ParsedAttr &AL)
static void handleNoRandomizeLayoutAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTargetVersionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWarnUnusedResult(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkRecordTypeForScopedCapability(Sema &S, QualType Ty)
static bool isIntOrBool(Expr *Exp)
Check if the passed-in expression is of type int or bool.
static bool versionsMatch(const VersionTuple &X, const VersionTuple &Y, bool BeforeIsOkay)
Check whether the two versions match.
static bool isSanitizerAttributeAllowedOnGlobals(StringRef Sanitizer)
static void handleClusterDimsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool handleFormatAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, FormatAttrCommon *Info)
Handle attribute((format(type,idx,firstarg))) attributes based on https://gcc.gnu....
static void handleCallConvAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMinSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static ExprResult sharedGetConstructorDestructorAttrExpr(Sema &S, const ParsedAttr &AL)
static void handleOwnershipAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkTypedefTypeForCapability(QualType Ty)
static void handleAcquiredBeforeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReleaseCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool typeHasCapability(Sema &S, QualType Ty)
static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isFunctionLike(const Type &T)
static void handleDiagnoseIfAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCFGuardAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReentrantCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsPointer(Sema &S, const Decl *D, const ParsedAttr &AL)
Check if passed in Decl is a pointer type.
static bool isForbiddenTypeAllowed(Sema &S, Decl *D, const DelayedDiagnostic &diag, UnavailableAttr::ImplicitReason &reason)
Is the given declaration allowed to use a forbidden type?
static void handleInternalLinkageAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleModeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
handleModeAttr - This attribute modifies the width of a decl with primitive type.
static void handleDestructorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkPositiveIntArgument(Sema &S, const AttrInfo &AI, const Expr *Expr, int &Val, unsigned Idx=UINT_MAX)
Wrapper around checkUInt32Argument, with an extra check to be sure that the result will fit into a re...
static void handleVecReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isGlobalVar(const Decl *D)
static void handleTLSModelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool modularFormatAttrsEquiv(const ModularFormatAttr *Existing, IdentifierInfo *ModularImplFn, StringRef ImplName, ArrayRef< StringRef > Aspects)
static void handleAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL)
This file declares semantic analysis for HLSL constructs.
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 for Objective-C.
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 RISC-V.
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 Wasm.
This file declares semantic analysis functions specific to X86.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
SourceManager & getSourceManager()
Definition ASTContext.h:837
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
DeclarationNameTable DeclarationNames
Definition ASTContext.h:780
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
IdentifierTable & Idents
Definition ASTContext.h:776
const LangOptions & getLangOpts() const
Definition ASTContext.h:930
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
const TargetInfo * getAuxTargetInfo() const
Definition ASTContext.h:896
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
CanQualType IntTy
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
CanQualType OverloadTy
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType VoidTy
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:895
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
Attr - This represents one attribute.
Definition Attr.h:45
SourceLocation getScopeLoc() const
void setAttributeSpellingListIndex(unsigned V)
std::string getNormalizedFullName() const
Gets the normalized full name, which consists of both scope and name and with surrounding underscores...
unsigned getAttributeSpellingListIndex() const
const IdentifierInfo * getScopeName() const
StringRef getNormalizedAttrName(StringRef ScopeName) const
std::optional< StringRef > tryGetCorrectedAttrName(StringRef ScopeName, StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts) const
SourceRange getNormalizedRange() const
std::optional< StringRef > tryGetCorrectedScopeName(StringRef ScopeName) const
SourceLocation getLoc() const
const IdentifierInfo * getAttrName() const
StringRef getNormalizedScopeName() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
Type source information for an attributed type.
Definition TypeLoc.h:1008
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
Definition TypeLoc.h:1022
Pointer to a block type.
Definition TypeBase.h:3542
This class is used for builtin types like 'int'.
Definition TypeBase.h:3164
static bool isBuiltinFunc(llvm::StringRef Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
Definition Builtins.cpp:123
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
QualType getFunctionObjectParameterType() const
Definition DeclCXX.h:2279
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
CXXRecordDecl * getDefinition() const
Definition DeclCXX.h:548
bool hasDefinition() const
Definition DeclCXX.h:561
MSInheritanceModel calculateInheritanceModel() const
Calculate what the inheritance model would be for this class.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2877
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
Definition Expr.cpp:1513
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Definition CharUnits.h:185
Declaration of a class template.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
Definition Expr.cpp:346
const RelatedTargetVersionMapping * getVersionMapping(OSEnvPair Kind) const
The results of name lookup within a DeclContext.
Definition DeclBase.h:1382
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
bool isFileContext() const
Definition DeclBase.h:2180
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1270
DeclarationNameInfo getNameInfo() const
Definition Expr.h:1342
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
Definition Expr.cpp:484
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
Definition Expr.h:1359
ValueDecl * getDecl()
Definition Expr.h:1338
ParsedAttributes & getAttributes()
Definition DeclSpec.h:843
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
Definition DeclBase.cpp:285
T * getAttr() const
Definition DeclBase.h:573
bool hasAttrs() const
Definition DeclBase.h:518
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:546
void addAttr(Attr *A)
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition DeclBase.cpp:273
bool canBeWeakImported(bool &IsDefinition) const
Determines whether this symbol can be weak-imported, e.g., whether it would be well-formed to add the...
Definition DeclBase.cpp:841
bool isInvalidDecl() const
Definition DeclBase.h:588
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
Definition DeclBase.h:559
SourceLocation getLocation() const
Definition DeclBase.h:439
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition DeclBase.h:1049
DeclContext * getDeclContext()
Definition DeclBase.h:448
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclBase.h:431
void dropAttr()
Definition DeclBase.h:556
AttrVec & getAttrs()
Definition DeclBase.h:524
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Definition DeclBase.cpp:382
bool hasAttr() const
Definition DeclBase.h:577
void setLexicalDeclContext(DeclContext *DC)
Definition DeclBase.cpp:386
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition DeclBase.h:427
DeclarationName getCXXOperatorName(OverloadedOperatorKind Op)
Get the name of the overloadable C++ operator corresponding to Op.
The name of a declaration.
SourceLocation getTypeSpecStartLoc() const
Definition Decl.cpp:1995
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:831
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
Definition Decl.h:855
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Definition Decl.cpp:2007
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
Definition Decl.h:845
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
Definition Decl.h:837
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1874
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
Definition DeclSpec.h:2372
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Definition DeclSpec.h:2021
const ParsedAttributes & getAttributes() const
Definition DeclSpec.h:2657
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
Definition DeclSpec.h:2368
const ParsedAttributesView & getDeclarationAttributes() const
Definition DeclSpec.h:2660
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition Diagnostic.h:951
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
Definition Diagnostic.h:592
This represents one expression.
Definition Expr.h:112
bool isIntegerConstantExpr(const ASTContext &Ctx) const
static bool isPotentialConstantExprUnevaluated(Expr *E, const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExprUnevaluated - Return true if this expression might be usable in a constant exp...
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition Expr.cpp:3091
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:177
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:194
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
Definition Expr.h:241
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Definition Expr.cpp:3086
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Definition Expr.h:223
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:273
QualType getType() const
Definition Expr.h:144
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3160
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
Definition Diagnostic.h:79
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:140
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Definition Diagnostic.h:103
Represents a function declaration or definition.
Definition Decl.h:2000
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
Definition Decl.h:2189
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2797
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition Decl.cpp:3275
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition Decl.cpp:4201
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4189
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
Definition Decl.h:2314
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
Definition Decl.cpp:4020
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Definition Decl.cpp:3758
param_iterator param_end()
Definition Decl.h:2787
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:2921
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
Definition Decl.h:2695
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
Definition Decl.cpp:3647
QualType getReturnType() const
Definition Decl.h:2845
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2774
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
Definition Decl.h:2443
param_iterator param_begin()
Definition Decl.h:2786
bool isVariadic() const
Whether this function is variadic.
Definition Decl.cpp:3129
bool isConstexprSpecified() const
Definition Decl.h:2479
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Definition Decl.cpp:3614
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4413
bool isConsteval() const
Definition Decl.h:2482
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3822
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
Definition Decl.cpp:3195
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition Decl.h:2899
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5254
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4450
CallingConv getCallConv() const
Definition TypeBase.h:4805
QualType getReturnType() const
Definition TypeBase.h:4790
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:57
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
A simple pair of identifier info and location.
SourceLocation getLoc() const
IdentifierInfo * getIdentifierInfo() const
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isCompatibleWithMSVC() const
bool isTargetDevice() const
True when compiling for an offloading target device.
void push_back(const T &LocalValue)
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4398
MSGuidDeclParts Parts
Definition DeclCXX.h:4400
Describes a module or submodule.
Definition Module.h:144
This represents a decl that may have a name.
Definition Decl.h:274
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
Definition Decl.cpp:1969
bool isExternallyVisible() const
Definition Decl.h:433
A C++ nested-name-specifier augmented with source location information.
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
Represents one property declaration in an Objective-C interface.
Definition DeclObjC.h:731
void * getAsOpaquePtr() const
Definition Ownership.h:91
static OpaquePtr getFromOpaquePtr(void *P)
Definition Ownership.h:92
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition Attr.h:273
bool isValid() const
Is this parameter index valid?
Definition Attr.h:333
unsigned getSourceIndex() const
Get the parameter index as it would normally be encoded for attributes at the source level of represe...
Definition Attr.h:341
unsigned getASTIndex() const
Get the parameter index as it would normally be encoded at the AST level of representation: zero-orig...
Definition Attr.h:352
Represents a parameter to a function.
Definition Decl.h:1790
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2976
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
bool isPackExpansion() const
Definition ParsedAttr.h:367
const AvailabilityChange & getAvailabilityDeprecated() const
Definition ParsedAttr.h:399
unsigned getSemanticSpelling() const
If the parsed attribute has a semantic equivalent, and it would have a semantic Spelling enumeration ...
bool existsInTarget(const TargetInfo &Target) const
bool checkExactlyNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has exactly as many args as Num.
IdentifierLoc * getArgAsIdent(unsigned Arg) const
Definition ParsedAttr.h:389
bool hasParsedType() const
Definition ParsedAttr.h:337
const AvailabilityChange & getAvailabilityIntroduced() const
Definition ParsedAttr.h:393
void setInvalid(bool b=true) const
Definition ParsedAttr.h:345
bool hasVariadicArg() const
const ParsedAttrInfo & getInfo() const
Definition ParsedAttr.h:613
void handleAttrWithDelayedArgs(Sema &S, Decl *D) const
const Expr * getReplacementExpr() const
Definition ParsedAttr.h:429
bool hasProcessingCache() const
Definition ParsedAttr.h:347
SourceLocation getUnavailableLoc() const
Definition ParsedAttr.h:417
unsigned getProcessingCache() const
Definition ParsedAttr.h:349
const IdentifierLoc * getEnvironment() const
Definition ParsedAttr.h:435
bool acceptsExprPack() const
const Expr * getMessageExpr() const
Definition ParsedAttr.h:423
const ParsedType & getMatchingCType() const
Definition ParsedAttr.h:441
const ParsedType & getTypeArg() const
Definition ParsedAttr.h:459
SourceLocation getStrictLoc() const
Definition ParsedAttr.h:411
bool isTypeAttr() const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
Definition ParsedAttr.h:371
bool isArgIdent(unsigned Arg) const
Definition ParsedAttr.h:385
Expr * getArgAsExpr(unsigned Arg) const
Definition ParsedAttr.h:383
bool getMustBeNull() const
Definition ParsedAttr.h:453
bool checkAtLeastNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at least as many args as Num.
bool isUsedAsTypeAttr() const
Definition ParsedAttr.h:359
unsigned getNumArgMembers() const
bool isStmtAttr() const
bool isPragmaClangAttribute() const
True if the attribute is specified using 'pragma clang attribute'.
Definition ParsedAttr.h:363
bool slidesFromDeclToDeclSpecLegacyBehavior() const
Returns whether a [[]] attribute, if specified ahead of a declaration, should be applied to the decl-...
AttributeCommonInfo::Kind getKind() const
Definition ParsedAttr.h:610
void setProcessingCache(unsigned value) const
Definition ParsedAttr.h:354
bool isParamExpr(size_t N) const
bool isArgExpr(unsigned Arg) const
Definition ParsedAttr.h:379
bool getLayoutCompatible() const
Definition ParsedAttr.h:447
ArgsUnion getArg(unsigned Arg) const
getArg - Return the specified argument.
Definition ParsedAttr.h:374
SourceLocation getEllipsisLoc() const
Definition ParsedAttr.h:368
bool isInvalid() const
Definition ParsedAttr.h:344
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
const AvailabilityChange & getAvailabilityObsoleted() const
Definition ParsedAttr.h:405
void addAtEnd(ParsedAttr *newAttr)
Definition ParsedAttr.h:827
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3328
QualType getPointeeType() const
Definition TypeBase.h:3338
IdentifierTable & getIdentifierTable()
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8278
QualType getCanonicalType() const
Definition TypeBase.h:8330
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8372
const Type * getTypePtrOrNull() const
Definition TypeBase.h:8282
Represents a struct/union/class.
Definition Decl.h:4321
field_iterator field_end() const
Definition Decl.h:4527
field_range fields() const
Definition Decl.h:4524
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4521
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4509
field_iterator field_begin() const
Definition Decl.cpp:5209
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3573
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
unsigned getFlags() const
getFlags - Return the flags for this scope.
Definition Scope.h:271
@ FunctionDeclarationScope
This is a scope that corresponds to the parameters within a function prototype for a function declara...
Definition Scope.h:91
void handleAMDGPUMaxNumWorkGroupsAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUFlatWorkGroupSizeAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumSGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumVGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUWavesPerEUAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptSaveFPAttr(Decl *D, const ParsedAttr &AL)
Definition SemaARM.cpp:1392
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
Definition SemaARM.cpp:1360
void handleBuiltinAliasAttr(Decl *D, const ParsedAttr &AL)
Definition SemaARM.cpp:1245
void handleNewAttr(Decl *D, const ParsedAttr &AL)
Definition SemaARM.cpp:1292
bool checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
Definition SemaARM.cpp:1614
bool SveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
Definition SemaARM.cpp:1231
bool MveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
Definition SemaARM.cpp:1218
void handleCmseNSEntryAttr(Decl *D, const ParsedAttr &AL)
Definition SemaARM.cpp:1345
bool checkTargetClonesAttr(SmallVectorImpl< StringRef > &Params, SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams)
Definition SemaARM.cpp:1648
bool CdeAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
Definition SemaARM.cpp:1226
void handleSignalAttr(Decl *D, const ParsedAttr &AL)
Definition SemaAVR.cpp:48
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
Definition SemaAVR.cpp:23
void handlePreserveAIRecord(RecordDecl *RD)
Definition SemaBPF.cpp:169
void handlePreserveAccessIndexAttr(Decl *D, const ParsedAttr &AL)
Definition SemaBPF.cpp:181
A generic diagnostic builder for errors which may or may not be deferred.
Definition SemaBase.h:111
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
Definition SemaCUDA.cpp:212
CUDAFunctionTarget CurrentTarget()
Gets the CUDA target for the current context.
Definition SemaCUDA.h:152
SemaDiagnosticBuilder DiagIfHostCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as host cod...
Definition SemaCUDA.cpp:956
void handleWaveSizeAttr(Decl *D, const ParsedAttr &AL)
void handleVkLocationAttr(Decl *D, const ParsedAttr &AL)
void handleSemanticAttr(Decl *D, const ParsedAttr &AL)
void handleShaderAttr(Decl *D, const ParsedAttr &AL)
void handlePackOffsetAttr(Decl *D, const ParsedAttr &AL)
void handleParamModifierAttr(Decl *D, const ParsedAttr &AL)
void handleRootSignatureAttr(Decl *D, const ParsedAttr &AL)
void handleResourceBindingAttr(Decl *D, const ParsedAttr &AL)
void handleNumThreadsAttr(Decl *D, const ParsedAttr &AL)
void handleVkExtBuiltinInputAttr(Decl *D, const ParsedAttr &AL)
void handleVkBindingAttr(Decl *D, const ParsedAttr &AL)
void handleVkConstantIdAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
Definition SemaM68k.cpp:23
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
Definition SemaMIPS.cpp:243
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleRuntimeName(Decl *D, const ParsedAttr &AL)
void handleNSObject(Decl *D, const ParsedAttr &AL)
bool isValidOSObjectOutParameter(const Decl *D)
void handleNSErrorDomain(Decl *D, const ParsedAttr &Attr)
void handleXReturnsXRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleExternallyRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleMethodFamilyAttr(Decl *D, const ParsedAttr &AL)
void handleIndependentClass(Decl *D, const ParsedAttr &AL)
void handleIBOutlet(Decl *D, const ParsedAttr &AL)
void handleReturnsInnerPointerAttr(Decl *D, const ParsedAttr &Attrs)
void handleSuppresProtocolAttr(Decl *D, const ParsedAttr &AL)
void handleOwnershipAttr(Decl *D, const ParsedAttr &AL)
void handleBlocksAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeMutableAttr(Decl *D, const ParsedAttr &AL)
Sema::RetainOwnershipKind parsedAttrToRetainOwnershipKind(const ParsedAttr &AL)
void handleRequiresSuperAttr(Decl *D, const ParsedAttr &Attrs)
void AddXConsumedAttr(Decl *D, const AttributeCommonInfo &CI, Sema::RetainOwnershipKind K, bool IsTemplateInstantiation)
void handleDesignatedInitializer(Decl *D, const ParsedAttr &AL)
void handleBridgeRelatedAttr(Decl *D, const ParsedAttr &AL)
void handleIBOutletCollection(Decl *D, const ParsedAttr &AL)
bool isCFStringType(QualType T)
void handleDirectAttr(Decl *D, const ParsedAttr &AL)
bool isNSStringType(QualType T, bool AllowNSAttributedString=false)
void handleBoxable(Decl *D, const ParsedAttr &AL)
void handleDirectMembersAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeAttr(Decl *D, const ParsedAttr &AL)
void handlePreciseLifetimeAttr(Decl *D, const ParsedAttr &AL)
void handleSubGroupSize(Decl *D, const ParsedAttr &AL)
void handleNoSVMAttr(Decl *D, const ParsedAttr &AL)
void handleAccessAttr(Decl *D, const ParsedAttr &AL)
void handleOMPAssumeAttr(Decl *D, const ParsedAttr &AL)
bool isAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetClonesAttr(SmallVectorImpl< StringRef > &Params, SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams)
bool checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
void handleKernelEntryPointAttr(Decl *D, const ParsedAttr &AL)
Definition SemaSYCL.cpp:205
void handleKernelAttr(Decl *D, const ParsedAttr &AL)
Definition SemaSYCL.cpp:166
void handleBridge(Decl *D, const ParsedAttr &AL)
Definition SemaSwift.cpp:99
void handleAsyncAttr(Decl *D, const ParsedAttr &AL)
void handleAsyncName(Decl *D, const ParsedAttr &AL)
void handleNewType(Decl *D, const ParsedAttr &AL)
void handleError(Decl *D, const ParsedAttr &AL)
void AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi)
void handleAsyncError(Decl *D, const ParsedAttr &AL)
void handleName(Decl *D, const ParsedAttr &AL)
void handleAttrAttr(Decl *D, const ParsedAttr &AL)
Definition SemaSwift.cpp:84
void handleWebAssemblyImportNameAttr(Decl *D, const ParsedAttr &AL)
Definition SemaWasm.cpp:370
void handleWebAssemblyImportModuleAttr(Decl *D, const ParsedAttr &AL)
Definition SemaWasm.cpp:353
void handleWebAssemblyExportNameAttr(Decl *D, const ParsedAttr &AL)
Definition SemaWasm.cpp:386
void handleForceAlignArgPointerAttr(Decl *D, const ParsedAttr &AL)
Definition SemaX86.cpp:1024
void handleAnyInterruptAttr(Decl *D, const ParsedAttr &AL)
Definition SemaX86.cpp:955
bool checkTargetClonesAttr(SmallVectorImpl< StringRef > &Params, SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams)
Definition SemaX86.cpp:1047
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
Definition Sema.h:1355
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1370
void popWithoutEmitting(DelayedDiagnosticsState state)
Leave a delayed-diagnostic state that was previously pushed.
Definition Sema.h:1384
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:854
SemaAMDGPU & AMDGPU()
Definition Sema.h:1416
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1061
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9314
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
SemaM68k & M68k()
Definition Sema.h:1466
DelayedDiagnosticsState ParsingDeclState
Definition Sema.h:1350
bool isValidPointerAttrType(QualType T, bool RefOkay=false)
Determine if type T is a valid subject for a nonnull and similar attributes.
static std::enable_if_t< std::is_base_of_v< Attr, AttrInfo >, SourceLocation > getAttrLoc(const AttrInfo &AL)
A helper function to provide Attribute Location for the Attr types AND the ParsedAttr.
Definition Sema.h:4820
SemaOpenMP & OpenMP()
Definition Sema.h:1501
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
bool checkFunctionOrMethodParameterIndex(const Decl *D, const AttrInfo &AI, unsigned AttrArgNum, const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis=false, bool CanIndexVariadicArguments=false)
Check if IdxExpr is a valid parameter index for a function or instance method D.
Definition Sema.h:5129
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
bool checkSectionName(SourceLocation LiteralLoc, StringRef Str)
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
SemaCUDA & CUDA()
Definition Sema.h:1441
bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A, bool SkipArgCountCheck=false)
Handles semantic checking for features that are common to all attributes, such as checking whether a ...
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
DLLImportAttr * mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI)
ExtVectorDeclsType ExtVectorDecls
ExtVectorDecls - This is a list all the extended vector types.
Definition Sema.h:4880
void PopParsingDeclaration(ParsingDeclState state, Decl *decl)
ErrorAttr * mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic)
bool CheckFormatStringsCompatible(FormatStringType FST, const StringLiteral *AuthoritativeFormatString, const StringLiteral *TestedFormatString, const Expr *FunctionCallArg=nullptr)
Verify that two format strings (as understood by attribute(format) and attribute(format_matches) are ...
void redelayDiagnostics(sema::DelayedDiagnosticPool &pool)
Given a set of delayed diagnostics, re-emit them as if they had been delayed in the current context i...
SemaSYCL & SYCL()
Definition Sema.h:1526
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
SemaX86 & X86()
Definition Sema.h:1546
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
ASTContext & Context
Definition Sema.h:1283
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:922
SemaObjC & ObjC()
Definition Sema.h:1486
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ASTContext & getASTContext() const
Definition Sema.h:925
bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD=nullptr, CUDAFunctionTarget CFT=CUDAFunctionTarget::InvalidTarget)
Check validaty of calling convention attribute attr.
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
void ProcessPragmaWeak(Scope *S, Decl *D)
bool CheckAttrNoArgs(const ParsedAttr &CurrAttr)
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
Definition SemaAttr.cpp:795
void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI)
Add a no_cluster attribute to a particular declaration.
FPOptions & getCurFPFeatures()
Definition Sema.h:920
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:83
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14330
const LangOptions & getLangOpts() const
Definition Sema.h:918
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
SemaBPF & BPF()
Definition Sema.h:1431
Preprocessor & PP
Definition Sema.h:1282
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
SemaMSP430 & MSP430()
Definition Sema.h:1476
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
const LangOptions & LangOpts
Definition Sema.h:1281
static const uint64_t MaximumAlignment
Definition Sema.h:1214
CUDAClusterDimsAttr * createClusterDimsAttr(const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
Add a cluster_dims attribute to a particular declaration.
SemaHLSL & HLSL()
Definition Sema.h:1451
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
SemaMIPS & MIPS()
Definition Sema.h:1471
SemaRISCV & RISCV()
Definition Sema.h:1516
bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes, bool OrNull)
Check if applying the specified attribute variant from the "counted by" family of attributes to Field...
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
SemaSwift & Swift()
Definition Sema.h:1531
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
Definition Sema.cpp:1666
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val, unsigned Idx=UINT_MAX, bool StrictlyUnsigned=false)
If Expr is a valid integer constant, get the value of the integer expression and return success or fa...
Definition Sema.h:4831
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
Definition Sema.h:8032
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1414
SemaOpenCL & OpenCL()
Definition Sema.h:1496
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
NamedDecl * DeclClonePragmaWeak(NamedDecl *ND, const IdentifierInfo *II, SourceLocation Loc)
DeclClonePragmaWeak - clone existing decl (maybe definition), #pragma weak needs a non-definition dec...
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:13896
SourceManager & getSourceManager() const
Definition Sema.h:923
void ActOnCleanupAttr(Decl *D, const Attr *A)
static FormatStringType GetFormatStringType(StringRef FormatFlavor)
bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str)
bool ValidateFormatString(FormatStringType FST, const StringLiteral *Str)
Verify that one format string (as understood by attribute(format)) is self-consistent; for instance,...
llvm::Error isValidSectionSpecifier(StringRef Str)
Used to implement to perform semantic checking on attribute((section("foo"))) specifiers.
void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular declaration.
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15375
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ASTConsumer & Consumer
Definition Sema.h:1284
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, int FirstArg)
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
Definition Sema.h:4800
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition Sema.h:4804
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition Sema.h:4797
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
Definition Sema.h:4868
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
Definition Sema.h:1246
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
Definition Sema.cpp:2934
SemaAVR & AVR()
Definition Sema.h:1426
void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, IdentifierInfo *IIEnvironment)
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
Definition Sema.h:3531
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking(SourceLocation Loc, StringRef Platform)
Definition Sema.cpp:112
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
Create an CUDALaunchBoundsAttr attribute.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
SemaWasm & Wasm()
Definition Sema.h:1541
LifetimeCaptureByAttr * ParseLifetimeCaptureByAttr(const ParsedAttr &AL, StringRef ParamName)
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
SemaARM & ARM()
Definition Sema.h:1421
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
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.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Stmt - This represents one statement.
Definition Stmt.h:85
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:338
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:350
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1799
bool isBeingDefined() const
Return true if this decl is currently being defined.
Definition Decl.h:3832
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3812
bool isUnion() const
Definition Decl.h:3922
Exposes information about the current target.
Definition TargetInfo.h:226
TargetOptions & getTargetOpts() const
Retrieve the target options.
Definition TargetInfo.h:326
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
Definition TargetInfo.h:489
virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const
Determines whether a given calling convention is valid for the target.
bool isTLSSupported() const
Whether the target supports thread-local storage.
virtual unsigned getRegisterWidth() const
Return the "preferred" register width on this target.
Definition TargetInfo.h:903
virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const
virtual bool hasProtectedVisibility() const
Does this target support "protected" visibility?
virtual unsigned getUnwindWordWidth() const
Definition TargetInfo.h:898
unsigned getCharWidth() const
Definition TargetInfo.h:520
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
const llvm::VersionTuple & getSDKVersion() const
std::string CPU
If given, the name of the target CPU to generate code for.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:2706
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
A container of type source information.
Definition TypeBase.h:8249
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8260
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
Definition Type.cpp:2567
bool isBlockPointerType() const
Definition TypeBase.h:8535
bool isVoidType() const
Definition TypeBase.h:8871
bool isBooleanType() const
Definition TypeBase.h:9001
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
Definition TypeBase.h:9051
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition Type.cpp:2205
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
Definition Type.cpp:724
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition Type.h:41
bool isArrayType() const
Definition TypeBase.h:8614
bool isCharType() const
Definition Type.cpp:2132
bool isFunctionPointerType() const
Definition TypeBase.h:8582
bool isPointerType() const
Definition TypeBase.h:8515
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:8915
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9158
bool isReferenceType() const
Definition TypeBase.h:8539
bool isEnumeralType() const
Definition TypeBase.h:8646
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
Definition Type.cpp:1909
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
Definition Type.cpp:2103
bool isAlignValT() const
Definition Type.cpp:3179
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:752
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
Definition TypeBase.h:8989
bool isExtVectorType() const
Definition TypeBase.h:8658
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
Definition Type.cpp:2168
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
Definition TypeBase.h:2790
bool isBitIntType() const
Definition TypeBase.h:8780
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2782
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
Definition TypeBase.h:2405
bool isPointerOrReferenceType() const
Definition TypeBase.h:8519
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition Type.cpp:2435
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
Definition Type.cpp:2312
bool isVectorType() const
Definition TypeBase.h:8654
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2921
bool isFloatingType() const
Definition Type.cpp:2304
bool isAnyPointerType() const
Definition TypeBase.h:8523
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9091
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
Definition Type.cpp:653
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Definition Expr.cpp:5035
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4037
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3940
Represents a C++ using-declaration.
Definition DeclCXX.h:3591
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
void setType(QualType newType)
Definition Decl.h:724
QualType getType() const
Definition Decl.h:723
Represents a variable declaration or definition.
Definition Decl.h:926
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition Decl.cpp:2158
@ TLS_None
Not a TLS variable.
Definition Decl.h:946
Represents a GCC generic vector type.
Definition TypeBase.h:4175
Captures information about a #pragma weak directive.
Definition Weak.h:25
const IdentifierInfo * getAlias() const
Definition Weak.h:32
SourceLocation getLocation() const
Definition Weak.h:33
A collection of diagnostics which were delayed.
const DelayedDiagnosticPool * getParent() const
void steal(DelayedDiagnosticPool &pool)
Steal the diagnostics from the given pool.
SmallVectorImpl< DelayedDiagnostic >::const_iterator pool_iterator
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
unsigned getForbiddenTypeDiagnostic() const
The diagnostic ID to emit.
Defines the clang::TargetInfo interface.
#define UINT_MAX
Definition limits.h:64
Enums for the diagnostics of target, target_version and target_clones.
Definition Sema.h:840
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:816
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus23
@ ExpectedFunctionMethodOrBlock
@ ExpectedClass
@ ExpectedTypeOrNamespace
@ ExpectedVariableFieldOrTag
@ ExpectedVariableOrField
@ ExpectedUnion
@ ExpectedFunctionOrMethod
@ ExpectedVariable
@ ExpectedFunctionOrClassOrEnum
@ ExpectedVariableOrFunction
@ ExpectedKernelFunction
@ ExpectedFunctionVariableOrClass
@ ExpectedNonMemberFunction
void handleSimpleAttributeOrDiagnose(SemaBase &S, Decl *D, const AttributeCommonInfo &CI, bool PassesCheck, unsigned DiagID, DiagnosticArgs &&...ExtraArgs)
Add an attribute AttrType to declaration D, provided that PassesCheck is true.
Definition Attr.h:185
bool hasDeclarator(const Decl *D)
Return true if the given decl has a declarator that should have been processed by Sema::GetTypeForDec...
Definition Attr.h:46
CUDAFunctionTarget
Definition Cuda.h:61
QualType getFunctionOrMethodResultType(const Decl *D)
Definition Attr.h:98
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition Specifiers.h:151
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
Definition Sema.h:626
@ None
Don't merge availability attributes at all.
Definition Sema.h:628
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:634
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
Definition Sema.h:640
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
Definition Sema.h:631
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
Definition Sema.h:637
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
void inferNoReturnAttr(Sema &S, const Decl *D)
CudaVersion ToCudaVersion(llvm::VersionTuple)
Definition Cuda.cpp:70
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool checkAttrMutualExclusion(SemaBase &S, Decl *D, const ParsedAttr &AL)
Diagnose mutually exclusive attributes when present on a given declaration.
Definition Attr.h:135
@ SC_Extern
Definition Specifiers.h:251
@ SC_Register
Definition Specifiers.h:257
@ SC_None
Definition Specifiers.h:250
@ TSCS_unspecified
Definition Specifiers.h:236
Expr * Cond
};
SourceRange getFunctionOrMethodResultSourceRange(const Decl *D)
Definition Attr.h:104
bool isFunctionOrMethodOrBlockForAttrSubject(const Decl *D)
Return true if the given decl has function type (function or function-typed variable) or an Objective...
Definition Attr.h:40
QualType getFunctionOrMethodParamType(const Decl *D, unsigned Idx)
Definition Attr.h:83
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
Definition Linkage.h:35
Language
The language for the input, used to select and validate the language standard and possible actions.
AttributeArgumentNType
These constants match the enumerated choices of err_attribute_argument_n_type and err_attribute_argum...
@ AANT_ArgumentIntegerConstant
@ AANT_ArgumentBuiltinFunction
@ AANT_ArgumentIntOrBool
@ AANT_ArgumentIdentifier
@ AANT_ArgumentString
@ SD_Automatic
Automatic storage duration (most local variables).
Definition Specifiers.h:341
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition ASTLambda.h:28
@ Result
The result type of a method or function.
Definition TypeBase.h:905
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
Definition Specifiers.h:399
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
Definition Specifiers.h:389
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
Definition Specifiers.h:384
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
Definition Specifiers.h:394
const FunctionProtoType * T
bool isFunctionOrMethodVariadic(const Decl *D)
Definition Attr.h:112
@ Template
We are parsing a template declaration.
Definition Parser.h:81
bool isFuncOrMethodForAttrSubject(const Decl *D)
isFuncOrMethodForAttrSubject - Return true if the given decl has function type (function or function-...
Definition Attr.h:34
ExprResult ExprError()
Definition Ownership.h:265
OffloadArch StringToOffloadArch(llvm::StringRef S)
CudaVersion
Definition Cuda.h:22
LLVM_READONLY bool isHexDigit(unsigned char c)
Return true if this character is an ASCII hex digit: [0-9a-fA-F].
Definition CharInfo.h:144
FormatStringType
Definition Sema.h:497
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
const char * OffloadArchToString(OffloadArch A)
void handleSimpleAttribute(SemaBase &S, Decl *D, const AttributeCommonInfo &CI)
Applies the given attribute to the Decl without performing any additional semantic checking.
Definition Attr.h:175
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool hasImplicitObjectParameter(const Decl *D)
Definition Attr.h:126
FloatModeKind
Definition TargetInfo.h:75
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
Definition Specifiers.h:410
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
Definition Attr.h:55
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
Definition Attr.h:64
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1288
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition Specifiers.h:198
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:278
@ CC_X86Pascal
Definition Specifiers.h:284
@ CC_Swift
Definition Specifiers.h:293
@ CC_IntelOclBicc
Definition Specifiers.h:290
@ CC_PreserveMost
Definition Specifiers.h:295
@ CC_Win64
Definition Specifiers.h:285
@ CC_X86ThisCall
Definition Specifiers.h:282
@ CC_AArch64VectorCall
Definition Specifiers.h:297
@ CC_DeviceKernel
Definition Specifiers.h:292
@ CC_AAPCS
Definition Specifiers.h:288
@ CC_PreserveNone
Definition Specifiers.h:300
@ CC_M68kRTD
Definition Specifiers.h:299
@ CC_SwiftAsync
Definition Specifiers.h:294
@ CC_X86RegCall
Definition Specifiers.h:287
@ CC_RISCVVectorCall
Definition Specifiers.h:301
@ CC_X86VectorCall
Definition Specifiers.h:283
@ CC_AArch64SVEPCS
Definition Specifiers.h:298
@ CC_RISCVVLSCall_32
Definition Specifiers.h:302
@ CC_X86StdCall
Definition Specifiers.h:280
@ CC_X86_64SysV
Definition Specifiers.h:286
@ CC_PreserveAll
Definition Specifiers.h:296
@ CC_X86FastCall
Definition Specifiers.h:281
@ CC_AAPCS_VFP
Definition Specifiers.h:289
@ Generic
not a target-specific vector type
Definition TypeBase.h:4136
U cast(CodeGen::Address addr)
Definition Address.h:327
SourceRange getFunctionOrMethodParamRange(const Decl *D, unsigned Idx)
Definition Attr.h:92
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5858
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:5874
@ Union
The "union" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5861
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ Other
Other implicit parameter.
Definition Decl.h:1746
IdentifierInfo * Identifier
FormatAttrKind Kind
Represents information about a change in availability for an entity, which is part of the encoding of...
Definition ParsedAttr.h:47
VersionTuple Version
The version number at which the change occurred.
Definition ParsedAttr.h:52
bool isValid() const
Determine whether this availability change is valid.
Definition ParsedAttr.h:58
static constexpr OSEnvPair macOStoMacCatalystPair()
Returns the os-environment mapping pair that's used to represent the macOS -> Mac Catalyst version ma...
static constexpr OSEnvPair iOStoWatchOSPair()
Returns the os-environment mapping pair that's used to represent the iOS -> watchOS version mapping.
static constexpr OSEnvPair iOStoTvOSPair()
Returns the os-environment mapping pair that's used to represent the iOS -> tvOS version mapping.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
Definition DeclSpec.h:1633
uint16_t Part2
...-89ab-...
Definition DeclCXX.h:4377
uint32_t Part1
{01234567-...
Definition DeclCXX.h:4375
uint16_t Part3
...-cdef-...
Definition DeclCXX.h:4379
uint8_t Part4And5[8]
...-0123-456789abcdef}
Definition DeclCXX.h:4381
virtual AttrHandling handleDeclAttribute(Sema &S, Decl *D, const ParsedAttr &Attr) const
If this ParsedAttrInfo knows how to handle this ParsedAttr applied to this Decl then do so and return...
Contains information gathered from parsing the contents of TargetAttr.
Definition TargetInfo.h:60
std::vector< std::string > Features
Definition TargetInfo.h:61