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