Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/Sema/SemaDecl.cpp
35234 views
1
//===--- SemaDecl.cpp - Semantic Analysis for Declarations ----------------===//
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 semantic analysis for declarations.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "TypeLocBuilder.h"
14
#include "clang/AST/ASTConsumer.h"
15
#include "clang/AST/ASTContext.h"
16
#include "clang/AST/ASTLambda.h"
17
#include "clang/AST/CXXInheritance.h"
18
#include "clang/AST/CharUnits.h"
19
#include "clang/AST/CommentDiagnostic.h"
20
#include "clang/AST/Decl.h"
21
#include "clang/AST/DeclCXX.h"
22
#include "clang/AST/DeclObjC.h"
23
#include "clang/AST/DeclTemplate.h"
24
#include "clang/AST/EvaluatedExprVisitor.h"
25
#include "clang/AST/Expr.h"
26
#include "clang/AST/ExprCXX.h"
27
#include "clang/AST/NonTrivialTypeVisitor.h"
28
#include "clang/AST/Randstruct.h"
29
#include "clang/AST/StmtCXX.h"
30
#include "clang/AST/Type.h"
31
#include "clang/Basic/Builtins.h"
32
#include "clang/Basic/HLSLRuntime.h"
33
#include "clang/Basic/PartialDiagnostic.h"
34
#include "clang/Basic/SourceManager.h"
35
#include "clang/Basic/TargetInfo.h"
36
#include "clang/Lex/HeaderSearch.h" // TODO: Sema shouldn't depend on Lex
37
#include "clang/Lex/Lexer.h" // TODO: Extract static functions to fix layering.
38
#include "clang/Lex/ModuleLoader.h" // TODO: Sema shouldn't depend on Lex
39
#include "clang/Lex/Preprocessor.h" // Included for isCodeCompletionEnabled()
40
#include "clang/Sema/CXXFieldCollector.h"
41
#include "clang/Sema/DeclSpec.h"
42
#include "clang/Sema/DelayedDiagnostic.h"
43
#include "clang/Sema/Initialization.h"
44
#include "clang/Sema/Lookup.h"
45
#include "clang/Sema/ParsedTemplate.h"
46
#include "clang/Sema/Scope.h"
47
#include "clang/Sema/ScopeInfo.h"
48
#include "clang/Sema/SemaCUDA.h"
49
#include "clang/Sema/SemaHLSL.h"
50
#include "clang/Sema/SemaInternal.h"
51
#include "clang/Sema/SemaObjC.h"
52
#include "clang/Sema/SemaOpenMP.h"
53
#include "clang/Sema/SemaPPC.h"
54
#include "clang/Sema/SemaRISCV.h"
55
#include "clang/Sema/SemaSwift.h"
56
#include "clang/Sema/SemaWasm.h"
57
#include "clang/Sema/Template.h"
58
#include "llvm/ADT/STLForwardCompat.h"
59
#include "llvm/ADT/SmallString.h"
60
#include "llvm/ADT/StringExtras.h"
61
#include "llvm/TargetParser/Triple.h"
62
#include <algorithm>
63
#include <cstring>
64
#include <functional>
65
#include <optional>
66
#include <unordered_map>
67
68
using namespace clang;
69
using namespace sema;
70
71
Sema::DeclGroupPtrTy Sema::ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType) {
72
if (OwnedType) {
73
Decl *Group[2] = { OwnedType, Ptr };
74
return DeclGroupPtrTy::make(DeclGroupRef::Create(Context, Group, 2));
75
}
76
77
return DeclGroupPtrTy::make(DeclGroupRef(Ptr));
78
}
79
80
namespace {
81
82
class TypeNameValidatorCCC final : public CorrectionCandidateCallback {
83
public:
84
TypeNameValidatorCCC(bool AllowInvalid, bool WantClass = false,
85
bool AllowTemplates = false,
86
bool AllowNonTemplates = true)
87
: AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
88
AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
89
WantExpressionKeywords = false;
90
WantCXXNamedCasts = false;
91
WantRemainingKeywords = false;
92
}
93
94
bool ValidateCandidate(const TypoCorrection &candidate) override {
95
if (NamedDecl *ND = candidate.getCorrectionDecl()) {
96
if (!AllowInvalidDecl && ND->isInvalidDecl())
97
return false;
98
99
if (getAsTypeTemplateDecl(ND))
100
return AllowTemplates;
101
102
bool IsType = isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
103
if (!IsType)
104
return false;
105
106
if (AllowNonTemplates)
107
return true;
108
109
// An injected-class-name of a class template (specialization) is valid
110
// as a template or as a non-template.
111
if (AllowTemplates) {
112
auto *RD = dyn_cast<CXXRecordDecl>(ND);
113
if (!RD || !RD->isInjectedClassName())
114
return false;
115
RD = cast<CXXRecordDecl>(RD->getDeclContext());
116
return RD->getDescribedClassTemplate() ||
117
isa<ClassTemplateSpecializationDecl>(RD);
118
}
119
120
return false;
121
}
122
123
return !WantClassName && candidate.isKeyword();
124
}
125
126
std::unique_ptr<CorrectionCandidateCallback> clone() override {
127
return std::make_unique<TypeNameValidatorCCC>(*this);
128
}
129
130
private:
131
bool AllowInvalidDecl;
132
bool WantClassName;
133
bool AllowTemplates;
134
bool AllowNonTemplates;
135
};
136
137
} // end anonymous namespace
138
139
namespace {
140
enum class UnqualifiedTypeNameLookupResult {
141
NotFound,
142
FoundNonType,
143
FoundType
144
};
145
} // end anonymous namespace
146
147
/// Tries to perform unqualified lookup of the type decls in bases for
148
/// dependent class.
149
/// \return \a NotFound if no any decls is found, \a FoundNotType if found not a
150
/// type decl, \a FoundType if only type decls are found.
151
static UnqualifiedTypeNameLookupResult
152
lookupUnqualifiedTypeNameInBase(Sema &S, const IdentifierInfo &II,
153
SourceLocation NameLoc,
154
const CXXRecordDecl *RD) {
155
if (!RD->hasDefinition())
156
return UnqualifiedTypeNameLookupResult::NotFound;
157
// Look for type decls in base classes.
158
UnqualifiedTypeNameLookupResult FoundTypeDecl =
159
UnqualifiedTypeNameLookupResult::NotFound;
160
for (const auto &Base : RD->bases()) {
161
const CXXRecordDecl *BaseRD = nullptr;
162
if (auto *BaseTT = Base.getType()->getAs<TagType>())
163
BaseRD = BaseTT->getAsCXXRecordDecl();
164
else if (auto *TST = Base.getType()->getAs<TemplateSpecializationType>()) {
165
// Look for type decls in dependent base classes that have known primary
166
// templates.
167
if (!TST || !TST->isDependentType())
168
continue;
169
auto *TD = TST->getTemplateName().getAsTemplateDecl();
170
if (!TD)
171
continue;
172
if (auto *BasePrimaryTemplate =
173
dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
174
if (BasePrimaryTemplate->getCanonicalDecl() != RD->getCanonicalDecl())
175
BaseRD = BasePrimaryTemplate;
176
else if (auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
177
if (const ClassTemplatePartialSpecializationDecl *PS =
178
CTD->findPartialSpecialization(Base.getType()))
179
if (PS->getCanonicalDecl() != RD->getCanonicalDecl())
180
BaseRD = PS;
181
}
182
}
183
}
184
if (BaseRD) {
185
for (NamedDecl *ND : BaseRD->lookup(&II)) {
186
if (!isa<TypeDecl>(ND))
187
return UnqualifiedTypeNameLookupResult::FoundNonType;
188
FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
189
}
190
if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
191
switch (lookupUnqualifiedTypeNameInBase(S, II, NameLoc, BaseRD)) {
192
case UnqualifiedTypeNameLookupResult::FoundNonType:
193
return UnqualifiedTypeNameLookupResult::FoundNonType;
194
case UnqualifiedTypeNameLookupResult::FoundType:
195
FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
196
break;
197
case UnqualifiedTypeNameLookupResult::NotFound:
198
break;
199
}
200
}
201
}
202
}
203
204
return FoundTypeDecl;
205
}
206
207
static ParsedType recoverFromTypeInKnownDependentBase(Sema &S,
208
const IdentifierInfo &II,
209
SourceLocation NameLoc) {
210
// Lookup in the parent class template context, if any.
211
const CXXRecordDecl *RD = nullptr;
212
UnqualifiedTypeNameLookupResult FoundTypeDecl =
213
UnqualifiedTypeNameLookupResult::NotFound;
214
for (DeclContext *DC = S.CurContext;
215
DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
216
DC = DC->getParent()) {
217
// Look for type decls in dependent base classes that have known primary
218
// templates.
219
RD = dyn_cast<CXXRecordDecl>(DC);
220
if (RD && RD->getDescribedClassTemplate())
221
FoundTypeDecl = lookupUnqualifiedTypeNameInBase(S, II, NameLoc, RD);
222
}
223
if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
224
return nullptr;
225
226
// We found some types in dependent base classes. Recover as if the user
227
// wrote 'typename MyClass::II' instead of 'II'. We'll fully resolve the
228
// lookup during template instantiation.
229
S.Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
230
231
ASTContext &Context = S.Context;
232
auto *NNS = NestedNameSpecifier::Create(Context, nullptr, false,
233
cast<Type>(Context.getRecordType(RD)));
234
QualType T =
235
Context.getDependentNameType(ElaboratedTypeKeyword::Typename, NNS, &II);
236
237
CXXScopeSpec SS;
238
SS.MakeTrivial(Context, NNS, SourceRange(NameLoc));
239
240
TypeLocBuilder Builder;
241
DependentNameTypeLoc DepTL = Builder.push<DependentNameTypeLoc>(T);
242
DepTL.setNameLoc(NameLoc);
243
DepTL.setElaboratedKeywordLoc(SourceLocation());
244
DepTL.setQualifierLoc(SS.getWithLocInContext(Context));
245
return S.CreateParsedType(T, Builder.getTypeSourceInfo(Context, T));
246
}
247
248
/// Build a ParsedType for a simple-type-specifier with a nested-name-specifier.
249
static ParsedType buildNamedType(Sema &S, const CXXScopeSpec *SS, QualType T,
250
SourceLocation NameLoc,
251
bool WantNontrivialTypeSourceInfo = true) {
252
switch (T->getTypeClass()) {
253
case Type::DeducedTemplateSpecialization:
254
case Type::Enum:
255
case Type::InjectedClassName:
256
case Type::Record:
257
case Type::Typedef:
258
case Type::UnresolvedUsing:
259
case Type::Using:
260
break;
261
// These can never be qualified so an ElaboratedType node
262
// would carry no additional meaning.
263
case Type::ObjCInterface:
264
case Type::ObjCTypeParam:
265
case Type::TemplateTypeParm:
266
return ParsedType::make(T);
267
default:
268
llvm_unreachable("Unexpected Type Class");
269
}
270
271
if (!SS || SS->isEmpty())
272
return ParsedType::make(S.Context.getElaboratedType(
273
ElaboratedTypeKeyword::None, nullptr, T, nullptr));
274
275
QualType ElTy = S.getElaboratedType(ElaboratedTypeKeyword::None, *SS, T);
276
if (!WantNontrivialTypeSourceInfo)
277
return ParsedType::make(ElTy);
278
279
TypeLocBuilder Builder;
280
Builder.pushTypeSpec(T).setNameLoc(NameLoc);
281
ElaboratedTypeLoc ElabTL = Builder.push<ElaboratedTypeLoc>(ElTy);
282
ElabTL.setElaboratedKeywordLoc(SourceLocation());
283
ElabTL.setQualifierLoc(SS->getWithLocInContext(S.Context));
284
return S.CreateParsedType(ElTy, Builder.getTypeSourceInfo(S.Context, ElTy));
285
}
286
287
ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
288
Scope *S, CXXScopeSpec *SS, bool isClassName,
289
bool HasTrailingDot, ParsedType ObjectTypePtr,
290
bool IsCtorOrDtorName,
291
bool WantNontrivialTypeSourceInfo,
292
bool IsClassTemplateDeductionContext,
293
ImplicitTypenameContext AllowImplicitTypename,
294
IdentifierInfo **CorrectedII) {
295
// FIXME: Consider allowing this outside C++1z mode as an extension.
296
bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
297
getLangOpts().CPlusPlus17 && !IsCtorOrDtorName &&
298
!isClassName && !HasTrailingDot;
299
300
// Determine where we will perform name lookup.
301
DeclContext *LookupCtx = nullptr;
302
if (ObjectTypePtr) {
303
QualType ObjectType = ObjectTypePtr.get();
304
if (ObjectType->isRecordType())
305
LookupCtx = computeDeclContext(ObjectType);
306
} else if (SS && SS->isNotEmpty()) {
307
LookupCtx = computeDeclContext(*SS, false);
308
309
if (!LookupCtx) {
310
if (isDependentScopeSpecifier(*SS)) {
311
// C++ [temp.res]p3:
312
// A qualified-id that refers to a type and in which the
313
// nested-name-specifier depends on a template-parameter (14.6.2)
314
// shall be prefixed by the keyword typename to indicate that the
315
// qualified-id denotes a type, forming an
316
// elaborated-type-specifier (7.1.5.3).
317
//
318
// We therefore do not perform any name lookup if the result would
319
// refer to a member of an unknown specialization.
320
// In C++2a, in several contexts a 'typename' is not required. Also
321
// allow this as an extension.
322
if (AllowImplicitTypename == ImplicitTypenameContext::No &&
323
!isClassName && !IsCtorOrDtorName)
324
return nullptr;
325
bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
326
if (IsImplicitTypename) {
327
SourceLocation QualifiedLoc = SS->getRange().getBegin();
328
if (getLangOpts().CPlusPlus20)
329
Diag(QualifiedLoc, diag::warn_cxx17_compat_implicit_typename);
330
else
331
Diag(QualifiedLoc, diag::ext_implicit_typename)
332
<< SS->getScopeRep() << II.getName()
333
<< FixItHint::CreateInsertion(QualifiedLoc, "typename ");
334
}
335
336
// We know from the grammar that this name refers to a type,
337
// so build a dependent node to describe the type.
338
if (WantNontrivialTypeSourceInfo)
339
return ActOnTypenameType(S, SourceLocation(), *SS, II, NameLoc,
340
(ImplicitTypenameContext)IsImplicitTypename)
341
.get();
342
343
NestedNameSpecifierLoc QualifierLoc = SS->getWithLocInContext(Context);
344
QualType T = CheckTypenameType(
345
IsImplicitTypename ? ElaboratedTypeKeyword::Typename
346
: ElaboratedTypeKeyword::None,
347
SourceLocation(), QualifierLoc, II, NameLoc);
348
return ParsedType::make(T);
349
}
350
351
return nullptr;
352
}
353
354
if (!LookupCtx->isDependentContext() &&
355
RequireCompleteDeclContext(*SS, LookupCtx))
356
return nullptr;
357
}
358
359
// FIXME: LookupNestedNameSpecifierName isn't the right kind of
360
// lookup for class-names.
361
LookupNameKind Kind = isClassName ? LookupNestedNameSpecifierName :
362
LookupOrdinaryName;
363
LookupResult Result(*this, &II, NameLoc, Kind);
364
if (LookupCtx) {
365
// Perform "qualified" name lookup into the declaration context we
366
// computed, which is either the type of the base of a member access
367
// expression or the declaration context associated with a prior
368
// nested-name-specifier.
369
LookupQualifiedName(Result, LookupCtx);
370
371
if (ObjectTypePtr && Result.empty()) {
372
// C++ [basic.lookup.classref]p3:
373
// If the unqualified-id is ~type-name, the type-name is looked up
374
// in the context of the entire postfix-expression. If the type T of
375
// the object expression is of a class type C, the type-name is also
376
// looked up in the scope of class C. At least one of the lookups shall
377
// find a name that refers to (possibly cv-qualified) T.
378
LookupName(Result, S);
379
}
380
} else {
381
// Perform unqualified name lookup.
382
LookupName(Result, S);
383
384
// For unqualified lookup in a class template in MSVC mode, look into
385
// dependent base classes where the primary class template is known.
386
if (Result.empty() && getLangOpts().MSVCCompat && (!SS || SS->isEmpty())) {
387
if (ParsedType TypeInBase =
388
recoverFromTypeInKnownDependentBase(*this, II, NameLoc))
389
return TypeInBase;
390
}
391
}
392
393
NamedDecl *IIDecl = nullptr;
394
UsingShadowDecl *FoundUsingShadow = nullptr;
395
switch (Result.getResultKind()) {
396
case LookupResult::NotFound:
397
if (CorrectedII) {
398
TypeNameValidatorCCC CCC(/*AllowInvalid=*/true, isClassName,
399
AllowDeducedTemplate);
400
TypoCorrection Correction = CorrectTypo(Result.getLookupNameInfo(), Kind,
401
S, SS, CCC, CTK_ErrorRecovery);
402
IdentifierInfo *NewII = Correction.getCorrectionAsIdentifierInfo();
403
TemplateTy Template;
404
bool MemberOfUnknownSpecialization;
405
UnqualifiedId TemplateName;
406
TemplateName.setIdentifier(NewII, NameLoc);
407
NestedNameSpecifier *NNS = Correction.getCorrectionSpecifier();
408
CXXScopeSpec NewSS, *NewSSPtr = SS;
409
if (SS && NNS) {
410
NewSS.MakeTrivial(Context, NNS, SourceRange(NameLoc));
411
NewSSPtr = &NewSS;
412
}
413
if (Correction && (NNS || NewII != &II) &&
414
// Ignore a correction to a template type as the to-be-corrected
415
// identifier is not a template (typo correction for template names
416
// is handled elsewhere).
417
!(getLangOpts().CPlusPlus && NewSSPtr &&
418
isTemplateName(S, *NewSSPtr, false, TemplateName, nullptr, false,
419
Template, MemberOfUnknownSpecialization))) {
420
ParsedType Ty = getTypeName(*NewII, NameLoc, S, NewSSPtr,
421
isClassName, HasTrailingDot, ObjectTypePtr,
422
IsCtorOrDtorName,
423
WantNontrivialTypeSourceInfo,
424
IsClassTemplateDeductionContext);
425
if (Ty) {
426
diagnoseTypo(Correction,
427
PDiag(diag::err_unknown_type_or_class_name_suggest)
428
<< Result.getLookupName() << isClassName);
429
if (SS && NNS)
430
SS->MakeTrivial(Context, NNS, SourceRange(NameLoc));
431
*CorrectedII = NewII;
432
return Ty;
433
}
434
}
435
}
436
Result.suppressDiagnostics();
437
return nullptr;
438
case LookupResult::NotFoundInCurrentInstantiation:
439
if (AllowImplicitTypename == ImplicitTypenameContext::Yes) {
440
QualType T = Context.getDependentNameType(ElaboratedTypeKeyword::None,
441
SS->getScopeRep(), &II);
442
TypeLocBuilder TLB;
443
DependentNameTypeLoc TL = TLB.push<DependentNameTypeLoc>(T);
444
TL.setElaboratedKeywordLoc(SourceLocation());
445
TL.setQualifierLoc(SS->getWithLocInContext(Context));
446
TL.setNameLoc(NameLoc);
447
return CreateParsedType(T, TLB.getTypeSourceInfo(Context, T));
448
}
449
[[fallthrough]];
450
case LookupResult::FoundOverloaded:
451
case LookupResult::FoundUnresolvedValue:
452
Result.suppressDiagnostics();
453
return nullptr;
454
455
case LookupResult::Ambiguous:
456
// Recover from type-hiding ambiguities by hiding the type. We'll
457
// do the lookup again when looking for an object, and we can
458
// diagnose the error then. If we don't do this, then the error
459
// about hiding the type will be immediately followed by an error
460
// that only makes sense if the identifier was treated like a type.
461
if (Result.getAmbiguityKind() == LookupResult::AmbiguousTagHiding) {
462
Result.suppressDiagnostics();
463
return nullptr;
464
}
465
466
// Look to see if we have a type anywhere in the list of results.
467
for (LookupResult::iterator Res = Result.begin(), ResEnd = Result.end();
468
Res != ResEnd; ++Res) {
469
NamedDecl *RealRes = (*Res)->getUnderlyingDecl();
470
if (isa<TypeDecl, ObjCInterfaceDecl, UnresolvedUsingIfExistsDecl>(
471
RealRes) ||
472
(AllowDeducedTemplate && getAsTypeTemplateDecl(RealRes))) {
473
if (!IIDecl ||
474
// Make the selection of the recovery decl deterministic.
475
RealRes->getLocation() < IIDecl->getLocation()) {
476
IIDecl = RealRes;
477
FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
478
}
479
}
480
}
481
482
if (!IIDecl) {
483
// None of the entities we found is a type, so there is no way
484
// to even assume that the result is a type. In this case, don't
485
// complain about the ambiguity. The parser will either try to
486
// perform this lookup again (e.g., as an object name), which
487
// will produce the ambiguity, or will complain that it expected
488
// a type name.
489
Result.suppressDiagnostics();
490
return nullptr;
491
}
492
493
// We found a type within the ambiguous lookup; diagnose the
494
// ambiguity and then return that type. This might be the right
495
// answer, or it might not be, but it suppresses any attempt to
496
// perform the name lookup again.
497
break;
498
499
case LookupResult::Found:
500
IIDecl = Result.getFoundDecl();
501
FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Result.begin());
502
break;
503
}
504
505
assert(IIDecl && "Didn't find decl");
506
507
QualType T;
508
if (TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
509
// C++ [class.qual]p2: A lookup that would find the injected-class-name
510
// instead names the constructors of the class, except when naming a class.
511
// This is ill-formed when we're not actually forming a ctor or dtor name.
512
auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
513
auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
514
if (!isClassName && !IsCtorOrDtorName && LookupRD && FoundRD &&
515
FoundRD->isInjectedClassName() &&
516
declaresSameEntity(LookupRD, cast<Decl>(FoundRD->getParent())))
517
Diag(NameLoc, diag::err_out_of_line_qualified_id_type_names_constructor)
518
<< &II << /*Type*/1;
519
520
DiagnoseUseOfDecl(IIDecl, NameLoc);
521
522
T = Context.getTypeDeclType(TD);
523
MarkAnyDeclReferenced(TD->getLocation(), TD, /*OdrUse=*/false);
524
} else if (ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(IIDecl)) {
525
(void)DiagnoseUseOfDecl(IDecl, NameLoc);
526
if (!HasTrailingDot)
527
T = Context.getObjCInterfaceType(IDecl);
528
FoundUsingShadow = nullptr; // FIXME: Target must be a TypeDecl.
529
} else if (auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
530
(void)DiagnoseUseOfDecl(UD, NameLoc);
531
// Recover with 'int'
532
return ParsedType::make(Context.IntTy);
533
} else if (AllowDeducedTemplate) {
534
if (auto *TD = getAsTypeTemplateDecl(IIDecl)) {
535
assert(!FoundUsingShadow || FoundUsingShadow->getTargetDecl() == TD);
536
TemplateName Template = Context.getQualifiedTemplateName(
537
SS ? SS->getScopeRep() : nullptr, /*TemplateKeyword=*/false,
538
FoundUsingShadow ? TemplateName(FoundUsingShadow) : TemplateName(TD));
539
T = Context.getDeducedTemplateSpecializationType(Template, QualType(),
540
false);
541
// Don't wrap in a further UsingType.
542
FoundUsingShadow = nullptr;
543
}
544
}
545
546
if (T.isNull()) {
547
// If it's not plausibly a type, suppress diagnostics.
548
Result.suppressDiagnostics();
549
return nullptr;
550
}
551
552
if (FoundUsingShadow)
553
T = Context.getUsingType(FoundUsingShadow, T);
554
555
return buildNamedType(*this, SS, T, NameLoc, WantNontrivialTypeSourceInfo);
556
}
557
558
// Builds a fake NNS for the given decl context.
559
static NestedNameSpecifier *
560
synthesizeCurrentNestedNameSpecifier(ASTContext &Context, DeclContext *DC) {
561
for (;; DC = DC->getLookupParent()) {
562
DC = DC->getPrimaryContext();
563
auto *ND = dyn_cast<NamespaceDecl>(DC);
564
if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
565
return NestedNameSpecifier::Create(Context, nullptr, ND);
566
else if (auto *RD = dyn_cast<CXXRecordDecl>(DC))
567
return NestedNameSpecifier::Create(Context, nullptr, RD->isTemplateDecl(),
568
RD->getTypeForDecl());
569
else if (isa<TranslationUnitDecl>(DC))
570
return NestedNameSpecifier::GlobalSpecifier(Context);
571
}
572
llvm_unreachable("something isn't in TU scope?");
573
}
574
575
/// Find the parent class with dependent bases of the innermost enclosing method
576
/// context. Do not look for enclosing CXXRecordDecls directly, or we will end
577
/// up allowing unqualified dependent type names at class-level, which MSVC
578
/// correctly rejects.
579
static const CXXRecordDecl *
580
findRecordWithDependentBasesOfEnclosingMethod(const DeclContext *DC) {
581
for (; DC && DC->isDependentContext(); DC = DC->getLookupParent()) {
582
DC = DC->getPrimaryContext();
583
if (const auto *MD = dyn_cast<CXXMethodDecl>(DC))
584
if (MD->getParent()->hasAnyDependentBases())
585
return MD->getParent();
586
}
587
return nullptr;
588
}
589
590
ParsedType Sema::ActOnMSVCUnknownTypeName(const IdentifierInfo &II,
591
SourceLocation NameLoc,
592
bool IsTemplateTypeArg) {
593
assert(getLangOpts().MSVCCompat && "shouldn't be called in non-MSVC mode");
594
595
NestedNameSpecifier *NNS = nullptr;
596
if (IsTemplateTypeArg && getCurScope()->isTemplateParamScope()) {
597
// If we weren't able to parse a default template argument, delay lookup
598
// until instantiation time by making a non-dependent DependentTypeName. We
599
// pretend we saw a NestedNameSpecifier referring to the current scope, and
600
// lookup is retried.
601
// FIXME: This hurts our diagnostic quality, since we get errors like "no
602
// type named 'Foo' in 'current_namespace'" when the user didn't write any
603
// name specifiers.
604
NNS = synthesizeCurrentNestedNameSpecifier(Context, CurContext);
605
Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
606
} else if (const CXXRecordDecl *RD =
607
findRecordWithDependentBasesOfEnclosingMethod(CurContext)) {
608
// Build a DependentNameType that will perform lookup into RD at
609
// instantiation time.
610
NNS = NestedNameSpecifier::Create(Context, nullptr, RD->isTemplateDecl(),
611
RD->getTypeForDecl());
612
613
// Diagnose that this identifier was undeclared, and retry the lookup during
614
// template instantiation.
615
Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
616
<< RD;
617
} else {
618
// This is not a situation that we should recover from.
619
return ParsedType();
620
}
621
622
QualType T =
623
Context.getDependentNameType(ElaboratedTypeKeyword::None, NNS, &II);
624
625
// Build type location information. We synthesized the qualifier, so we have
626
// to build a fake NestedNameSpecifierLoc.
627
NestedNameSpecifierLocBuilder NNSLocBuilder;
628
NNSLocBuilder.MakeTrivial(Context, NNS, SourceRange(NameLoc));
629
NestedNameSpecifierLoc QualifierLoc = NNSLocBuilder.getWithLocInContext(Context);
630
631
TypeLocBuilder Builder;
632
DependentNameTypeLoc DepTL = Builder.push<DependentNameTypeLoc>(T);
633
DepTL.setNameLoc(NameLoc);
634
DepTL.setElaboratedKeywordLoc(SourceLocation());
635
DepTL.setQualifierLoc(QualifierLoc);
636
return CreateParsedType(T, Builder.getTypeSourceInfo(Context, T));
637
}
638
639
DeclSpec::TST Sema::isTagName(IdentifierInfo &II, Scope *S) {
640
// Do a tag name lookup in this scope.
641
LookupResult R(*this, &II, SourceLocation(), LookupTagName);
642
LookupName(R, S, false);
643
R.suppressDiagnostics();
644
if (R.getResultKind() == LookupResult::Found)
645
if (const TagDecl *TD = R.getAsSingle<TagDecl>()) {
646
switch (TD->getTagKind()) {
647
case TagTypeKind::Struct:
648
return DeclSpec::TST_struct;
649
case TagTypeKind::Interface:
650
return DeclSpec::TST_interface;
651
case TagTypeKind::Union:
652
return DeclSpec::TST_union;
653
case TagTypeKind::Class:
654
return DeclSpec::TST_class;
655
case TagTypeKind::Enum:
656
return DeclSpec::TST_enum;
657
}
658
}
659
660
return DeclSpec::TST_unspecified;
661
}
662
663
bool Sema::isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S) {
664
if (CurContext->isRecord()) {
665
if (SS->getScopeRep()->getKind() == NestedNameSpecifier::Super)
666
return true;
667
668
const Type *Ty = SS->getScopeRep()->getAsType();
669
670
CXXRecordDecl *RD = cast<CXXRecordDecl>(CurContext);
671
for (const auto &Base : RD->bases())
672
if (Ty && Context.hasSameUnqualifiedType(QualType(Ty, 1), Base.getType()))
673
return true;
674
return S->isFunctionPrototypeScope();
675
}
676
return CurContext->isFunctionOrMethod() || S->isFunctionPrototypeScope();
677
}
678
679
void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II,
680
SourceLocation IILoc,
681
Scope *S,
682
CXXScopeSpec *SS,
683
ParsedType &SuggestedType,
684
bool IsTemplateName) {
685
// Don't report typename errors for editor placeholders.
686
if (II->isEditorPlaceholder())
687
return;
688
// We don't have anything to suggest (yet).
689
SuggestedType = nullptr;
690
691
// There may have been a typo in the name of the type. Look up typo
692
// results, in case we have something that we can suggest.
693
TypeNameValidatorCCC CCC(/*AllowInvalid=*/false, /*WantClass=*/false,
694
/*AllowTemplates=*/IsTemplateName,
695
/*AllowNonTemplates=*/!IsTemplateName);
696
if (TypoCorrection Corrected =
697
CorrectTypo(DeclarationNameInfo(II, IILoc), LookupOrdinaryName, S, SS,
698
CCC, CTK_ErrorRecovery)) {
699
// FIXME: Support error recovery for the template-name case.
700
bool CanRecover = !IsTemplateName;
701
if (Corrected.isKeyword()) {
702
// We corrected to a keyword.
703
diagnoseTypo(Corrected,
704
PDiag(IsTemplateName ? diag::err_no_template_suggest
705
: diag::err_unknown_typename_suggest)
706
<< II);
707
II = Corrected.getCorrectionAsIdentifierInfo();
708
} else {
709
// We found a similarly-named type or interface; suggest that.
710
if (!SS || !SS->isSet()) {
711
diagnoseTypo(Corrected,
712
PDiag(IsTemplateName ? diag::err_no_template_suggest
713
: diag::err_unknown_typename_suggest)
714
<< II, CanRecover);
715
} else if (DeclContext *DC = computeDeclContext(*SS, false)) {
716
std::string CorrectedStr(Corrected.getAsString(getLangOpts()));
717
bool DroppedSpecifier =
718
Corrected.WillReplaceSpecifier() && II->getName() == CorrectedStr;
719
diagnoseTypo(Corrected,
720
PDiag(IsTemplateName
721
? diag::err_no_member_template_suggest
722
: diag::err_unknown_nested_typename_suggest)
723
<< II << DC << DroppedSpecifier << SS->getRange(),
724
CanRecover);
725
} else {
726
llvm_unreachable("could not have corrected a typo here");
727
}
728
729
if (!CanRecover)
730
return;
731
732
CXXScopeSpec tmpSS;
733
if (Corrected.getCorrectionSpecifier())
734
tmpSS.MakeTrivial(Context, Corrected.getCorrectionSpecifier(),
735
SourceRange(IILoc));
736
// FIXME: Support class template argument deduction here.
737
SuggestedType =
738
getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
739
tmpSS.isSet() ? &tmpSS : SS, false, false, nullptr,
740
/*IsCtorOrDtorName=*/false,
741
/*WantNontrivialTypeSourceInfo=*/true);
742
}
743
return;
744
}
745
746
if (getLangOpts().CPlusPlus && !IsTemplateName) {
747
// See if II is a class template that the user forgot to pass arguments to.
748
UnqualifiedId Name;
749
Name.setIdentifier(II, IILoc);
750
CXXScopeSpec EmptySS;
751
TemplateTy TemplateResult;
752
bool MemberOfUnknownSpecialization;
753
if (isTemplateName(S, SS ? *SS : EmptySS, /*hasTemplateKeyword=*/false,
754
Name, nullptr, true, TemplateResult,
755
MemberOfUnknownSpecialization) == TNK_Type_template) {
756
diagnoseMissingTemplateArguments(TemplateResult.get(), IILoc);
757
return;
758
}
759
}
760
761
// FIXME: Should we move the logic that tries to recover from a missing tag
762
// (struct, union, enum) from Parser::ParseImplicitInt here, instead?
763
764
if (!SS || (!SS->isSet() && !SS->isInvalid()))
765
Diag(IILoc, IsTemplateName ? diag::err_no_template
766
: diag::err_unknown_typename)
767
<< II;
768
else if (DeclContext *DC = computeDeclContext(*SS, false))
769
Diag(IILoc, IsTemplateName ? diag::err_no_member_template
770
: diag::err_typename_nested_not_found)
771
<< II << DC << SS->getRange();
772
else if (SS->isValid() && SS->getScopeRep()->containsErrors()) {
773
SuggestedType =
774
ActOnTypenameType(S, SourceLocation(), *SS, *II, IILoc).get();
775
} else if (isDependentScopeSpecifier(*SS)) {
776
unsigned DiagID = diag::err_typename_missing;
777
if (getLangOpts().MSVCCompat && isMicrosoftMissingTypename(SS, S))
778
DiagID = diag::ext_typename_missing;
779
780
Diag(SS->getRange().getBegin(), DiagID)
781
<< SS->getScopeRep() << II->getName()
782
<< SourceRange(SS->getRange().getBegin(), IILoc)
783
<< FixItHint::CreateInsertion(SS->getRange().getBegin(), "typename ");
784
SuggestedType = ActOnTypenameType(S, SourceLocation(),
785
*SS, *II, IILoc).get();
786
} else {
787
assert(SS && SS->isInvalid() &&
788
"Invalid scope specifier has already been diagnosed");
789
}
790
}
791
792
/// Determine whether the given result set contains either a type name
793
/// or
794
static bool isResultTypeOrTemplate(LookupResult &R, const Token &NextToken) {
795
bool CheckTemplate = R.getSema().getLangOpts().CPlusPlus &&
796
NextToken.is(tok::less);
797
798
for (LookupResult::iterator I = R.begin(), IEnd = R.end(); I != IEnd; ++I) {
799
if (isa<TypeDecl>(*I) || isa<ObjCInterfaceDecl>(*I))
800
return true;
801
802
if (CheckTemplate && isa<TemplateDecl>(*I))
803
return true;
804
}
805
806
return false;
807
}
808
809
static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result,
810
Scope *S, CXXScopeSpec &SS,
811
IdentifierInfo *&Name,
812
SourceLocation NameLoc) {
813
LookupResult R(SemaRef, Name, NameLoc, Sema::LookupTagName);
814
SemaRef.LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
815
if (TagDecl *Tag = R.getAsSingle<TagDecl>()) {
816
StringRef FixItTagName;
817
switch (Tag->getTagKind()) {
818
case TagTypeKind::Class:
819
FixItTagName = "class ";
820
break;
821
822
case TagTypeKind::Enum:
823
FixItTagName = "enum ";
824
break;
825
826
case TagTypeKind::Struct:
827
FixItTagName = "struct ";
828
break;
829
830
case TagTypeKind::Interface:
831
FixItTagName = "__interface ";
832
break;
833
834
case TagTypeKind::Union:
835
FixItTagName = "union ";
836
break;
837
}
838
839
StringRef TagName = FixItTagName.drop_back();
840
SemaRef.Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
841
<< Name << TagName << SemaRef.getLangOpts().CPlusPlus
842
<< FixItHint::CreateInsertion(NameLoc, FixItTagName);
843
844
for (LookupResult::iterator I = Result.begin(), IEnd = Result.end();
845
I != IEnd; ++I)
846
SemaRef.Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
847
<< Name << TagName;
848
849
// Replace lookup results with just the tag decl.
850
Result.clear(Sema::LookupTagName);
851
SemaRef.LookupParsedName(Result, S, &SS, /*ObjectType=*/QualType());
852
return true;
853
}
854
855
return false;
856
}
857
858
Sema::NameClassification Sema::ClassifyName(Scope *S, CXXScopeSpec &SS,
859
IdentifierInfo *&Name,
860
SourceLocation NameLoc,
861
const Token &NextToken,
862
CorrectionCandidateCallback *CCC) {
863
DeclarationNameInfo NameInfo(Name, NameLoc);
864
ObjCMethodDecl *CurMethod = getCurMethodDecl();
865
866
assert(NextToken.isNot(tok::coloncolon) &&
867
"parse nested name specifiers before calling ClassifyName");
868
if (getLangOpts().CPlusPlus && SS.isSet() &&
869
isCurrentClassName(*Name, S, &SS)) {
870
// Per [class.qual]p2, this names the constructors of SS, not the
871
// injected-class-name. We don't have a classification for that.
872
// There's not much point caching this result, since the parser
873
// will reject it later.
874
return NameClassification::Unknown();
875
}
876
877
LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName);
878
LookupParsedName(Result, S, &SS, /*ObjectType=*/QualType(),
879
/*AllowBuiltinCreation=*/!CurMethod);
880
881
if (SS.isInvalid())
882
return NameClassification::Error();
883
884
// For unqualified lookup in a class template in MSVC mode, look into
885
// dependent base classes where the primary class template is known.
886
if (Result.empty() && SS.isEmpty() && getLangOpts().MSVCCompat) {
887
if (ParsedType TypeInBase =
888
recoverFromTypeInKnownDependentBase(*this, *Name, NameLoc))
889
return TypeInBase;
890
}
891
892
// Perform lookup for Objective-C instance variables (including automatically
893
// synthesized instance variables), if we're in an Objective-C method.
894
// FIXME: This lookup really, really needs to be folded in to the normal
895
// unqualified lookup mechanism.
896
if (SS.isEmpty() && CurMethod && !isResultTypeOrTemplate(Result, NextToken)) {
897
DeclResult Ivar = ObjC().LookupIvarInObjCMethod(Result, S, Name);
898
if (Ivar.isInvalid())
899
return NameClassification::Error();
900
if (Ivar.isUsable())
901
return NameClassification::NonType(cast<NamedDecl>(Ivar.get()));
902
903
// We defer builtin creation until after ivar lookup inside ObjC methods.
904
if (Result.empty())
905
LookupBuiltin(Result);
906
}
907
908
bool SecondTry = false;
909
bool IsFilteredTemplateName = false;
910
911
Corrected:
912
switch (Result.getResultKind()) {
913
case LookupResult::NotFound:
914
// If an unqualified-id is followed by a '(', then we have a function
915
// call.
916
if (SS.isEmpty() && NextToken.is(tok::l_paren)) {
917
// In C++, this is an ADL-only call.
918
// FIXME: Reference?
919
if (getLangOpts().CPlusPlus)
920
return NameClassification::UndeclaredNonType();
921
922
// C90 6.3.2.2:
923
// If the expression that precedes the parenthesized argument list in a
924
// function call consists solely of an identifier, and if no
925
// declaration is visible for this identifier, the identifier is
926
// implicitly declared exactly as if, in the innermost block containing
927
// the function call, the declaration
928
//
929
// extern int identifier ();
930
//
931
// appeared.
932
//
933
// We also allow this in C99 as an extension. However, this is not
934
// allowed in all language modes as functions without prototypes may not
935
// be supported.
936
if (getLangOpts().implicitFunctionsAllowed()) {
937
if (NamedDecl *D = ImplicitlyDefineFunction(NameLoc, *Name, S))
938
return NameClassification::NonType(D);
939
}
940
}
941
942
if (getLangOpts().CPlusPlus20 && SS.isEmpty() && NextToken.is(tok::less)) {
943
// In C++20 onwards, this could be an ADL-only call to a function
944
// template, and we're required to assume that this is a template name.
945
//
946
// FIXME: Find a way to still do typo correction in this case.
947
TemplateName Template =
948
Context.getAssumedTemplateName(NameInfo.getName());
949
return NameClassification::UndeclaredTemplate(Template);
950
}
951
952
// In C, we first see whether there is a tag type by the same name, in
953
// which case it's likely that the user just forgot to write "enum",
954
// "struct", or "union".
955
if (!getLangOpts().CPlusPlus && !SecondTry &&
956
isTagTypeWithMissingTag(*this, Result, S, SS, Name, NameLoc)) {
957
break;
958
}
959
960
// Perform typo correction to determine if there is another name that is
961
// close to this name.
962
if (!SecondTry && CCC) {
963
SecondTry = true;
964
if (TypoCorrection Corrected =
965
CorrectTypo(Result.getLookupNameInfo(), Result.getLookupKind(), S,
966
&SS, *CCC, CTK_ErrorRecovery)) {
967
unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
968
unsigned QualifiedDiag = diag::err_no_member_suggest;
969
970
NamedDecl *FirstDecl = Corrected.getFoundDecl();
971
NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
972
if (getLangOpts().CPlusPlus && NextToken.is(tok::less) &&
973
UnderlyingFirstDecl && isa<TemplateDecl>(UnderlyingFirstDecl)) {
974
UnqualifiedDiag = diag::err_no_template_suggest;
975
QualifiedDiag = diag::err_no_member_template_suggest;
976
} else if (UnderlyingFirstDecl &&
977
(isa<TypeDecl>(UnderlyingFirstDecl) ||
978
isa<ObjCInterfaceDecl>(UnderlyingFirstDecl) ||
979
isa<ObjCCompatibleAliasDecl>(UnderlyingFirstDecl))) {
980
UnqualifiedDiag = diag::err_unknown_typename_suggest;
981
QualifiedDiag = diag::err_unknown_nested_typename_suggest;
982
}
983
984
if (SS.isEmpty()) {
985
diagnoseTypo(Corrected, PDiag(UnqualifiedDiag) << Name);
986
} else {// FIXME: is this even reachable? Test it.
987
std::string CorrectedStr(Corrected.getAsString(getLangOpts()));
988
bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
989
Name->getName() == CorrectedStr;
990
diagnoseTypo(Corrected, PDiag(QualifiedDiag)
991
<< Name << computeDeclContext(SS, false)
992
<< DroppedSpecifier << SS.getRange());
993
}
994
995
// Update the name, so that the caller has the new name.
996
Name = Corrected.getCorrectionAsIdentifierInfo();
997
998
// Typo correction corrected to a keyword.
999
if (Corrected.isKeyword())
1000
return Name;
1001
1002
// Also update the LookupResult...
1003
// FIXME: This should probably go away at some point
1004
Result.clear();
1005
Result.setLookupName(Corrected.getCorrection());
1006
if (FirstDecl)
1007
Result.addDecl(FirstDecl);
1008
1009
// If we found an Objective-C instance variable, let
1010
// LookupInObjCMethod build the appropriate expression to
1011
// reference the ivar.
1012
// FIXME: This is a gross hack.
1013
if (ObjCIvarDecl *Ivar = Result.getAsSingle<ObjCIvarDecl>()) {
1014
DeclResult R =
1015
ObjC().LookupIvarInObjCMethod(Result, S, Ivar->getIdentifier());
1016
if (R.isInvalid())
1017
return NameClassification::Error();
1018
if (R.isUsable())
1019
return NameClassification::NonType(Ivar);
1020
}
1021
1022
goto Corrected;
1023
}
1024
}
1025
1026
// We failed to correct; just fall through and let the parser deal with it.
1027
Result.suppressDiagnostics();
1028
return NameClassification::Unknown();
1029
1030
case LookupResult::NotFoundInCurrentInstantiation: {
1031
// We performed name lookup into the current instantiation, and there were
1032
// dependent bases, so we treat this result the same way as any other
1033
// dependent nested-name-specifier.
1034
1035
// C++ [temp.res]p2:
1036
// A name used in a template declaration or definition and that is
1037
// dependent on a template-parameter is assumed not to name a type
1038
// unless the applicable name lookup finds a type name or the name is
1039
// qualified by the keyword typename.
1040
//
1041
// FIXME: If the next token is '<', we might want to ask the parser to
1042
// perform some heroics to see if we actually have a
1043
// template-argument-list, which would indicate a missing 'template'
1044
// keyword here.
1045
return NameClassification::DependentNonType();
1046
}
1047
1048
case LookupResult::Found:
1049
case LookupResult::FoundOverloaded:
1050
case LookupResult::FoundUnresolvedValue:
1051
break;
1052
1053
case LookupResult::Ambiguous:
1054
if (getLangOpts().CPlusPlus && NextToken.is(tok::less) &&
1055
hasAnyAcceptableTemplateNames(Result, /*AllowFunctionTemplates=*/true,
1056
/*AllowDependent=*/false)) {
1057
// C++ [temp.local]p3:
1058
// A lookup that finds an injected-class-name (10.2) can result in an
1059
// ambiguity in certain cases (for example, if it is found in more than
1060
// one base class). If all of the injected-class-names that are found
1061
// refer to specializations of the same class template, and if the name
1062
// is followed by a template-argument-list, the reference refers to the
1063
// class template itself and not a specialization thereof, and is not
1064
// ambiguous.
1065
//
1066
// This filtering can make an ambiguous result into an unambiguous one,
1067
// so try again after filtering out template names.
1068
FilterAcceptableTemplateNames(Result);
1069
if (!Result.isAmbiguous()) {
1070
IsFilteredTemplateName = true;
1071
break;
1072
}
1073
}
1074
1075
// Diagnose the ambiguity and return an error.
1076
return NameClassification::Error();
1077
}
1078
1079
if (getLangOpts().CPlusPlus && NextToken.is(tok::less) &&
1080
(IsFilteredTemplateName ||
1081
hasAnyAcceptableTemplateNames(
1082
Result, /*AllowFunctionTemplates=*/true,
1083
/*AllowDependent=*/false,
1084
/*AllowNonTemplateFunctions*/ SS.isEmpty() &&
1085
getLangOpts().CPlusPlus20))) {
1086
// C++ [temp.names]p3:
1087
// After name lookup (3.4) finds that a name is a template-name or that
1088
// an operator-function-id or a literal- operator-id refers to a set of
1089
// overloaded functions any member of which is a function template if
1090
// this is followed by a <, the < is always taken as the delimiter of a
1091
// template-argument-list and never as the less-than operator.
1092
// C++2a [temp.names]p2:
1093
// A name is also considered to refer to a template if it is an
1094
// unqualified-id followed by a < and name lookup finds either one
1095
// or more functions or finds nothing.
1096
if (!IsFilteredTemplateName)
1097
FilterAcceptableTemplateNames(Result);
1098
1099
bool IsFunctionTemplate;
1100
bool IsVarTemplate;
1101
TemplateName Template;
1102
if (Result.end() - Result.begin() > 1) {
1103
IsFunctionTemplate = true;
1104
Template = Context.getOverloadedTemplateName(Result.begin(),
1105
Result.end());
1106
} else if (!Result.empty()) {
1107
auto *TD = cast<TemplateDecl>(getAsTemplateNameDecl(
1108
*Result.begin(), /*AllowFunctionTemplates=*/true,
1109
/*AllowDependent=*/false));
1110
IsFunctionTemplate = isa<FunctionTemplateDecl>(TD);
1111
IsVarTemplate = isa<VarTemplateDecl>(TD);
1112
1113
UsingShadowDecl *FoundUsingShadow =
1114
dyn_cast<UsingShadowDecl>(*Result.begin());
1115
assert(!FoundUsingShadow ||
1116
TD == cast<TemplateDecl>(FoundUsingShadow->getTargetDecl()));
1117
Template = Context.getQualifiedTemplateName(
1118
SS.getScopeRep(),
1119
/*TemplateKeyword=*/false,
1120
FoundUsingShadow ? TemplateName(FoundUsingShadow) : TemplateName(TD));
1121
} else {
1122
// All results were non-template functions. This is a function template
1123
// name.
1124
IsFunctionTemplate = true;
1125
Template = Context.getAssumedTemplateName(NameInfo.getName());
1126
}
1127
1128
if (IsFunctionTemplate) {
1129
// Function templates always go through overload resolution, at which
1130
// point we'll perform the various checks (e.g., accessibility) we need
1131
// to based on which function we selected.
1132
Result.suppressDiagnostics();
1133
1134
return NameClassification::FunctionTemplate(Template);
1135
}
1136
1137
return IsVarTemplate ? NameClassification::VarTemplate(Template)
1138
: NameClassification::TypeTemplate(Template);
1139
}
1140
1141
auto BuildTypeFor = [&](TypeDecl *Type, NamedDecl *Found) {
1142
QualType T = Context.getTypeDeclType(Type);
1143
if (const auto *USD = dyn_cast<UsingShadowDecl>(Found))
1144
T = Context.getUsingType(USD, T);
1145
return buildNamedType(*this, &SS, T, NameLoc);
1146
};
1147
1148
NamedDecl *FirstDecl = (*Result.begin())->getUnderlyingDecl();
1149
if (TypeDecl *Type = dyn_cast<TypeDecl>(FirstDecl)) {
1150
DiagnoseUseOfDecl(Type, NameLoc);
1151
MarkAnyDeclReferenced(Type->getLocation(), Type, /*OdrUse=*/false);
1152
return BuildTypeFor(Type, *Result.begin());
1153
}
1154
1155
ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(FirstDecl);
1156
if (!Class) {
1157
// FIXME: It's unfortunate that we don't have a Type node for handling this.
1158
if (ObjCCompatibleAliasDecl *Alias =
1159
dyn_cast<ObjCCompatibleAliasDecl>(FirstDecl))
1160
Class = Alias->getClassInterface();
1161
}
1162
1163
if (Class) {
1164
DiagnoseUseOfDecl(Class, NameLoc);
1165
1166
if (NextToken.is(tok::period)) {
1167
// Interface. <something> is parsed as a property reference expression.
1168
// Just return "unknown" as a fall-through for now.
1169
Result.suppressDiagnostics();
1170
return NameClassification::Unknown();
1171
}
1172
1173
QualType T = Context.getObjCInterfaceType(Class);
1174
return ParsedType::make(T);
1175
}
1176
1177
if (isa<ConceptDecl>(FirstDecl)) {
1178
// We want to preserve the UsingShadowDecl for concepts.
1179
if (auto *USD = dyn_cast<UsingShadowDecl>(Result.getRepresentativeDecl()))
1180
return NameClassification::Concept(TemplateName(USD));
1181
return NameClassification::Concept(
1182
TemplateName(cast<TemplateDecl>(FirstDecl)));
1183
}
1184
1185
if (auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(FirstDecl)) {
1186
(void)DiagnoseUseOfDecl(EmptyD, NameLoc);
1187
return NameClassification::Error();
1188
}
1189
1190
// We can have a type template here if we're classifying a template argument.
1191
if (isa<TemplateDecl>(FirstDecl) && !isa<FunctionTemplateDecl>(FirstDecl) &&
1192
!isa<VarTemplateDecl>(FirstDecl))
1193
return NameClassification::TypeTemplate(
1194
TemplateName(cast<TemplateDecl>(FirstDecl)));
1195
1196
// Check for a tag type hidden by a non-type decl in a few cases where it
1197
// seems likely a type is wanted instead of the non-type that was found.
1198
bool NextIsOp = NextToken.isOneOf(tok::amp, tok::star);
1199
if ((NextToken.is(tok::identifier) ||
1200
(NextIsOp &&
1201
FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1202
isTagTypeWithMissingTag(*this, Result, S, SS, Name, NameLoc)) {
1203
TypeDecl *Type = Result.getAsSingle<TypeDecl>();
1204
DiagnoseUseOfDecl(Type, NameLoc);
1205
return BuildTypeFor(Type, *Result.begin());
1206
}
1207
1208
// If we already know which single declaration is referenced, just annotate
1209
// that declaration directly. Defer resolving even non-overloaded class
1210
// member accesses, as we need to defer certain access checks until we know
1211
// the context.
1212
bool ADL = UseArgumentDependentLookup(SS, Result, NextToken.is(tok::l_paren));
1213
if (Result.isSingleResult() && !ADL &&
1214
(!FirstDecl->isCXXClassMember() || isa<EnumConstantDecl>(FirstDecl)))
1215
return NameClassification::NonType(Result.getRepresentativeDecl());
1216
1217
// Otherwise, this is an overload set that we will need to resolve later.
1218
Result.suppressDiagnostics();
1219
return NameClassification::OverloadSet(UnresolvedLookupExpr::Create(
1220
Context, Result.getNamingClass(), SS.getWithLocInContext(Context),
1221
Result.getLookupNameInfo(), ADL, Result.begin(), Result.end(),
1222
/*KnownDependent=*/false, /*KnownInstantiationDependent=*/false));
1223
}
1224
1225
ExprResult
1226
Sema::ActOnNameClassifiedAsUndeclaredNonType(IdentifierInfo *Name,
1227
SourceLocation NameLoc) {
1228
assert(getLangOpts().CPlusPlus && "ADL-only call in C?");
1229
CXXScopeSpec SS;
1230
LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName);
1231
return BuildDeclarationNameExpr(SS, Result, /*ADL=*/true);
1232
}
1233
1234
ExprResult
1235
Sema::ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS,
1236
IdentifierInfo *Name,
1237
SourceLocation NameLoc,
1238
bool IsAddressOfOperand) {
1239
DeclarationNameInfo NameInfo(Name, NameLoc);
1240
return ActOnDependentIdExpression(SS, /*TemplateKWLoc=*/SourceLocation(),
1241
NameInfo, IsAddressOfOperand,
1242
/*TemplateArgs=*/nullptr);
1243
}
1244
1245
ExprResult Sema::ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS,
1246
NamedDecl *Found,
1247
SourceLocation NameLoc,
1248
const Token &NextToken) {
1249
if (getCurMethodDecl() && SS.isEmpty())
1250
if (auto *Ivar = dyn_cast<ObjCIvarDecl>(Found->getUnderlyingDecl()))
1251
return ObjC().BuildIvarRefExpr(S, NameLoc, Ivar);
1252
1253
// Reconstruct the lookup result.
1254
LookupResult Result(*this, Found->getDeclName(), NameLoc, LookupOrdinaryName);
1255
Result.addDecl(Found);
1256
Result.resolveKind();
1257
1258
bool ADL = UseArgumentDependentLookup(SS, Result, NextToken.is(tok::l_paren));
1259
return BuildDeclarationNameExpr(SS, Result, ADL, /*AcceptInvalidDecl=*/true);
1260
}
1261
1262
ExprResult Sema::ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *E) {
1263
// For an implicit class member access, transform the result into a member
1264
// access expression if necessary.
1265
auto *ULE = cast<UnresolvedLookupExpr>(E);
1266
if ((*ULE->decls_begin())->isCXXClassMember()) {
1267
CXXScopeSpec SS;
1268
SS.Adopt(ULE->getQualifierLoc());
1269
1270
// Reconstruct the lookup result.
1271
LookupResult Result(*this, ULE->getName(), ULE->getNameLoc(),
1272
LookupOrdinaryName);
1273
Result.setNamingClass(ULE->getNamingClass());
1274
for (auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I)
1275
Result.addDecl(*I, I.getAccess());
1276
Result.resolveKind();
1277
return BuildPossibleImplicitMemberExpr(SS, SourceLocation(), Result,
1278
nullptr, S);
1279
}
1280
1281
// Otherwise, this is already in the form we needed, and no further checks
1282
// are necessary.
1283
return ULE;
1284
}
1285
1286
Sema::TemplateNameKindForDiagnostics
1287
Sema::getTemplateNameKindForDiagnostics(TemplateName Name) {
1288
auto *TD = Name.getAsTemplateDecl();
1289
if (!TD)
1290
return TemplateNameKindForDiagnostics::DependentTemplate;
1291
if (isa<ClassTemplateDecl>(TD))
1292
return TemplateNameKindForDiagnostics::ClassTemplate;
1293
if (isa<FunctionTemplateDecl>(TD))
1294
return TemplateNameKindForDiagnostics::FunctionTemplate;
1295
if (isa<VarTemplateDecl>(TD))
1296
return TemplateNameKindForDiagnostics::VarTemplate;
1297
if (isa<TypeAliasTemplateDecl>(TD))
1298
return TemplateNameKindForDiagnostics::AliasTemplate;
1299
if (isa<TemplateTemplateParmDecl>(TD))
1300
return TemplateNameKindForDiagnostics::TemplateTemplateParam;
1301
if (isa<ConceptDecl>(TD))
1302
return TemplateNameKindForDiagnostics::Concept;
1303
return TemplateNameKindForDiagnostics::DependentTemplate;
1304
}
1305
1306
void Sema::PushDeclContext(Scope *S, DeclContext *DC) {
1307
assert(DC->getLexicalParent() == CurContext &&
1308
"The next DeclContext should be lexically contained in the current one.");
1309
CurContext = DC;
1310
S->setEntity(DC);
1311
}
1312
1313
void Sema::PopDeclContext() {
1314
assert(CurContext && "DeclContext imbalance!");
1315
1316
CurContext = CurContext->getLexicalParent();
1317
assert(CurContext && "Popped translation unit!");
1318
}
1319
1320
Sema::SkippedDefinitionContext Sema::ActOnTagStartSkippedDefinition(Scope *S,
1321
Decl *D) {
1322
// Unlike PushDeclContext, the context to which we return is not necessarily
1323
// the containing DC of TD, because the new context will be some pre-existing
1324
// TagDecl definition instead of a fresh one.
1325
auto Result = static_cast<SkippedDefinitionContext>(CurContext);
1326
CurContext = cast<TagDecl>(D)->getDefinition();
1327
assert(CurContext && "skipping definition of undefined tag");
1328
// Start lookups from the parent of the current context; we don't want to look
1329
// into the pre-existing complete definition.
1330
S->setEntity(CurContext->getLookupParent());
1331
return Result;
1332
}
1333
1334
void Sema::ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context) {
1335
CurContext = static_cast<decltype(CurContext)>(Context);
1336
}
1337
1338
void Sema::EnterDeclaratorContext(Scope *S, DeclContext *DC) {
1339
// C++0x [basic.lookup.unqual]p13:
1340
// A name used in the definition of a static data member of class
1341
// X (after the qualified-id of the static member) is looked up as
1342
// if the name was used in a member function of X.
1343
// C++0x [basic.lookup.unqual]p14:
1344
// If a variable member of a namespace is defined outside of the
1345
// scope of its namespace then any name used in the definition of
1346
// the variable member (after the declarator-id) is looked up as
1347
// if the definition of the variable member occurred in its
1348
// namespace.
1349
// Both of these imply that we should push a scope whose context
1350
// is the semantic context of the declaration. We can't use
1351
// PushDeclContext here because that context is not necessarily
1352
// lexically contained in the current context. Fortunately,
1353
// the containing scope should have the appropriate information.
1354
1355
assert(!S->getEntity() && "scope already has entity");
1356
1357
#ifndef NDEBUG
1358
Scope *Ancestor = S->getParent();
1359
while (!Ancestor->getEntity()) Ancestor = Ancestor->getParent();
1360
assert(Ancestor->getEntity() == CurContext && "ancestor context mismatch");
1361
#endif
1362
1363
CurContext = DC;
1364
S->setEntity(DC);
1365
1366
if (S->getParent()->isTemplateParamScope()) {
1367
// Also set the corresponding entities for all immediately-enclosing
1368
// template parameter scopes.
1369
EnterTemplatedContext(S->getParent(), DC);
1370
}
1371
}
1372
1373
void Sema::ExitDeclaratorContext(Scope *S) {
1374
assert(S->getEntity() == CurContext && "Context imbalance!");
1375
1376
// Switch back to the lexical context. The safety of this is
1377
// enforced by an assert in EnterDeclaratorContext.
1378
Scope *Ancestor = S->getParent();
1379
while (!Ancestor->getEntity()) Ancestor = Ancestor->getParent();
1380
CurContext = Ancestor->getEntity();
1381
1382
// We don't need to do anything with the scope, which is going to
1383
// disappear.
1384
}
1385
1386
void Sema::EnterTemplatedContext(Scope *S, DeclContext *DC) {
1387
assert(S->isTemplateParamScope() &&
1388
"expected to be initializing a template parameter scope");
1389
1390
// C++20 [temp.local]p7:
1391
// In the definition of a member of a class template that appears outside
1392
// of the class template definition, the name of a member of the class
1393
// template hides the name of a template-parameter of any enclosing class
1394
// templates (but not a template-parameter of the member if the member is a
1395
// class or function template).
1396
// C++20 [temp.local]p9:
1397
// In the definition of a class template or in the definition of a member
1398
// of such a template that appears outside of the template definition, for
1399
// each non-dependent base class (13.8.2.1), if the name of the base class
1400
// or the name of a member of the base class is the same as the name of a
1401
// template-parameter, the base class name or member name hides the
1402
// template-parameter name (6.4.10).
1403
//
1404
// This means that a template parameter scope should be searched immediately
1405
// after searching the DeclContext for which it is a template parameter
1406
// scope. For example, for
1407
// template<typename T> template<typename U> template<typename V>
1408
// void N::A<T>::B<U>::f(...)
1409
// we search V then B<U> (and base classes) then U then A<T> (and base
1410
// classes) then T then N then ::.
1411
unsigned ScopeDepth = getTemplateDepth(S);
1412
for (; S && S->isTemplateParamScope(); S = S->getParent(), --ScopeDepth) {
1413
DeclContext *SearchDCAfterScope = DC;
1414
for (; DC; DC = DC->getLookupParent()) {
1415
if (const TemplateParameterList *TPL =
1416
cast<Decl>(DC)->getDescribedTemplateParams()) {
1417
unsigned DCDepth = TPL->getDepth() + 1;
1418
if (DCDepth > ScopeDepth)
1419
continue;
1420
if (ScopeDepth == DCDepth)
1421
SearchDCAfterScope = DC = DC->getLookupParent();
1422
break;
1423
}
1424
}
1425
S->setLookupEntity(SearchDCAfterScope);
1426
}
1427
}
1428
1429
void Sema::ActOnReenterFunctionContext(Scope* S, Decl *D) {
1430
// We assume that the caller has already called
1431
// ActOnReenterTemplateScope so getTemplatedDecl() works.
1432
FunctionDecl *FD = D->getAsFunction();
1433
if (!FD)
1434
return;
1435
1436
// Same implementation as PushDeclContext, but enters the context
1437
// from the lexical parent, rather than the top-level class.
1438
assert(CurContext == FD->getLexicalParent() &&
1439
"The next DeclContext should be lexically contained in the current one.");
1440
CurContext = FD;
1441
S->setEntity(CurContext);
1442
1443
for (unsigned P = 0, NumParams = FD->getNumParams(); P < NumParams; ++P) {
1444
ParmVarDecl *Param = FD->getParamDecl(P);
1445
// If the parameter has an identifier, then add it to the scope
1446
if (Param->getIdentifier()) {
1447
S->AddDecl(Param);
1448
IdResolver.AddDecl(Param);
1449
}
1450
}
1451
}
1452
1453
void Sema::ActOnExitFunctionContext() {
1454
// Same implementation as PopDeclContext, but returns to the lexical parent,
1455
// rather than the top-level class.
1456
assert(CurContext && "DeclContext imbalance!");
1457
CurContext = CurContext->getLexicalParent();
1458
assert(CurContext && "Popped translation unit!");
1459
}
1460
1461
/// Determine whether overloading is allowed for a new function
1462
/// declaration considering prior declarations of the same name.
1463
///
1464
/// This routine determines whether overloading is possible, not
1465
/// whether a new declaration actually overloads a previous one.
1466
/// It will return true in C++ (where overloads are always permitted)
1467
/// or, as a C extension, when either the new declaration or a
1468
/// previous one is declared with the 'overloadable' attribute.
1469
static bool AllowOverloadingOfFunction(const LookupResult &Previous,
1470
ASTContext &Context,
1471
const FunctionDecl *New) {
1472
if (Context.getLangOpts().CPlusPlus || New->hasAttr<OverloadableAttr>())
1473
return true;
1474
1475
// Multiversion function declarations are not overloads in the
1476
// usual sense of that term, but lookup will report that an
1477
// overload set was found if more than one multiversion function
1478
// declaration is present for the same name. It is therefore
1479
// inadequate to assume that some prior declaration(s) had
1480
// the overloadable attribute; checking is required. Since one
1481
// declaration is permitted to omit the attribute, it is necessary
1482
// to check at least two; hence the 'any_of' check below. Note that
1483
// the overloadable attribute is implicitly added to declarations
1484
// that were required to have it but did not.
1485
if (Previous.getResultKind() == LookupResult::FoundOverloaded) {
1486
return llvm::any_of(Previous, [](const NamedDecl *ND) {
1487
return ND->hasAttr<OverloadableAttr>();
1488
});
1489
} else if (Previous.getResultKind() == LookupResult::Found)
1490
return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1491
1492
return false;
1493
}
1494
1495
void Sema::PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext) {
1496
// Move up the scope chain until we find the nearest enclosing
1497
// non-transparent context. The declaration will be introduced into this
1498
// scope.
1499
while (S->getEntity() && S->getEntity()->isTransparentContext())
1500
S = S->getParent();
1501
1502
// Add scoped declarations into their context, so that they can be
1503
// found later. Declarations without a context won't be inserted
1504
// into any context.
1505
if (AddToContext)
1506
CurContext->addDecl(D);
1507
1508
// Out-of-line definitions shouldn't be pushed into scope in C++, unless they
1509
// are function-local declarations.
1510
if (getLangOpts().CPlusPlus && D->isOutOfLine() && !S->getFnParent())
1511
return;
1512
1513
// Template instantiations should also not be pushed into scope.
1514
if (isa<FunctionDecl>(D) &&
1515
cast<FunctionDecl>(D)->isFunctionTemplateSpecialization())
1516
return;
1517
1518
if (isa<UsingEnumDecl>(D) && D->getDeclName().isEmpty()) {
1519
S->AddDecl(D);
1520
return;
1521
}
1522
// If this replaces anything in the current scope,
1523
IdentifierResolver::iterator I = IdResolver.begin(D->getDeclName()),
1524
IEnd = IdResolver.end();
1525
for (; I != IEnd; ++I) {
1526
if (S->isDeclScope(*I) && D->declarationReplaces(*I)) {
1527
S->RemoveDecl(*I);
1528
IdResolver.RemoveDecl(*I);
1529
1530
// Should only need to replace one decl.
1531
break;
1532
}
1533
}
1534
1535
S->AddDecl(D);
1536
1537
if (isa<LabelDecl>(D) && !cast<LabelDecl>(D)->isGnuLocal()) {
1538
// Implicitly-generated labels may end up getting generated in an order that
1539
// isn't strictly lexical, which breaks name lookup. Be careful to insert
1540
// the label at the appropriate place in the identifier chain.
1541
for (I = IdResolver.begin(D->getDeclName()); I != IEnd; ++I) {
1542
DeclContext *IDC = (*I)->getLexicalDeclContext()->getRedeclContext();
1543
if (IDC == CurContext) {
1544
if (!S->isDeclScope(*I))
1545
continue;
1546
} else if (IDC->Encloses(CurContext))
1547
break;
1548
}
1549
1550
IdResolver.InsertDeclAfter(I, D);
1551
} else {
1552
IdResolver.AddDecl(D);
1553
}
1554
warnOnReservedIdentifier(D);
1555
}
1556
1557
bool Sema::isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S,
1558
bool AllowInlineNamespace) const {
1559
return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1560
}
1561
1562
Scope *Sema::getScopeForDeclContext(Scope *S, DeclContext *DC) {
1563
DeclContext *TargetDC = DC->getPrimaryContext();
1564
do {
1565
if (DeclContext *ScopeDC = S->getEntity())
1566
if (ScopeDC->getPrimaryContext() == TargetDC)
1567
return S;
1568
} while ((S = S->getParent()));
1569
1570
return nullptr;
1571
}
1572
1573
static bool isOutOfScopePreviousDeclaration(NamedDecl *,
1574
DeclContext*,
1575
ASTContext&);
1576
1577
void Sema::FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S,
1578
bool ConsiderLinkage,
1579
bool AllowInlineNamespace) {
1580
LookupResult::Filter F = R.makeFilter();
1581
while (F.hasNext()) {
1582
NamedDecl *D = F.next();
1583
1584
if (isDeclInScope(D, Ctx, S, AllowInlineNamespace))
1585
continue;
1586
1587
if (ConsiderLinkage && isOutOfScopePreviousDeclaration(D, Ctx, Context))
1588
continue;
1589
1590
F.erase();
1591
}
1592
1593
F.done();
1594
}
1595
1596
bool Sema::CheckRedeclarationModuleOwnership(NamedDecl *New, NamedDecl *Old) {
1597
// [module.interface]p7:
1598
// A declaration is attached to a module as follows:
1599
// - If the declaration is a non-dependent friend declaration that nominates a
1600
// function with a declarator-id that is a qualified-id or template-id or that
1601
// nominates a class other than with an elaborated-type-specifier with neither
1602
// a nested-name-specifier nor a simple-template-id, it is attached to the
1603
// module to which the friend is attached ([basic.link]).
1604
if (New->getFriendObjectKind() &&
1605
Old->getOwningModuleForLinkage() != New->getOwningModuleForLinkage()) {
1606
New->setLocalOwningModule(Old->getOwningModule());
1607
makeMergedDefinitionVisible(New);
1608
return false;
1609
}
1610
1611
Module *NewM = New->getOwningModule();
1612
Module *OldM = Old->getOwningModule();
1613
1614
if (NewM && NewM->isPrivateModule())
1615
NewM = NewM->Parent;
1616
if (OldM && OldM->isPrivateModule())
1617
OldM = OldM->Parent;
1618
1619
if (NewM == OldM)
1620
return false;
1621
1622
if (NewM && OldM) {
1623
// A module implementation unit has visibility of the decls in its
1624
// implicitly imported interface.
1625
if (NewM->isModuleImplementation() && OldM == ThePrimaryInterface)
1626
return false;
1627
1628
// Partitions are part of the module, but a partition could import another
1629
// module, so verify that the PMIs agree.
1630
if ((NewM->isModulePartition() || OldM->isModulePartition()) &&
1631
getASTContext().isInSameModule(NewM, OldM))
1632
return false;
1633
}
1634
1635
bool NewIsModuleInterface = NewM && NewM->isNamedModule();
1636
bool OldIsModuleInterface = OldM && OldM->isNamedModule();
1637
if (NewIsModuleInterface || OldIsModuleInterface) {
1638
// C++ Modules TS [basic.def.odr] 6.2/6.7 [sic]:
1639
// if a declaration of D [...] appears in the purview of a module, all
1640
// other such declarations shall appear in the purview of the same module
1641
Diag(New->getLocation(), diag::err_mismatched_owning_module)
1642
<< New
1643
<< NewIsModuleInterface
1644
<< (NewIsModuleInterface ? NewM->getFullModuleName() : "")
1645
<< OldIsModuleInterface
1646
<< (OldIsModuleInterface ? OldM->getFullModuleName() : "");
1647
Diag(Old->getLocation(), diag::note_previous_declaration);
1648
New->setInvalidDecl();
1649
return true;
1650
}
1651
1652
return false;
1653
}
1654
1655
bool Sema::CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old) {
1656
// [module.interface]p1:
1657
// An export-declaration shall inhabit a namespace scope.
1658
//
1659
// So it is meaningless to talk about redeclaration which is not at namespace
1660
// scope.
1661
if (!New->getLexicalDeclContext()
1662
->getNonTransparentContext()
1663
->isFileContext() ||
1664
!Old->getLexicalDeclContext()
1665
->getNonTransparentContext()
1666
->isFileContext())
1667
return false;
1668
1669
bool IsNewExported = New->isInExportDeclContext();
1670
bool IsOldExported = Old->isInExportDeclContext();
1671
1672
// It should be irrevelant if both of them are not exported.
1673
if (!IsNewExported && !IsOldExported)
1674
return false;
1675
1676
if (IsOldExported)
1677
return false;
1678
1679
// If the Old declaration are not attached to named modules
1680
// and the New declaration are attached to global module.
1681
// It should be fine to allow the export since it doesn't change
1682
// the linkage of declarations. See
1683
// https://github.com/llvm/llvm-project/issues/98583 for details.
1684
if (!Old->isInNamedModule() && New->getOwningModule() &&
1685
New->getOwningModule()->isImplicitGlobalModule())
1686
return false;
1687
1688
assert(IsNewExported);
1689
1690
auto Lk = Old->getFormalLinkage();
1691
int S = 0;
1692
if (Lk == Linkage::Internal)
1693
S = 1;
1694
else if (Lk == Linkage::Module)
1695
S = 2;
1696
Diag(New->getLocation(), diag::err_redeclaration_non_exported) << New << S;
1697
Diag(Old->getLocation(), diag::note_previous_declaration);
1698
return true;
1699
}
1700
1701
bool Sema::CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old) {
1702
if (CheckRedeclarationModuleOwnership(New, Old))
1703
return true;
1704
1705
if (CheckRedeclarationExported(New, Old))
1706
return true;
1707
1708
return false;
1709
}
1710
1711
bool Sema::IsRedefinitionInModule(const NamedDecl *New,
1712
const NamedDecl *Old) const {
1713
assert(getASTContext().isSameEntity(New, Old) &&
1714
"New and Old are not the same definition, we should diagnostic it "
1715
"immediately instead of checking it.");
1716
assert(const_cast<Sema *>(this)->isReachable(New) &&
1717
const_cast<Sema *>(this)->isReachable(Old) &&
1718
"We shouldn't see unreachable definitions here.");
1719
1720
Module *NewM = New->getOwningModule();
1721
Module *OldM = Old->getOwningModule();
1722
1723
// We only checks for named modules here. The header like modules is skipped.
1724
// FIXME: This is not right if we import the header like modules in the module
1725
// purview.
1726
//
1727
// For example, assuming "header.h" provides definition for `D`.
1728
// ```C++
1729
// //--- M.cppm
1730
// export module M;
1731
// import "header.h"; // or #include "header.h" but import it by clang modules
1732
// actually.
1733
//
1734
// //--- Use.cpp
1735
// import M;
1736
// import "header.h"; // or uses clang modules.
1737
// ```
1738
//
1739
// In this case, `D` has multiple definitions in multiple TU (M.cppm and
1740
// Use.cpp) and `D` is attached to a named module `M`. The compiler should
1741
// reject it. But the current implementation couldn't detect the case since we
1742
// don't record the information about the importee modules.
1743
//
1744
// But this might not be painful in practice. Since the design of C++20 Named
1745
// Modules suggests us to use headers in global module fragment instead of
1746
// module purview.
1747
if (NewM && NewM->isHeaderLikeModule())
1748
NewM = nullptr;
1749
if (OldM && OldM->isHeaderLikeModule())
1750
OldM = nullptr;
1751
1752
if (!NewM && !OldM)
1753
return true;
1754
1755
// [basic.def.odr]p14.3
1756
// Each such definition shall not be attached to a named module
1757
// ([module.unit]).
1758
if ((NewM && NewM->isNamedModule()) || (OldM && OldM->isNamedModule()))
1759
return true;
1760
1761
// Then New and Old lives in the same TU if their share one same module unit.
1762
if (NewM)
1763
NewM = NewM->getTopLevelModule();
1764
if (OldM)
1765
OldM = OldM->getTopLevelModule();
1766
return OldM == NewM;
1767
}
1768
1769
static bool isUsingDeclNotAtClassScope(NamedDecl *D) {
1770
if (D->getDeclContext()->isFileContext())
1771
return false;
1772
1773
return isa<UsingShadowDecl>(D) ||
1774
isa<UnresolvedUsingTypenameDecl>(D) ||
1775
isa<UnresolvedUsingValueDecl>(D);
1776
}
1777
1778
/// Removes using shadow declarations not at class scope from the lookup
1779
/// results.
1780
static void RemoveUsingDecls(LookupResult &R) {
1781
LookupResult::Filter F = R.makeFilter();
1782
while (F.hasNext())
1783
if (isUsingDeclNotAtClassScope(F.next()))
1784
F.erase();
1785
1786
F.done();
1787
}
1788
1789
/// Check for this common pattern:
1790
/// @code
1791
/// class S {
1792
/// S(const S&); // DO NOT IMPLEMENT
1793
/// void operator=(const S&); // DO NOT IMPLEMENT
1794
/// };
1795
/// @endcode
1796
static bool IsDisallowedCopyOrAssign(const CXXMethodDecl *D) {
1797
// FIXME: Should check for private access too but access is set after we get
1798
// the decl here.
1799
if (D->doesThisDeclarationHaveABody())
1800
return false;
1801
1802
if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D))
1803
return CD->isCopyConstructor();
1804
return D->isCopyAssignmentOperator();
1805
}
1806
1807
bool Sema::mightHaveNonExternalLinkage(const DeclaratorDecl *D) {
1808
const DeclContext *DC = D->getDeclContext();
1809
while (!DC->isTranslationUnit()) {
1810
if (const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1811
if (!RD->hasNameForLinkage())
1812
return true;
1813
}
1814
DC = DC->getParent();
1815
}
1816
1817
return !D->isExternallyVisible();
1818
}
1819
1820
// FIXME: This needs to be refactored; some other isInMainFile users want
1821
// these semantics.
1822
static bool isMainFileLoc(const Sema &S, SourceLocation Loc) {
1823
if (S.TUKind != TU_Complete || S.getLangOpts().IsHeaderFile)
1824
return false;
1825
return S.SourceMgr.isInMainFile(Loc);
1826
}
1827
1828
bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
1829
assert(D);
1830
1831
if (D->isInvalidDecl() || D->isUsed() || D->hasAttr<UnusedAttr>())
1832
return false;
1833
1834
// Ignore all entities declared within templates, and out-of-line definitions
1835
// of members of class templates.
1836
if (D->getDeclContext()->isDependentContext() ||
1837
D->getLexicalDeclContext()->isDependentContext())
1838
return false;
1839
1840
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1841
if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
1842
return false;
1843
// A non-out-of-line declaration of a member specialization was implicitly
1844
// instantiated; it's the out-of-line declaration that we're interested in.
1845
if (FD->getTemplateSpecializationKind() == TSK_ExplicitSpecialization &&
1846
FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1847
return false;
1848
1849
if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1850
if (MD->isVirtual() || IsDisallowedCopyOrAssign(MD))
1851
return false;
1852
} else {
1853
// 'static inline' functions are defined in headers; don't warn.
1854
if (FD->isInlined() && !isMainFileLoc(*this, FD->getLocation()))
1855
return false;
1856
}
1857
1858
if (FD->doesThisDeclarationHaveABody() &&
1859
Context.DeclMustBeEmitted(FD))
1860
return false;
1861
} else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1862
// Constants and utility variables are defined in headers with internal
1863
// linkage; don't warn. (Unlike functions, there isn't a convenient marker
1864
// like "inline".)
1865
if (!isMainFileLoc(*this, VD->getLocation()))
1866
return false;
1867
1868
if (Context.DeclMustBeEmitted(VD))
1869
return false;
1870
1871
if (VD->isStaticDataMember() &&
1872
VD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
1873
return false;
1874
if (VD->isStaticDataMember() &&
1875
VD->getTemplateSpecializationKind() == TSK_ExplicitSpecialization &&
1876
VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1877
return false;
1878
1879
if (VD->isInline() && !isMainFileLoc(*this, VD->getLocation()))
1880
return false;
1881
} else {
1882
return false;
1883
}
1884
1885
// Only warn for unused decls internal to the translation unit.
1886
// FIXME: This seems like a bogus check; it suppresses -Wunused-function
1887
// for inline functions defined in the main source file, for instance.
1888
return mightHaveNonExternalLinkage(D);
1889
}
1890
1891
void Sema::MarkUnusedFileScopedDecl(const DeclaratorDecl *D) {
1892
if (!D)
1893
return;
1894
1895
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1896
const FunctionDecl *First = FD->getFirstDecl();
1897
if (FD != First && ShouldWarnIfUnusedFileScopedDecl(First))
1898
return; // First should already be in the vector.
1899
}
1900
1901
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1902
const VarDecl *First = VD->getFirstDecl();
1903
if (VD != First && ShouldWarnIfUnusedFileScopedDecl(First))
1904
return; // First should already be in the vector.
1905
}
1906
1907
if (ShouldWarnIfUnusedFileScopedDecl(D))
1908
UnusedFileScopedDecls.push_back(D);
1909
}
1910
1911
static bool ShouldDiagnoseUnusedDecl(const LangOptions &LangOpts,
1912
const NamedDecl *D) {
1913
if (D->isInvalidDecl())
1914
return false;
1915
1916
if (const auto *DD = dyn_cast<DecompositionDecl>(D)) {
1917
// For a decomposition declaration, warn if none of the bindings are
1918
// referenced, instead of if the variable itself is referenced (which
1919
// it is, by the bindings' expressions).
1920
bool IsAllPlaceholders = true;
1921
for (const auto *BD : DD->bindings()) {
1922
if (BD->isReferenced() || BD->hasAttr<UnusedAttr>())
1923
return false;
1924
IsAllPlaceholders = IsAllPlaceholders && BD->isPlaceholderVar(LangOpts);
1925
}
1926
if (IsAllPlaceholders)
1927
return false;
1928
} else if (!D->getDeclName()) {
1929
return false;
1930
} else if (D->isReferenced() || D->isUsed()) {
1931
return false;
1932
}
1933
1934
if (D->isPlaceholderVar(LangOpts))
1935
return false;
1936
1937
if (D->hasAttr<UnusedAttr>() || D->hasAttr<ObjCPreciseLifetimeAttr>() ||
1938
D->hasAttr<CleanupAttr>())
1939
return false;
1940
1941
if (isa<LabelDecl>(D))
1942
return true;
1943
1944
// Except for labels, we only care about unused decls that are local to
1945
// functions.
1946
bool WithinFunction = D->getDeclContext()->isFunctionOrMethod();
1947
if (const auto *R = dyn_cast<CXXRecordDecl>(D->getDeclContext()))
1948
// For dependent types, the diagnostic is deferred.
1949
WithinFunction =
1950
WithinFunction || (R->isLocalClass() && !R->isDependentType());
1951
if (!WithinFunction)
1952
return false;
1953
1954
if (isa<TypedefNameDecl>(D))
1955
return true;
1956
1957
// White-list anything that isn't a local variable.
1958
if (!isa<VarDecl>(D) || isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D))
1959
return false;
1960
1961
// Types of valid local variables should be complete, so this should succeed.
1962
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1963
1964
const Expr *Init = VD->getInit();
1965
if (const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(Init))
1966
Init = Cleanups->getSubExpr();
1967
1968
const auto *Ty = VD->getType().getTypePtr();
1969
1970
// Only look at the outermost level of typedef.
1971
if (const TypedefType *TT = Ty->getAs<TypedefType>()) {
1972
// Allow anything marked with __attribute__((unused)).
1973
if (TT->getDecl()->hasAttr<UnusedAttr>())
1974
return false;
1975
}
1976
1977
// Warn for reference variables whose initializtion performs lifetime
1978
// extension.
1979
if (const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(Init);
1980
MTE && MTE->getExtendingDecl()) {
1981
Ty = VD->getType().getNonReferenceType().getTypePtr();
1982
Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
1983
}
1984
1985
// If we failed to complete the type for some reason, or if the type is
1986
// dependent, don't diagnose the variable.
1987
if (Ty->isIncompleteType() || Ty->isDependentType())
1988
return false;
1989
1990
// Look at the element type to ensure that the warning behaviour is
1991
// consistent for both scalars and arrays.
1992
Ty = Ty->getBaseElementTypeUnsafe();
1993
1994
if (const TagType *TT = Ty->getAs<TagType>()) {
1995
const TagDecl *Tag = TT->getDecl();
1996
if (Tag->hasAttr<UnusedAttr>())
1997
return false;
1998
1999
if (const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2000
if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2001
return false;
2002
2003
if (Init) {
2004
const auto *Construct =
2005
dyn_cast<CXXConstructExpr>(Init->IgnoreImpCasts());
2006
if (Construct && !Construct->isElidable()) {
2007
const CXXConstructorDecl *CD = Construct->getConstructor();
2008
if (!CD->isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2009
(VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2010
return false;
2011
}
2012
2013
// Suppress the warning if we don't know how this is constructed, and
2014
// it could possibly be non-trivial constructor.
2015
if (Init->isTypeDependent()) {
2016
for (const CXXConstructorDecl *Ctor : RD->ctors())
2017
if (!Ctor->isTrivial())
2018
return false;
2019
}
2020
2021
// Suppress the warning if the constructor is unresolved because
2022
// its arguments are dependent.
2023
if (isa<CXXUnresolvedConstructExpr>(Init))
2024
return false;
2025
}
2026
}
2027
}
2028
2029
// TODO: __attribute__((unused)) templates?
2030
}
2031
2032
return true;
2033
}
2034
2035
static void GenerateFixForUnusedDecl(const NamedDecl *D, ASTContext &Ctx,
2036
FixItHint &Hint) {
2037
if (isa<LabelDecl>(D)) {
2038
SourceLocation AfterColon = Lexer::findLocationAfterToken(
2039
D->getEndLoc(), tok::colon, Ctx.getSourceManager(), Ctx.getLangOpts(),
2040
/*SkipTrailingWhitespaceAndNewline=*/false);
2041
if (AfterColon.isInvalid())
2042
return;
2043
Hint = FixItHint::CreateRemoval(
2044
CharSourceRange::getCharRange(D->getBeginLoc(), AfterColon));
2045
}
2046
}
2047
2048
void Sema::DiagnoseUnusedNestedTypedefs(const RecordDecl *D) {
2049
DiagnoseUnusedNestedTypedefs(
2050
D, [this](SourceLocation Loc, PartialDiagnostic PD) { Diag(Loc, PD); });
2051
}
2052
2053
void Sema::DiagnoseUnusedNestedTypedefs(const RecordDecl *D,
2054
DiagReceiverTy DiagReceiver) {
2055
if (D->getTypeForDecl()->isDependentType())
2056
return;
2057
2058
for (auto *TmpD : D->decls()) {
2059
if (const auto *T = dyn_cast<TypedefNameDecl>(TmpD))
2060
DiagnoseUnusedDecl(T, DiagReceiver);
2061
else if(const auto *R = dyn_cast<RecordDecl>(TmpD))
2062
DiagnoseUnusedNestedTypedefs(R, DiagReceiver);
2063
}
2064
}
2065
2066
void Sema::DiagnoseUnusedDecl(const NamedDecl *D) {
2067
DiagnoseUnusedDecl(
2068
D, [this](SourceLocation Loc, PartialDiagnostic PD) { Diag(Loc, PD); });
2069
}
2070
2071
void Sema::DiagnoseUnusedDecl(const NamedDecl *D, DiagReceiverTy DiagReceiver) {
2072
if (!ShouldDiagnoseUnusedDecl(getLangOpts(), D))
2073
return;
2074
2075
if (auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2076
// typedefs can be referenced later on, so the diagnostics are emitted
2077
// at end-of-translation-unit.
2078
UnusedLocalTypedefNameCandidates.insert(TD);
2079
return;
2080
}
2081
2082
FixItHint Hint;
2083
GenerateFixForUnusedDecl(D, Context, Hint);
2084
2085
unsigned DiagID;
2086
if (isa<VarDecl>(D) && cast<VarDecl>(D)->isExceptionVariable())
2087
DiagID = diag::warn_unused_exception_param;
2088
else if (isa<LabelDecl>(D))
2089
DiagID = diag::warn_unused_label;
2090
else
2091
DiagID = diag::warn_unused_variable;
2092
2093
SourceLocation DiagLoc = D->getLocation();
2094
DiagReceiver(DiagLoc, PDiag(DiagID) << D << Hint << SourceRange(DiagLoc));
2095
}
2096
2097
void Sema::DiagnoseUnusedButSetDecl(const VarDecl *VD,
2098
DiagReceiverTy DiagReceiver) {
2099
// If it's not referenced, it can't be set. If it has the Cleanup attribute,
2100
// it's not really unused.
2101
if (!VD->isReferenced() || !VD->getDeclName() || VD->hasAttr<CleanupAttr>())
2102
return;
2103
2104
// In C++, `_` variables behave as if they were maybe_unused
2105
if (VD->hasAttr<UnusedAttr>() || VD->isPlaceholderVar(getLangOpts()))
2106
return;
2107
2108
const auto *Ty = VD->getType().getTypePtr()->getBaseElementTypeUnsafe();
2109
2110
if (Ty->isReferenceType() || Ty->isDependentType())
2111
return;
2112
2113
if (const TagType *TT = Ty->getAs<TagType>()) {
2114
const TagDecl *Tag = TT->getDecl();
2115
if (Tag->hasAttr<UnusedAttr>())
2116
return;
2117
// In C++, don't warn for record types that don't have WarnUnusedAttr, to
2118
// mimic gcc's behavior.
2119
if (const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2120
RD && !RD->hasAttr<WarnUnusedAttr>())
2121
return;
2122
}
2123
2124
// Don't warn about __block Objective-C pointer variables, as they might
2125
// be assigned in the block but not used elsewhere for the purpose of lifetime
2126
// extension.
2127
if (VD->hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2128
return;
2129
2130
// Don't warn about Objective-C pointer variables with precise lifetime
2131
// semantics; they can be used to ensure ARC releases the object at a known
2132
// time, which may mean assignment but no other references.
2133
if (VD->hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2134
return;
2135
2136
auto iter = RefsMinusAssignments.find(VD);
2137
if (iter == RefsMinusAssignments.end())
2138
return;
2139
2140
assert(iter->getSecond() >= 0 &&
2141
"Found a negative number of references to a VarDecl");
2142
if (int RefCnt = iter->getSecond(); RefCnt > 0) {
2143
// Assume the given VarDecl is "used" if its ref count stored in
2144
// `RefMinusAssignments` is positive, with one exception.
2145
//
2146
// For a C++ variable whose decl (with initializer) entirely consist the
2147
// condition expression of a if/while/for construct,
2148
// Clang creates a DeclRefExpr for the condition expression rather than a
2149
// BinaryOperator of AssignmentOp. Thus, the C++ variable's ref
2150
// count stored in `RefMinusAssignment` equals 1 when the variable is never
2151
// used in the body of the if/while/for construct.
2152
bool UnusedCXXCondDecl = VD->isCXXCondDecl() && (RefCnt == 1);
2153
if (!UnusedCXXCondDecl)
2154
return;
2155
}
2156
2157
unsigned DiagID = isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter
2158
: diag::warn_unused_but_set_variable;
2159
DiagReceiver(VD->getLocation(), PDiag(DiagID) << VD);
2160
}
2161
2162
static void CheckPoppedLabel(LabelDecl *L, Sema &S,
2163
Sema::DiagReceiverTy DiagReceiver) {
2164
// Verify that we have no forward references left. If so, there was a goto
2165
// or address of a label taken, but no definition of it. Label fwd
2166
// definitions are indicated with a null substmt which is also not a resolved
2167
// MS inline assembly label name.
2168
bool Diagnose = false;
2169
if (L->isMSAsmLabel())
2170
Diagnose = !L->isResolvedMSAsmLabel();
2171
else
2172
Diagnose = L->getStmt() == nullptr;
2173
if (Diagnose)
2174
DiagReceiver(L->getLocation(), S.PDiag(diag::err_undeclared_label_use)
2175
<< L);
2176
}
2177
2178
void Sema::ActOnPopScope(SourceLocation Loc, Scope *S) {
2179
S->applyNRVO();
2180
2181
if (S->decl_empty()) return;
2182
assert((S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope)) &&
2183
"Scope shouldn't contain decls!");
2184
2185
/// We visit the decls in non-deterministic order, but we want diagnostics
2186
/// emitted in deterministic order. Collect any diagnostic that may be emitted
2187
/// and sort the diagnostics before emitting them, after we visited all decls.
2188
struct LocAndDiag {
2189
SourceLocation Loc;
2190
std::optional<SourceLocation> PreviousDeclLoc;
2191
PartialDiagnostic PD;
2192
};
2193
SmallVector<LocAndDiag, 16> DeclDiags;
2194
auto addDiag = [&DeclDiags](SourceLocation Loc, PartialDiagnostic PD) {
2195
DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2196
};
2197
auto addDiagWithPrev = [&DeclDiags](SourceLocation Loc,
2198
SourceLocation PreviousDeclLoc,
2199
PartialDiagnostic PD) {
2200
DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2201
};
2202
2203
for (auto *TmpD : S->decls()) {
2204
assert(TmpD && "This decl didn't get pushed??");
2205
2206
assert(isa<NamedDecl>(TmpD) && "Decl isn't NamedDecl?");
2207
NamedDecl *D = cast<NamedDecl>(TmpD);
2208
2209
// Diagnose unused variables in this scope.
2210
if (!S->hasUnrecoverableErrorOccurred()) {
2211
DiagnoseUnusedDecl(D, addDiag);
2212
if (const auto *RD = dyn_cast<RecordDecl>(D))
2213
DiagnoseUnusedNestedTypedefs(RD, addDiag);
2214
if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
2215
DiagnoseUnusedButSetDecl(VD, addDiag);
2216
RefsMinusAssignments.erase(VD);
2217
}
2218
}
2219
2220
if (!D->getDeclName()) continue;
2221
2222
// If this was a forward reference to a label, verify it was defined.
2223
if (LabelDecl *LD = dyn_cast<LabelDecl>(D))
2224
CheckPoppedLabel(LD, *this, addDiag);
2225
2226
// Partial translation units that are created in incremental processing must
2227
// not clean up the IdResolver because PTUs should take into account the
2228
// declarations that came from previous PTUs.
2229
if (!PP.isIncrementalProcessingEnabled() || getLangOpts().ObjC ||
2230
getLangOpts().CPlusPlus)
2231
IdResolver.RemoveDecl(D);
2232
2233
// Warn on it if we are shadowing a declaration.
2234
auto ShadowI = ShadowingDecls.find(D);
2235
if (ShadowI != ShadowingDecls.end()) {
2236
if (const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2237
addDiagWithPrev(D->getLocation(), FD->getLocation(),
2238
PDiag(diag::warn_ctor_parm_shadows_field)
2239
<< D << FD << FD->getParent());
2240
}
2241
ShadowingDecls.erase(ShadowI);
2242
}
2243
}
2244
2245
llvm::sort(DeclDiags,
2246
[](const LocAndDiag &LHS, const LocAndDiag &RHS) -> bool {
2247
// The particular order for diagnostics is not important, as long
2248
// as the order is deterministic. Using the raw location is going
2249
// to generally be in source order unless there are macro
2250
// expansions involved.
2251
return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2252
});
2253
for (const LocAndDiag &D : DeclDiags) {
2254
Diag(D.Loc, D.PD);
2255
if (D.PreviousDeclLoc)
2256
Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2257
}
2258
}
2259
2260
Scope *Sema::getNonFieldDeclScope(Scope *S) {
2261
while (((S->getFlags() & Scope::DeclScope) == 0) ||
2262
(S->getEntity() && S->getEntity()->isTransparentContext()) ||
2263
(S->isClassScope() && !getLangOpts().CPlusPlus))
2264
S = S->getParent();
2265
return S;
2266
}
2267
2268
static StringRef getHeaderName(Builtin::Context &BuiltinInfo, unsigned ID,
2269
ASTContext::GetBuiltinTypeError Error) {
2270
switch (Error) {
2271
case ASTContext::GE_None:
2272
return "";
2273
case ASTContext::GE_Missing_type:
2274
return BuiltinInfo.getHeaderName(ID);
2275
case ASTContext::GE_Missing_stdio:
2276
return "stdio.h";
2277
case ASTContext::GE_Missing_setjmp:
2278
return "setjmp.h";
2279
case ASTContext::GE_Missing_ucontext:
2280
return "ucontext.h";
2281
}
2282
llvm_unreachable("unhandled error kind");
2283
}
2284
2285
FunctionDecl *Sema::CreateBuiltin(IdentifierInfo *II, QualType Type,
2286
unsigned ID, SourceLocation Loc) {
2287
DeclContext *Parent = Context.getTranslationUnitDecl();
2288
2289
if (getLangOpts().CPlusPlus) {
2290
LinkageSpecDecl *CLinkageDecl = LinkageSpecDecl::Create(
2291
Context, Parent, Loc, Loc, LinkageSpecLanguageIDs::C, false);
2292
CLinkageDecl->setImplicit();
2293
Parent->addDecl(CLinkageDecl);
2294
Parent = CLinkageDecl;
2295
}
2296
2297
ConstexprSpecKind ConstexprKind = ConstexprSpecKind::Unspecified;
2298
if (Context.BuiltinInfo.isImmediate(ID)) {
2299
assert(getLangOpts().CPlusPlus20 &&
2300
"consteval builtins should only be available in C++20 mode");
2301
ConstexprKind = ConstexprSpecKind::Consteval;
2302
}
2303
2304
FunctionDecl *New = FunctionDecl::Create(
2305
Context, Parent, Loc, Loc, II, Type, /*TInfo=*/nullptr, SC_Extern,
2306
getCurFPFeatures().isFPConstrained(), /*isInlineSpecified=*/false,
2307
Type->isFunctionProtoType(), ConstexprKind);
2308
New->setImplicit();
2309
New->addAttr(BuiltinAttr::CreateImplicit(Context, ID));
2310
2311
// Create Decl objects for each parameter, adding them to the
2312
// FunctionDecl.
2313
if (const FunctionProtoType *FT = dyn_cast<FunctionProtoType>(Type)) {
2314
SmallVector<ParmVarDecl *, 16> Params;
2315
for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2316
ParmVarDecl *parm = ParmVarDecl::Create(
2317
Context, New, SourceLocation(), SourceLocation(), nullptr,
2318
FT->getParamType(i), /*TInfo=*/nullptr, SC_None, nullptr);
2319
parm->setScopeInfo(0, i);
2320
Params.push_back(parm);
2321
}
2322
New->setParams(Params);
2323
}
2324
2325
AddKnownFunctionAttributes(New);
2326
return New;
2327
}
2328
2329
NamedDecl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID,
2330
Scope *S, bool ForRedeclaration,
2331
SourceLocation Loc) {
2332
LookupNecessaryTypesForBuiltin(S, ID);
2333
2334
ASTContext::GetBuiltinTypeError Error;
2335
QualType R = Context.GetBuiltinType(ID, Error);
2336
if (Error) {
2337
if (!ForRedeclaration)
2338
return nullptr;
2339
2340
// If we have a builtin without an associated type we should not emit a
2341
// warning when we were not able to find a type for it.
2342
if (Error == ASTContext::GE_Missing_type ||
2343
Context.BuiltinInfo.allowTypeMismatch(ID))
2344
return nullptr;
2345
2346
// If we could not find a type for setjmp it is because the jmp_buf type was
2347
// not defined prior to the setjmp declaration.
2348
if (Error == ASTContext::GE_Missing_setjmp) {
2349
Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2350
<< Context.BuiltinInfo.getName(ID);
2351
return nullptr;
2352
}
2353
2354
// Generally, we emit a warning that the declaration requires the
2355
// appropriate header.
2356
Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2357
<< getHeaderName(Context.BuiltinInfo, ID, Error)
2358
<< Context.BuiltinInfo.getName(ID);
2359
return nullptr;
2360
}
2361
2362
if (!ForRedeclaration &&
2363
(Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2364
Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2365
Diag(Loc, LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2366
: diag::ext_implicit_lib_function_decl)
2367
<< Context.BuiltinInfo.getName(ID) << R;
2368
if (const char *Header = Context.BuiltinInfo.getHeaderName(ID))
2369
Diag(Loc, diag::note_include_header_or_declare)
2370
<< Header << Context.BuiltinInfo.getName(ID);
2371
}
2372
2373
if (R.isNull())
2374
return nullptr;
2375
2376
FunctionDecl *New = CreateBuiltin(II, R, ID, Loc);
2377
RegisterLocallyScopedExternCDecl(New, S);
2378
2379
// TUScope is the translation-unit scope to insert this function into.
2380
// FIXME: This is hideous. We need to teach PushOnScopeChains to
2381
// relate Scopes to DeclContexts, and probably eliminate CurContext
2382
// entirely, but we're not there yet.
2383
DeclContext *SavedContext = CurContext;
2384
CurContext = New->getDeclContext();
2385
PushOnScopeChains(New, TUScope);
2386
CurContext = SavedContext;
2387
return New;
2388
}
2389
2390
/// Typedef declarations don't have linkage, but they still denote the same
2391
/// entity if their types are the same.
2392
/// FIXME: This is notionally doing the same thing as ASTReaderDecl's
2393
/// isSameEntity.
2394
static void
2395
filterNonConflictingPreviousTypedefDecls(Sema &S, const TypedefNameDecl *Decl,
2396
LookupResult &Previous) {
2397
// This is only interesting when modules are enabled.
2398
if (!S.getLangOpts().Modules && !S.getLangOpts().ModulesLocalVisibility)
2399
return;
2400
2401
// Empty sets are uninteresting.
2402
if (Previous.empty())
2403
return;
2404
2405
LookupResult::Filter Filter = Previous.makeFilter();
2406
while (Filter.hasNext()) {
2407
NamedDecl *Old = Filter.next();
2408
2409
// Non-hidden declarations are never ignored.
2410
if (S.isVisible(Old))
2411
continue;
2412
2413
// Declarations of the same entity are not ignored, even if they have
2414
// different linkages.
2415
if (auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2416
if (S.Context.hasSameType(OldTD->getUnderlyingType(),
2417
Decl->getUnderlyingType()))
2418
continue;
2419
2420
// If both declarations give a tag declaration a typedef name for linkage
2421
// purposes, then they declare the same entity.
2422
if (OldTD->getAnonDeclWithTypedefName(/*AnyRedecl*/true) &&
2423
Decl->getAnonDeclWithTypedefName())
2424
continue;
2425
}
2426
2427
Filter.erase();
2428
}
2429
2430
Filter.done();
2431
}
2432
2433
bool Sema::isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New) {
2434
QualType OldType;
2435
if (const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2436
OldType = OldTypedef->getUnderlyingType();
2437
else
2438
OldType = Context.getTypeDeclType(Old);
2439
QualType NewType = New->getUnderlyingType();
2440
2441
if (NewType->isVariablyModifiedType()) {
2442
// Must not redefine a typedef with a variably-modified type.
2443
int Kind = isa<TypeAliasDecl>(Old) ? 1 : 0;
2444
Diag(New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2445
<< Kind << NewType;
2446
if (Old->getLocation().isValid())
2447
notePreviousDefinition(Old, New->getLocation());
2448
New->setInvalidDecl();
2449
return true;
2450
}
2451
2452
if (OldType != NewType &&
2453
!OldType->isDependentType() &&
2454
!NewType->isDependentType() &&
2455
!Context.hasSameType(OldType, NewType)) {
2456
int Kind = isa<TypeAliasDecl>(Old) ? 1 : 0;
2457
Diag(New->getLocation(), diag::err_redefinition_different_typedef)
2458
<< Kind << NewType << OldType;
2459
if (Old->getLocation().isValid())
2460
notePreviousDefinition(Old, New->getLocation());
2461
New->setInvalidDecl();
2462
return true;
2463
}
2464
return false;
2465
}
2466
2467
void Sema::MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New,
2468
LookupResult &OldDecls) {
2469
// If the new decl is known invalid already, don't bother doing any
2470
// merging checks.
2471
if (New->isInvalidDecl()) return;
2472
2473
// Allow multiple definitions for ObjC built-in typedefs.
2474
// FIXME: Verify the underlying types are equivalent!
2475
if (getLangOpts().ObjC) {
2476
const IdentifierInfo *TypeID = New->getIdentifier();
2477
switch (TypeID->getLength()) {
2478
default: break;
2479
case 2:
2480
{
2481
if (!TypeID->isStr("id"))
2482
break;
2483
QualType T = New->getUnderlyingType();
2484
if (!T->isPointerType())
2485
break;
2486
if (!T->isVoidPointerType()) {
2487
QualType PT = T->castAs<PointerType>()->getPointeeType();
2488
if (!PT->isStructureType())
2489
break;
2490
}
2491
Context.setObjCIdRedefinitionType(T);
2492
// Install the built-in type for 'id', ignoring the current definition.
2493
New->setTypeForDecl(Context.getObjCIdType().getTypePtr());
2494
return;
2495
}
2496
case 5:
2497
if (!TypeID->isStr("Class"))
2498
break;
2499
Context.setObjCClassRedefinitionType(New->getUnderlyingType());
2500
// Install the built-in type for 'Class', ignoring the current definition.
2501
New->setTypeForDecl(Context.getObjCClassType().getTypePtr());
2502
return;
2503
case 3:
2504
if (!TypeID->isStr("SEL"))
2505
break;
2506
Context.setObjCSelRedefinitionType(New->getUnderlyingType());
2507
// Install the built-in type for 'SEL', ignoring the current definition.
2508
New->setTypeForDecl(Context.getObjCSelType().getTypePtr());
2509
return;
2510
}
2511
// Fall through - the typedef name was not a builtin type.
2512
}
2513
2514
// Verify the old decl was also a type.
2515
TypeDecl *Old = OldDecls.getAsSingle<TypeDecl>();
2516
if (!Old) {
2517
Diag(New->getLocation(), diag::err_redefinition_different_kind)
2518
<< New->getDeclName();
2519
2520
NamedDecl *OldD = OldDecls.getRepresentativeDecl();
2521
if (OldD->getLocation().isValid())
2522
notePreviousDefinition(OldD, New->getLocation());
2523
2524
return New->setInvalidDecl();
2525
}
2526
2527
// If the old declaration is invalid, just give up here.
2528
if (Old->isInvalidDecl())
2529
return New->setInvalidDecl();
2530
2531
if (auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2532
auto *OldTag = OldTD->getAnonDeclWithTypedefName(/*AnyRedecl*/true);
2533
auto *NewTag = New->getAnonDeclWithTypedefName();
2534
NamedDecl *Hidden = nullptr;
2535
if (OldTag && NewTag &&
2536
OldTag->getCanonicalDecl() != NewTag->getCanonicalDecl() &&
2537
!hasVisibleDefinition(OldTag, &Hidden)) {
2538
// There is a definition of this tag, but it is not visible. Use it
2539
// instead of our tag.
2540
New->setTypeForDecl(OldTD->getTypeForDecl());
2541
if (OldTD->isModed())
2542
New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2543
OldTD->getUnderlyingType());
2544
else
2545
New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2546
2547
// Make the old tag definition visible.
2548
makeMergedDefinitionVisible(Hidden);
2549
2550
// If this was an unscoped enumeration, yank all of its enumerators
2551
// out of the scope.
2552
if (isa<EnumDecl>(NewTag)) {
2553
Scope *EnumScope = getNonFieldDeclScope(S);
2554
for (auto *D : NewTag->decls()) {
2555
auto *ED = cast<EnumConstantDecl>(D);
2556
assert(EnumScope->isDeclScope(ED));
2557
EnumScope->RemoveDecl(ED);
2558
IdResolver.RemoveDecl(ED);
2559
ED->getLexicalDeclContext()->removeDecl(ED);
2560
}
2561
}
2562
}
2563
}
2564
2565
// If the typedef types are not identical, reject them in all languages and
2566
// with any extensions enabled.
2567
if (isIncompatibleTypedef(Old, New))
2568
return;
2569
2570
// The types match. Link up the redeclaration chain and merge attributes if
2571
// the old declaration was a typedef.
2572
if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Old)) {
2573
New->setPreviousDecl(Typedef);
2574
mergeDeclAttributes(New, Old);
2575
}
2576
2577
if (getLangOpts().MicrosoftExt)
2578
return;
2579
2580
if (getLangOpts().CPlusPlus) {
2581
// C++ [dcl.typedef]p2:
2582
// In a given non-class scope, a typedef specifier can be used to
2583
// redefine the name of any type declared in that scope to refer
2584
// to the type to which it already refers.
2585
if (!isa<CXXRecordDecl>(CurContext))
2586
return;
2587
2588
// C++0x [dcl.typedef]p4:
2589
// In a given class scope, a typedef specifier can be used to redefine
2590
// any class-name declared in that scope that is not also a typedef-name
2591
// to refer to the type to which it already refers.
2592
//
2593
// This wording came in via DR424, which was a correction to the
2594
// wording in DR56, which accidentally banned code like:
2595
//
2596
// struct S {
2597
// typedef struct A { } A;
2598
// };
2599
//
2600
// in the C++03 standard. We implement the C++0x semantics, which
2601
// allow the above but disallow
2602
//
2603
// struct S {
2604
// typedef int I;
2605
// typedef int I;
2606
// };
2607
//
2608
// since that was the intent of DR56.
2609
if (!isa<TypedefNameDecl>(Old))
2610
return;
2611
2612
Diag(New->getLocation(), diag::err_redefinition)
2613
<< New->getDeclName();
2614
notePreviousDefinition(Old, New->getLocation());
2615
return New->setInvalidDecl();
2616
}
2617
2618
// Modules always permit redefinition of typedefs, as does C11.
2619
if (getLangOpts().Modules || getLangOpts().C11)
2620
return;
2621
2622
// If we have a redefinition of a typedef in C, emit a warning. This warning
2623
// is normally mapped to an error, but can be controlled with
2624
// -Wtypedef-redefinition. If either the original or the redefinition is
2625
// in a system header, don't emit this for compatibility with GCC.
2626
if (getDiagnostics().getSuppressSystemWarnings() &&
2627
// Some standard types are defined implicitly in Clang (e.g. OpenCL).
2628
(Old->isImplicit() ||
2629
Context.getSourceManager().isInSystemHeader(Old->getLocation()) ||
2630
Context.getSourceManager().isInSystemHeader(New->getLocation())))
2631
return;
2632
2633
Diag(New->getLocation(), diag::ext_redefinition_of_typedef)
2634
<< New->getDeclName();
2635
notePreviousDefinition(Old, New->getLocation());
2636
}
2637
2638
/// DeclhasAttr - returns true if decl Declaration already has the target
2639
/// attribute.
2640
static bool DeclHasAttr(const Decl *D, const Attr *A) {
2641
const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2642
const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2643
for (const auto *i : D->attrs())
2644
if (i->getKind() == A->getKind()) {
2645
if (Ann) {
2646
if (Ann->getAnnotation() == cast<AnnotateAttr>(i)->getAnnotation())
2647
return true;
2648
continue;
2649
}
2650
// FIXME: Don't hardcode this check
2651
if (OA && isa<OwnershipAttr>(i))
2652
return OA->getOwnKind() == cast<OwnershipAttr>(i)->getOwnKind();
2653
return true;
2654
}
2655
2656
return false;
2657
}
2658
2659
static bool isAttributeTargetADefinition(Decl *D) {
2660
if (VarDecl *VD = dyn_cast<VarDecl>(D))
2661
return VD->isThisDeclarationADefinition();
2662
if (TagDecl *TD = dyn_cast<TagDecl>(D))
2663
return TD->isCompleteDefinition() || TD->isBeingDefined();
2664
return true;
2665
}
2666
2667
/// Merge alignment attributes from \p Old to \p New, taking into account the
2668
/// special semantics of C11's _Alignas specifier and C++11's alignas attribute.
2669
///
2670
/// \return \c true if any attributes were added to \p New.
2671
static bool mergeAlignedAttrs(Sema &S, NamedDecl *New, Decl *Old) {
2672
// Look for alignas attributes on Old, and pick out whichever attribute
2673
// specifies the strictest alignment requirement.
2674
AlignedAttr *OldAlignasAttr = nullptr;
2675
AlignedAttr *OldStrictestAlignAttr = nullptr;
2676
unsigned OldAlign = 0;
2677
for (auto *I : Old->specific_attrs<AlignedAttr>()) {
2678
// FIXME: We have no way of representing inherited dependent alignments
2679
// in a case like:
2680
// template<int A, int B> struct alignas(A) X;
2681
// template<int A, int B> struct alignas(B) X {};
2682
// For now, we just ignore any alignas attributes which are not on the
2683
// definition in such a case.
2684
if (I->isAlignmentDependent())
2685
return false;
2686
2687
if (I->isAlignas())
2688
OldAlignasAttr = I;
2689
2690
unsigned Align = I->getAlignment(S.Context);
2691
if (Align > OldAlign) {
2692
OldAlign = Align;
2693
OldStrictestAlignAttr = I;
2694
}
2695
}
2696
2697
// Look for alignas attributes on New.
2698
AlignedAttr *NewAlignasAttr = nullptr;
2699
unsigned NewAlign = 0;
2700
for (auto *I : New->specific_attrs<AlignedAttr>()) {
2701
if (I->isAlignmentDependent())
2702
return false;
2703
2704
if (I->isAlignas())
2705
NewAlignasAttr = I;
2706
2707
unsigned Align = I->getAlignment(S.Context);
2708
if (Align > NewAlign)
2709
NewAlign = Align;
2710
}
2711
2712
if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2713
// Both declarations have 'alignas' attributes. We require them to match.
2714
// C++11 [dcl.align]p6 and C11 6.7.5/7 both come close to saying this, but
2715
// fall short. (If two declarations both have alignas, they must both match
2716
// every definition, and so must match each other if there is a definition.)
2717
2718
// If either declaration only contains 'alignas(0)' specifiers, then it
2719
// specifies the natural alignment for the type.
2720
if (OldAlign == 0 || NewAlign == 0) {
2721
QualType Ty;
2722
if (ValueDecl *VD = dyn_cast<ValueDecl>(New))
2723
Ty = VD->getType();
2724
else
2725
Ty = S.Context.getTagDeclType(cast<TagDecl>(New));
2726
2727
if (OldAlign == 0)
2728
OldAlign = S.Context.getTypeAlign(Ty);
2729
if (NewAlign == 0)
2730
NewAlign = S.Context.getTypeAlign(Ty);
2731
}
2732
2733
if (OldAlign != NewAlign) {
2734
S.Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2735
<< (unsigned)S.Context.toCharUnitsFromBits(OldAlign).getQuantity()
2736
<< (unsigned)S.Context.toCharUnitsFromBits(NewAlign).getQuantity();
2737
S.Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2738
}
2739
}
2740
2741
if (OldAlignasAttr && !NewAlignasAttr && isAttributeTargetADefinition(New)) {
2742
// C++11 [dcl.align]p6:
2743
// if any declaration of an entity has an alignment-specifier,
2744
// every defining declaration of that entity shall specify an
2745
// equivalent alignment.
2746
// C11 6.7.5/7:
2747
// If the definition of an object does not have an alignment
2748
// specifier, any other declaration of that object shall also
2749
// have no alignment specifier.
2750
S.Diag(New->getLocation(), diag::err_alignas_missing_on_definition)
2751
<< OldAlignasAttr;
2752
S.Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2753
<< OldAlignasAttr;
2754
}
2755
2756
bool AnyAdded = false;
2757
2758
// Ensure we have an attribute representing the strictest alignment.
2759
if (OldAlign > NewAlign) {
2760
AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.Context);
2761
Clone->setInherited(true);
2762
New->addAttr(Clone);
2763
AnyAdded = true;
2764
}
2765
2766
// Ensure we have an alignas attribute if the old declaration had one.
2767
if (OldAlignasAttr && !NewAlignasAttr &&
2768
!(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2769
AlignedAttr *Clone = OldAlignasAttr->clone(S.Context);
2770
Clone->setInherited(true);
2771
New->addAttr(Clone);
2772
AnyAdded = true;
2773
}
2774
2775
return AnyAdded;
2776
}
2777
2778
#define WANT_DECL_MERGE_LOGIC
2779
#include "clang/Sema/AttrParsedAttrImpl.inc"
2780
#undef WANT_DECL_MERGE_LOGIC
2781
2782
static bool mergeDeclAttribute(Sema &S, NamedDecl *D,
2783
const InheritableAttr *Attr,
2784
Sema::AvailabilityMergeKind AMK) {
2785
// Diagnose any mutual exclusions between the attribute that we want to add
2786
// and attributes that already exist on the declaration.
2787
if (!DiagnoseMutualExclusions(S, D, Attr))
2788
return false;
2789
2790
// This function copies an attribute Attr from a previous declaration to the
2791
// new declaration D if the new declaration doesn't itself have that attribute
2792
// yet or if that attribute allows duplicates.
2793
// If you're adding a new attribute that requires logic different from
2794
// "use explicit attribute on decl if present, else use attribute from
2795
// previous decl", for example if the attribute needs to be consistent
2796
// between redeclarations, you need to call a custom merge function here.
2797
InheritableAttr *NewAttr = nullptr;
2798
if (const auto *AA = dyn_cast<AvailabilityAttr>(Attr))
2799
NewAttr = S.mergeAvailabilityAttr(
2800
D, *AA, AA->getPlatform(), AA->isImplicit(), AA->getIntroduced(),
2801
AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2802
AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2803
AA->getPriority(), AA->getEnvironment());
2804
else if (const auto *VA = dyn_cast<VisibilityAttr>(Attr))
2805
NewAttr = S.mergeVisibilityAttr(D, *VA, VA->getVisibility());
2806
else if (const auto *VA = dyn_cast<TypeVisibilityAttr>(Attr))
2807
NewAttr = S.mergeTypeVisibilityAttr(D, *VA, VA->getVisibility());
2808
else if (const auto *ImportA = dyn_cast<DLLImportAttr>(Attr))
2809
NewAttr = S.mergeDLLImportAttr(D, *ImportA);
2810
else if (const auto *ExportA = dyn_cast<DLLExportAttr>(Attr))
2811
NewAttr = S.mergeDLLExportAttr(D, *ExportA);
2812
else if (const auto *EA = dyn_cast<ErrorAttr>(Attr))
2813
NewAttr = S.mergeErrorAttr(D, *EA, EA->getUserDiagnostic());
2814
else if (const auto *FA = dyn_cast<FormatAttr>(Attr))
2815
NewAttr = S.mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2816
FA->getFirstArg());
2817
else if (const auto *SA = dyn_cast<SectionAttr>(Attr))
2818
NewAttr = S.mergeSectionAttr(D, *SA, SA->getName());
2819
else if (const auto *CSA = dyn_cast<CodeSegAttr>(Attr))
2820
NewAttr = S.mergeCodeSegAttr(D, *CSA, CSA->getName());
2821
else if (const auto *IA = dyn_cast<MSInheritanceAttr>(Attr))
2822
NewAttr = S.mergeMSInheritanceAttr(D, *IA, IA->getBestCase(),
2823
IA->getInheritanceModel());
2824
else if (const auto *AA = dyn_cast<AlwaysInlineAttr>(Attr))
2825
NewAttr = S.mergeAlwaysInlineAttr(D, *AA,
2826
&S.Context.Idents.get(AA->getSpelling()));
2827
else if (S.getLangOpts().CUDA && isa<FunctionDecl>(D) &&
2828
(isa<CUDAHostAttr>(Attr) || isa<CUDADeviceAttr>(Attr) ||
2829
isa<CUDAGlobalAttr>(Attr))) {
2830
// CUDA target attributes are part of function signature for
2831
// overloading purposes and must not be merged.
2832
return false;
2833
} else if (const auto *MA = dyn_cast<MinSizeAttr>(Attr))
2834
NewAttr = S.mergeMinSizeAttr(D, *MA);
2835
else if (const auto *SNA = dyn_cast<SwiftNameAttr>(Attr))
2836
NewAttr = S.Swift().mergeNameAttr(D, *SNA, SNA->getName());
2837
else if (const auto *OA = dyn_cast<OptimizeNoneAttr>(Attr))
2838
NewAttr = S.mergeOptimizeNoneAttr(D, *OA);
2839
else if (const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(Attr))
2840
NewAttr = S.mergeInternalLinkageAttr(D, *InternalLinkageA);
2841
else if (isa<AlignedAttr>(Attr))
2842
// AlignedAttrs are handled separately, because we need to handle all
2843
// such attributes on a declaration at the same time.
2844
NewAttr = nullptr;
2845
else if ((isa<DeprecatedAttr>(Attr) || isa<UnavailableAttr>(Attr)) &&
2846
(AMK == Sema::AMK_Override ||
2847
AMK == Sema::AMK_ProtocolImplementation ||
2848
AMK == Sema::AMK_OptionalProtocolImplementation))
2849
NewAttr = nullptr;
2850
else if (const auto *UA = dyn_cast<UuidAttr>(Attr))
2851
NewAttr = S.mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2852
else if (const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(Attr))
2853
NewAttr = S.Wasm().mergeImportModuleAttr(D, *IMA);
2854
else if (const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(Attr))
2855
NewAttr = S.Wasm().mergeImportNameAttr(D, *INA);
2856
else if (const auto *TCBA = dyn_cast<EnforceTCBAttr>(Attr))
2857
NewAttr = S.mergeEnforceTCBAttr(D, *TCBA);
2858
else if (const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(Attr))
2859
NewAttr = S.mergeEnforceTCBLeafAttr(D, *TCBLA);
2860
else if (const auto *BTFA = dyn_cast<BTFDeclTagAttr>(Attr))
2861
NewAttr = S.mergeBTFDeclTagAttr(D, *BTFA);
2862
else if (const auto *NT = dyn_cast<HLSLNumThreadsAttr>(Attr))
2863
NewAttr = S.HLSL().mergeNumThreadsAttr(D, *NT, NT->getX(), NT->getY(),
2864
NT->getZ());
2865
else if (const auto *SA = dyn_cast<HLSLShaderAttr>(Attr))
2866
NewAttr = S.HLSL().mergeShaderAttr(D, *SA, SA->getType());
2867
else if (isa<SuppressAttr>(Attr))
2868
// Do nothing. Each redeclaration should be suppressed separately.
2869
NewAttr = nullptr;
2870
else if (Attr->shouldInheritEvenIfAlreadyPresent() || !DeclHasAttr(D, Attr))
2871
NewAttr = cast<InheritableAttr>(Attr->clone(S.Context));
2872
2873
if (NewAttr) {
2874
NewAttr->setInherited(true);
2875
D->addAttr(NewAttr);
2876
if (isa<MSInheritanceAttr>(NewAttr))
2877
S.Consumer.AssignInheritanceModel(cast<CXXRecordDecl>(D));
2878
return true;
2879
}
2880
2881
return false;
2882
}
2883
2884
static const NamedDecl *getDefinition(const Decl *D) {
2885
if (const TagDecl *TD = dyn_cast<TagDecl>(D))
2886
return TD->getDefinition();
2887
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2888
const VarDecl *Def = VD->getDefinition();
2889
if (Def)
2890
return Def;
2891
return VD->getActingDefinition();
2892
}
2893
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2894
const FunctionDecl *Def = nullptr;
2895
if (FD->isDefined(Def, true))
2896
return Def;
2897
}
2898
return nullptr;
2899
}
2900
2901
static bool hasAttribute(const Decl *D, attr::Kind Kind) {
2902
for (const auto *Attribute : D->attrs())
2903
if (Attribute->getKind() == Kind)
2904
return true;
2905
return false;
2906
}
2907
2908
/// checkNewAttributesAfterDef - If we already have a definition, check that
2909
/// there are no new attributes in this declaration.
2910
static void checkNewAttributesAfterDef(Sema &S, Decl *New, const Decl *Old) {
2911
if (!New->hasAttrs())
2912
return;
2913
2914
const NamedDecl *Def = getDefinition(Old);
2915
if (!Def || Def == New)
2916
return;
2917
2918
AttrVec &NewAttributes = New->getAttrs();
2919
for (unsigned I = 0, E = NewAttributes.size(); I != E;) {
2920
const Attr *NewAttribute = NewAttributes[I];
2921
2922
if (isa<AliasAttr>(NewAttribute) || isa<IFuncAttr>(NewAttribute)) {
2923
if (FunctionDecl *FD = dyn_cast<FunctionDecl>(New)) {
2924
SkipBodyInfo SkipBody;
2925
S.CheckForFunctionRedefinition(FD, cast<FunctionDecl>(Def), &SkipBody);
2926
2927
// If we're skipping this definition, drop the "alias" attribute.
2928
if (SkipBody.ShouldSkip) {
2929
NewAttributes.erase(NewAttributes.begin() + I);
2930
--E;
2931
continue;
2932
}
2933
} else {
2934
VarDecl *VD = cast<VarDecl>(New);
2935
unsigned Diag = cast<VarDecl>(Def)->isThisDeclarationADefinition() ==
2936
VarDecl::TentativeDefinition
2937
? diag::err_alias_after_tentative
2938
: diag::err_redefinition;
2939
S.Diag(VD->getLocation(), Diag) << VD->getDeclName();
2940
if (Diag == diag::err_redefinition)
2941
S.notePreviousDefinition(Def, VD->getLocation());
2942
else
2943
S.Diag(Def->getLocation(), diag::note_previous_definition);
2944
VD->setInvalidDecl();
2945
}
2946
++I;
2947
continue;
2948
}
2949
2950
if (const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
2951
// Tentative definitions are only interesting for the alias check above.
2952
if (VD->isThisDeclarationADefinition() != VarDecl::Definition) {
2953
++I;
2954
continue;
2955
}
2956
}
2957
2958
if (hasAttribute(Def, NewAttribute->getKind())) {
2959
++I;
2960
continue; // regular attr merging will take care of validating this.
2961
}
2962
2963
if (isa<C11NoReturnAttr>(NewAttribute)) {
2964
// C's _Noreturn is allowed to be added to a function after it is defined.
2965
++I;
2966
continue;
2967
} else if (isa<UuidAttr>(NewAttribute)) {
2968
// msvc will allow a subsequent definition to add an uuid to a class
2969
++I;
2970
continue;
2971
} else if (const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
2972
if (AA->isAlignas()) {
2973
// C++11 [dcl.align]p6:
2974
// if any declaration of an entity has an alignment-specifier,
2975
// every defining declaration of that entity shall specify an
2976
// equivalent alignment.
2977
// C11 6.7.5/7:
2978
// If the definition of an object does not have an alignment
2979
// specifier, any other declaration of that object shall also
2980
// have no alignment specifier.
2981
S.Diag(Def->getLocation(), diag::err_alignas_missing_on_definition)
2982
<< AA;
2983
S.Diag(NewAttribute->getLocation(), diag::note_alignas_on_declaration)
2984
<< AA;
2985
NewAttributes.erase(NewAttributes.begin() + I);
2986
--E;
2987
continue;
2988
}
2989
} else if (isa<LoaderUninitializedAttr>(NewAttribute)) {
2990
// If there is a C definition followed by a redeclaration with this
2991
// attribute then there are two different definitions. In C++, prefer the
2992
// standard diagnostics.
2993
if (!S.getLangOpts().CPlusPlus) {
2994
S.Diag(NewAttribute->getLocation(),
2995
diag::err_loader_uninitialized_redeclaration);
2996
S.Diag(Def->getLocation(), diag::note_previous_definition);
2997
NewAttributes.erase(NewAttributes.begin() + I);
2998
--E;
2999
continue;
3000
}
3001
} else if (isa<SelectAnyAttr>(NewAttribute) &&
3002
cast<VarDecl>(New)->isInline() &&
3003
!cast<VarDecl>(New)->isInlineSpecified()) {
3004
// Don't warn about applying selectany to implicitly inline variables.
3005
// Older compilers and language modes would require the use of selectany
3006
// to make such variables inline, and it would have no effect if we
3007
// honored it.
3008
++I;
3009
continue;
3010
} else if (isa<OMPDeclareVariantAttr>(NewAttribute)) {
3011
// We allow to add OMP[Begin]DeclareVariantAttr to be added to
3012
// declarations after definitions.
3013
++I;
3014
continue;
3015
}
3016
3017
S.Diag(NewAttribute->getLocation(),
3018
diag::warn_attribute_precede_definition);
3019
S.Diag(Def->getLocation(), diag::note_previous_definition);
3020
NewAttributes.erase(NewAttributes.begin() + I);
3021
--E;
3022
}
3023
}
3024
3025
static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl,
3026
const ConstInitAttr *CIAttr,
3027
bool AttrBeforeInit) {
3028
SourceLocation InsertLoc = InitDecl->getInnerLocStart();
3029
3030
// Figure out a good way to write this specifier on the old declaration.
3031
// FIXME: We should just use the spelling of CIAttr, but we don't preserve
3032
// enough of the attribute list spelling information to extract that without
3033
// heroics.
3034
std::string SuitableSpelling;
3035
if (S.getLangOpts().CPlusPlus20)
3036
SuitableSpelling = std::string(
3037
S.PP.getLastMacroWithSpelling(InsertLoc, {tok::kw_constinit}));
3038
if (SuitableSpelling.empty() && S.getLangOpts().CPlusPlus11)
3039
SuitableSpelling = std::string(S.PP.getLastMacroWithSpelling(
3040
InsertLoc, {tok::l_square, tok::l_square,
3041
S.PP.getIdentifierInfo("clang"), tok::coloncolon,
3042
S.PP.getIdentifierInfo("require_constant_initialization"),
3043
tok::r_square, tok::r_square}));
3044
if (SuitableSpelling.empty())
3045
SuitableSpelling = std::string(S.PP.getLastMacroWithSpelling(
3046
InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3047
S.PP.getIdentifierInfo("require_constant_initialization"),
3048
tok::r_paren, tok::r_paren}));
3049
if (SuitableSpelling.empty() && S.getLangOpts().CPlusPlus20)
3050
SuitableSpelling = "constinit";
3051
if (SuitableSpelling.empty() && S.getLangOpts().CPlusPlus11)
3052
SuitableSpelling = "[[clang::require_constant_initialization]]";
3053
if (SuitableSpelling.empty())
3054
SuitableSpelling = "__attribute__((require_constant_initialization))";
3055
SuitableSpelling += " ";
3056
3057
if (AttrBeforeInit) {
3058
// extern constinit int a;
3059
// int a = 0; // error (missing 'constinit'), accepted as extension
3060
assert(CIAttr->isConstinit() && "should not diagnose this for attribute");
3061
S.Diag(InitDecl->getLocation(), diag::ext_constinit_missing)
3062
<< InitDecl << FixItHint::CreateInsertion(InsertLoc, SuitableSpelling);
3063
S.Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3064
} else {
3065
// int a = 0;
3066
// constinit extern int a; // error (missing 'constinit')
3067
S.Diag(CIAttr->getLocation(),
3068
CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3069
: diag::warn_require_const_init_added_too_late)
3070
<< FixItHint::CreateRemoval(SourceRange(CIAttr->getLocation()));
3071
S.Diag(InitDecl->getLocation(), diag::note_constinit_missing_here)
3072
<< CIAttr->isConstinit()
3073
<< FixItHint::CreateInsertion(InsertLoc, SuitableSpelling);
3074
}
3075
}
3076
3077
void Sema::mergeDeclAttributes(NamedDecl *New, Decl *Old,
3078
AvailabilityMergeKind AMK) {
3079
if (UsedAttr *OldAttr = Old->getMostRecentDecl()->getAttr<UsedAttr>()) {
3080
UsedAttr *NewAttr = OldAttr->clone(Context);
3081
NewAttr->setInherited(true);
3082
New->addAttr(NewAttr);
3083
}
3084
if (RetainAttr *OldAttr = Old->getMostRecentDecl()->getAttr<RetainAttr>()) {
3085
RetainAttr *NewAttr = OldAttr->clone(Context);
3086
NewAttr->setInherited(true);
3087
New->addAttr(NewAttr);
3088
}
3089
3090
if (!Old->hasAttrs() && !New->hasAttrs())
3091
return;
3092
3093
// [dcl.constinit]p1:
3094
// If the [constinit] specifier is applied to any declaration of a
3095
// variable, it shall be applied to the initializing declaration.
3096
const auto *OldConstInit = Old->getAttr<ConstInitAttr>();
3097
const auto *NewConstInit = New->getAttr<ConstInitAttr>();
3098
if (bool(OldConstInit) != bool(NewConstInit)) {
3099
const auto *OldVD = cast<VarDecl>(Old);
3100
auto *NewVD = cast<VarDecl>(New);
3101
3102
// Find the initializing declaration. Note that we might not have linked
3103
// the new declaration into the redeclaration chain yet.
3104
const VarDecl *InitDecl = OldVD->getInitializingDeclaration();
3105
if (!InitDecl &&
3106
(NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3107
InitDecl = NewVD;
3108
3109
if (InitDecl == NewVD) {
3110
// This is the initializing declaration. If it would inherit 'constinit',
3111
// that's ill-formed. (Note that we do not apply this to the attribute
3112
// form).
3113
if (OldConstInit && OldConstInit->isConstinit())
3114
diagnoseMissingConstinit(*this, NewVD, OldConstInit,
3115
/*AttrBeforeInit=*/true);
3116
} else if (NewConstInit) {
3117
// This is the first time we've been told that this declaration should
3118
// have a constant initializer. If we already saw the initializing
3119
// declaration, this is too late.
3120
if (InitDecl && InitDecl != NewVD) {
3121
diagnoseMissingConstinit(*this, InitDecl, NewConstInit,
3122
/*AttrBeforeInit=*/false);
3123
NewVD->dropAttr<ConstInitAttr>();
3124
}
3125
}
3126
}
3127
3128
// Attributes declared post-definition are currently ignored.
3129
checkNewAttributesAfterDef(*this, New, Old);
3130
3131
if (AsmLabelAttr *NewA = New->getAttr<AsmLabelAttr>()) {
3132
if (AsmLabelAttr *OldA = Old->getAttr<AsmLabelAttr>()) {
3133
if (!OldA->isEquivalent(NewA)) {
3134
// This redeclaration changes __asm__ label.
3135
Diag(New->getLocation(), diag::err_different_asm_label);
3136
Diag(OldA->getLocation(), diag::note_previous_declaration);
3137
}
3138
} else if (Old->isUsed()) {
3139
// This redeclaration adds an __asm__ label to a declaration that has
3140
// already been ODR-used.
3141
Diag(New->getLocation(), diag::err_late_asm_label_name)
3142
<< isa<FunctionDecl>(Old) << New->getAttr<AsmLabelAttr>()->getRange();
3143
}
3144
}
3145
3146
// Re-declaration cannot add abi_tag's.
3147
if (const auto *NewAbiTagAttr = New->getAttr<AbiTagAttr>()) {
3148
if (const auto *OldAbiTagAttr = Old->getAttr<AbiTagAttr>()) {
3149
for (const auto &NewTag : NewAbiTagAttr->tags()) {
3150
if (!llvm::is_contained(OldAbiTagAttr->tags(), NewTag)) {
3151
Diag(NewAbiTagAttr->getLocation(),
3152
diag::err_new_abi_tag_on_redeclaration)
3153
<< NewTag;
3154
Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3155
}
3156
}
3157
} else {
3158
Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3159
Diag(Old->getLocation(), diag::note_previous_declaration);
3160
}
3161
}
3162
3163
// This redeclaration adds a section attribute.
3164
if (New->hasAttr<SectionAttr>() && !Old->hasAttr<SectionAttr>()) {
3165
if (auto *VD = dyn_cast<VarDecl>(New)) {
3166
if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly) {
3167
Diag(New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3168
Diag(Old->getLocation(), diag::note_previous_declaration);
3169
}
3170
}
3171
}
3172
3173
// Redeclaration adds code-seg attribute.
3174
const auto *NewCSA = New->getAttr<CodeSegAttr>();
3175
if (NewCSA && !Old->hasAttr<CodeSegAttr>() &&
3176
!NewCSA->isImplicit() && isa<CXXMethodDecl>(New)) {
3177
Diag(New->getLocation(), diag::warn_mismatched_section)
3178
<< 0 /*codeseg*/;
3179
Diag(Old->getLocation(), diag::note_previous_declaration);
3180
}
3181
3182
if (!Old->hasAttrs())
3183
return;
3184
3185
bool foundAny = New->hasAttrs();
3186
3187
// Ensure that any moving of objects within the allocated map is done before
3188
// we process them.
3189
if (!foundAny) New->setAttrs(AttrVec());
3190
3191
for (auto *I : Old->specific_attrs<InheritableAttr>()) {
3192
// Ignore deprecated/unavailable/availability attributes if requested.
3193
AvailabilityMergeKind LocalAMK = AMK_None;
3194
if (isa<DeprecatedAttr>(I) ||
3195
isa<UnavailableAttr>(I) ||
3196
isa<AvailabilityAttr>(I)) {
3197
switch (AMK) {
3198
case AMK_None:
3199
continue;
3200
3201
case AMK_Redeclaration:
3202
case AMK_Override:
3203
case AMK_ProtocolImplementation:
3204
case AMK_OptionalProtocolImplementation:
3205
LocalAMK = AMK;
3206
break;
3207
}
3208
}
3209
3210
// Already handled.
3211
if (isa<UsedAttr>(I) || isa<RetainAttr>(I))
3212
continue;
3213
3214
if (mergeDeclAttribute(*this, New, I, LocalAMK))
3215
foundAny = true;
3216
}
3217
3218
if (mergeAlignedAttrs(*this, New, Old))
3219
foundAny = true;
3220
3221
if (!foundAny) New->dropAttrs();
3222
}
3223
3224
/// mergeParamDeclAttributes - Copy attributes from the old parameter
3225
/// to the new one.
3226
static void mergeParamDeclAttributes(ParmVarDecl *newDecl,
3227
const ParmVarDecl *oldDecl,
3228
Sema &S) {
3229
// C++11 [dcl.attr.depend]p2:
3230
// The first declaration of a function shall specify the
3231
// carries_dependency attribute for its declarator-id if any declaration
3232
// of the function specifies the carries_dependency attribute.
3233
const CarriesDependencyAttr *CDA = newDecl->getAttr<CarriesDependencyAttr>();
3234
if (CDA && !oldDecl->hasAttr<CarriesDependencyAttr>()) {
3235
S.Diag(CDA->getLocation(),
3236
diag::err_carries_dependency_missing_on_first_decl) << 1/*Param*/;
3237
// Find the first declaration of the parameter.
3238
// FIXME: Should we build redeclaration chains for function parameters?
3239
const FunctionDecl *FirstFD =
3240
cast<FunctionDecl>(oldDecl->getDeclContext())->getFirstDecl();
3241
const ParmVarDecl *FirstVD =
3242
FirstFD->getParamDecl(oldDecl->getFunctionScopeIndex());
3243
S.Diag(FirstVD->getLocation(),
3244
diag::note_carries_dependency_missing_first_decl) << 1/*Param*/;
3245
}
3246
3247
// HLSL parameter declarations for inout and out must match between
3248
// declarations. In HLSL inout and out are ambiguous at the call site, but
3249
// have different calling behavior, so you cannot overload a method based on a
3250
// difference between inout and out annotations.
3251
if (S.getLangOpts().HLSL) {
3252
const auto *NDAttr = newDecl->getAttr<HLSLParamModifierAttr>();
3253
const auto *ODAttr = oldDecl->getAttr<HLSLParamModifierAttr>();
3254
// We don't need to cover the case where one declaration doesn't have an
3255
// attribute. The only possible case there is if one declaration has an `in`
3256
// attribute and the other declaration has no attribute. This case is
3257
// allowed since parameters are `in` by default.
3258
if (NDAttr && ODAttr &&
3259
NDAttr->getSpellingListIndex() != ODAttr->getSpellingListIndex()) {
3260
S.Diag(newDecl->getLocation(), diag::err_hlsl_param_qualifier_mismatch)
3261
<< NDAttr << newDecl;
3262
S.Diag(oldDecl->getLocation(), diag::note_previous_declaration_as)
3263
<< ODAttr;
3264
}
3265
}
3266
3267
if (!oldDecl->hasAttrs())
3268
return;
3269
3270
bool foundAny = newDecl->hasAttrs();
3271
3272
// Ensure that any moving of objects within the allocated map is
3273
// done before we process them.
3274
if (!foundAny) newDecl->setAttrs(AttrVec());
3275
3276
for (const auto *I : oldDecl->specific_attrs<InheritableParamAttr>()) {
3277
if (!DeclHasAttr(newDecl, I)) {
3278
InheritableAttr *newAttr =
3279
cast<InheritableParamAttr>(I->clone(S.Context));
3280
newAttr->setInherited(true);
3281
newDecl->addAttr(newAttr);
3282
foundAny = true;
3283
}
3284
}
3285
3286
if (!foundAny) newDecl->dropAttrs();
3287
}
3288
3289
static bool EquivalentArrayTypes(QualType Old, QualType New,
3290
const ASTContext &Ctx) {
3291
3292
auto NoSizeInfo = [&Ctx](QualType Ty) {
3293
if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3294
return true;
3295
if (const auto *VAT = Ctx.getAsVariableArrayType(Ty))
3296
return VAT->getSizeModifier() == ArraySizeModifier::Star;
3297
return false;
3298
};
3299
3300
// `type[]` is equivalent to `type *` and `type[*]`.
3301
if (NoSizeInfo(Old) && NoSizeInfo(New))
3302
return true;
3303
3304
// Don't try to compare VLA sizes, unless one of them has the star modifier.
3305
if (Old->isVariableArrayType() && New->isVariableArrayType()) {
3306
const auto *OldVAT = Ctx.getAsVariableArrayType(Old);
3307
const auto *NewVAT = Ctx.getAsVariableArrayType(New);
3308
if ((OldVAT->getSizeModifier() == ArraySizeModifier::Star) ^
3309
(NewVAT->getSizeModifier() == ArraySizeModifier::Star))
3310
return false;
3311
return true;
3312
}
3313
3314
// Only compare size, ignore Size modifiers and CVR.
3315
if (Old->isConstantArrayType() && New->isConstantArrayType()) {
3316
return Ctx.getAsConstantArrayType(Old)->getSize() ==
3317
Ctx.getAsConstantArrayType(New)->getSize();
3318
}
3319
3320
// Don't try to compare dependent sized array
3321
if (Old->isDependentSizedArrayType() && New->isDependentSizedArrayType()) {
3322
return true;
3323
}
3324
3325
return Old == New;
3326
}
3327
3328
static void mergeParamDeclTypes(ParmVarDecl *NewParam,
3329
const ParmVarDecl *OldParam,
3330
Sema &S) {
3331
if (auto Oldnullability = OldParam->getType()->getNullability()) {
3332
if (auto Newnullability = NewParam->getType()->getNullability()) {
3333
if (*Oldnullability != *Newnullability) {
3334
S.Diag(NewParam->getLocation(), diag::warn_mismatched_nullability_attr)
3335
<< DiagNullabilityKind(
3336
*Newnullability,
3337
((NewParam->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
3338
!= 0))
3339
<< DiagNullabilityKind(
3340
*Oldnullability,
3341
((OldParam->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability)
3342
!= 0));
3343
S.Diag(OldParam->getLocation(), diag::note_previous_declaration);
3344
}
3345
} else {
3346
QualType NewT = NewParam->getType();
3347
NewT = S.Context.getAttributedType(
3348
AttributedType::getNullabilityAttrKind(*Oldnullability),
3349
NewT, NewT);
3350
NewParam->setType(NewT);
3351
}
3352
}
3353
const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->getType());
3354
const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->getType());
3355
if (OldParamDT && NewParamDT &&
3356
OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3357
QualType OldParamOT = OldParamDT->getOriginalType();
3358
QualType NewParamOT = NewParamDT->getOriginalType();
3359
if (!EquivalentArrayTypes(OldParamOT, NewParamOT, S.getASTContext())) {
3360
S.Diag(NewParam->getLocation(), diag::warn_inconsistent_array_form)
3361
<< NewParam << NewParamOT;
3362
S.Diag(OldParam->getLocation(), diag::note_previous_declaration_as)
3363
<< OldParamOT;
3364
}
3365
}
3366
}
3367
3368
namespace {
3369
3370
/// Used in MergeFunctionDecl to keep track of function parameters in
3371
/// C.
3372
struct GNUCompatibleParamWarning {
3373
ParmVarDecl *OldParm;
3374
ParmVarDecl *NewParm;
3375
QualType PromotedType;
3376
};
3377
3378
} // end anonymous namespace
3379
3380
// Determine whether the previous declaration was a definition, implicit
3381
// declaration, or a declaration.
3382
template <typename T>
3383
static std::pair<diag::kind, SourceLocation>
3384
getNoteDiagForInvalidRedeclaration(const T *Old, const T *New) {
3385
diag::kind PrevDiag;
3386
SourceLocation OldLocation = Old->getLocation();
3387
if (Old->isThisDeclarationADefinition())
3388
PrevDiag = diag::note_previous_definition;
3389
else if (Old->isImplicit()) {
3390
PrevDiag = diag::note_previous_implicit_declaration;
3391
if (const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3392
if (FD->getBuiltinID())
3393
PrevDiag = diag::note_previous_builtin_declaration;
3394
}
3395
if (OldLocation.isInvalid())
3396
OldLocation = New->getLocation();
3397
} else
3398
PrevDiag = diag::note_previous_declaration;
3399
return std::make_pair(PrevDiag, OldLocation);
3400
}
3401
3402
/// canRedefineFunction - checks if a function can be redefined. Currently,
3403
/// only extern inline functions can be redefined, and even then only in
3404
/// GNU89 mode.
3405
static bool canRedefineFunction(const FunctionDecl *FD,
3406
const LangOptions& LangOpts) {
3407
return ((FD->hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3408
!LangOpts.CPlusPlus &&
3409
FD->isInlineSpecified() &&
3410
FD->getStorageClass() == SC_Extern);
3411
}
3412
3413
const AttributedType *Sema::getCallingConvAttributedType(QualType T) const {
3414
const AttributedType *AT = T->getAs<AttributedType>();
3415
while (AT && !AT->isCallingConv())
3416
AT = AT->getModifiedType()->getAs<AttributedType>();
3417
return AT;
3418
}
3419
3420
template <typename T>
3421
static bool haveIncompatibleLanguageLinkages(const T *Old, const T *New) {
3422
const DeclContext *DC = Old->getDeclContext();
3423
if (DC->isRecord())
3424
return false;
3425
3426
LanguageLinkage OldLinkage = Old->getLanguageLinkage();
3427
if (OldLinkage == CXXLanguageLinkage && New->isInExternCContext())
3428
return true;
3429
if (OldLinkage == CLanguageLinkage && New->isInExternCXXContext())
3430
return true;
3431
return false;
3432
}
3433
3434
template<typename T> static bool isExternC(T *D) { return D->isExternC(); }
3435
static bool isExternC(VarTemplateDecl *) { return false; }
3436
static bool isExternC(FunctionTemplateDecl *) { return false; }
3437
3438
/// Check whether a redeclaration of an entity introduced by a
3439
/// using-declaration is valid, given that we know it's not an overload
3440
/// (nor a hidden tag declaration).
3441
template<typename ExpectedDecl>
3442
static bool checkUsingShadowRedecl(Sema &S, UsingShadowDecl *OldS,
3443
ExpectedDecl *New) {
3444
// C++11 [basic.scope.declarative]p4:
3445
// Given a set of declarations in a single declarative region, each of
3446
// which specifies the same unqualified name,
3447
// -- they shall all refer to the same entity, or all refer to functions
3448
// and function templates; or
3449
// -- exactly one declaration shall declare a class name or enumeration
3450
// name that is not a typedef name and the other declarations shall all
3451
// refer to the same variable or enumerator, or all refer to functions
3452
// and function templates; in this case the class name or enumeration
3453
// name is hidden (3.3.10).
3454
3455
// C++11 [namespace.udecl]p14:
3456
// If a function declaration in namespace scope or block scope has the
3457
// same name and the same parameter-type-list as a function introduced
3458
// by a using-declaration, and the declarations do not declare the same
3459
// function, the program is ill-formed.
3460
3461
auto *Old = dyn_cast<ExpectedDecl>(OldS->getTargetDecl());
3462
if (Old &&
3463
!Old->getDeclContext()->getRedeclContext()->Equals(
3464
New->getDeclContext()->getRedeclContext()) &&
3465
!(isExternC(Old) && isExternC(New)))
3466
Old = nullptr;
3467
3468
if (!Old) {
3469
S.Diag(New->getLocation(), diag::err_using_decl_conflict_reverse);
3470
S.Diag(OldS->getTargetDecl()->getLocation(), diag::note_using_decl_target);
3471
S.Diag(OldS->getIntroducer()->getLocation(), diag::note_using_decl) << 0;
3472
return true;
3473
}
3474
return false;
3475
}
3476
3477
static bool hasIdenticalPassObjectSizeAttrs(const FunctionDecl *A,
3478
const FunctionDecl *B) {
3479
assert(A->getNumParams() == B->getNumParams());
3480
3481
auto AttrEq = [](const ParmVarDecl *A, const ParmVarDecl *B) {
3482
const auto *AttrA = A->getAttr<PassObjectSizeAttr>();
3483
const auto *AttrB = B->getAttr<PassObjectSizeAttr>();
3484
if (AttrA == AttrB)
3485
return true;
3486
return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3487
AttrA->isDynamic() == AttrB->isDynamic();
3488
};
3489
3490
return std::equal(A->param_begin(), A->param_end(), B->param_begin(), AttrEq);
3491
}
3492
3493
/// If necessary, adjust the semantic declaration context for a qualified
3494
/// declaration to name the correct inline namespace within the qualifier.
3495
static void adjustDeclContextForDeclaratorDecl(DeclaratorDecl *NewD,
3496
DeclaratorDecl *OldD) {
3497
// The only case where we need to update the DeclContext is when
3498
// redeclaration lookup for a qualified name finds a declaration
3499
// in an inline namespace within the context named by the qualifier:
3500
//
3501
// inline namespace N { int f(); }
3502
// int ::f(); // Sema DC needs adjusting from :: to N::.
3503
//
3504
// For unqualified declarations, the semantic context *can* change
3505
// along the redeclaration chain (for local extern declarations,
3506
// extern "C" declarations, and friend declarations in particular).
3507
if (!NewD->getQualifier())
3508
return;
3509
3510
// NewD is probably already in the right context.
3511
auto *NamedDC = NewD->getDeclContext()->getRedeclContext();
3512
auto *SemaDC = OldD->getDeclContext()->getRedeclContext();
3513
if (NamedDC->Equals(SemaDC))
3514
return;
3515
3516
assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3517
NewD->isInvalidDecl() || OldD->isInvalidDecl()) &&
3518
"unexpected context for redeclaration");
3519
3520
auto *LexDC = NewD->getLexicalDeclContext();
3521
auto FixSemaDC = [=](NamedDecl *D) {
3522
if (!D)
3523
return;
3524
D->setDeclContext(SemaDC);
3525
D->setLexicalDeclContext(LexDC);
3526
};
3527
3528
FixSemaDC(NewD);
3529
if (auto *FD = dyn_cast<FunctionDecl>(NewD))
3530
FixSemaDC(FD->getDescribedFunctionTemplate());
3531
else if (auto *VD = dyn_cast<VarDecl>(NewD))
3532
FixSemaDC(VD->getDescribedVarTemplate());
3533
}
3534
3535
bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S,
3536
bool MergeTypeWithOld, bool NewDeclIsDefn) {
3537
// Verify the old decl was also a function.
3538
FunctionDecl *Old = OldD->getAsFunction();
3539
if (!Old) {
3540
if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(OldD)) {
3541
if (New->getFriendObjectKind()) {
3542
Diag(New->getLocation(), diag::err_using_decl_friend);
3543
Diag(Shadow->getTargetDecl()->getLocation(),
3544
diag::note_using_decl_target);
3545
Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3546
<< 0;
3547
return true;
3548
}
3549
3550
// Check whether the two declarations might declare the same function or
3551
// function template.
3552
if (FunctionTemplateDecl *NewTemplate =
3553
New->getDescribedFunctionTemplate()) {
3554
if (checkUsingShadowRedecl<FunctionTemplateDecl>(*this, Shadow,
3555
NewTemplate))
3556
return true;
3557
OldD = Old = cast<FunctionTemplateDecl>(Shadow->getTargetDecl())
3558
->getAsFunction();
3559
} else {
3560
if (checkUsingShadowRedecl<FunctionDecl>(*this, Shadow, New))
3561
return true;
3562
OldD = Old = cast<FunctionDecl>(Shadow->getTargetDecl());
3563
}
3564
} else {
3565
Diag(New->getLocation(), diag::err_redefinition_different_kind)
3566
<< New->getDeclName();
3567
notePreviousDefinition(OldD, New->getLocation());
3568
return true;
3569
}
3570
}
3571
3572
// If the old declaration was found in an inline namespace and the new
3573
// declaration was qualified, update the DeclContext to match.
3574
adjustDeclContextForDeclaratorDecl(New, Old);
3575
3576
// If the old declaration is invalid, just give up here.
3577
if (Old->isInvalidDecl())
3578
return true;
3579
3580
// Disallow redeclaration of some builtins.
3581
if (!getASTContext().canBuiltinBeRedeclared(Old)) {
3582
Diag(New->getLocation(), diag::err_builtin_redeclare) << Old->getDeclName();
3583
Diag(Old->getLocation(), diag::note_previous_builtin_declaration)
3584
<< Old << Old->getType();
3585
return true;
3586
}
3587
3588
diag::kind PrevDiag;
3589
SourceLocation OldLocation;
3590
std::tie(PrevDiag, OldLocation) =
3591
getNoteDiagForInvalidRedeclaration(Old, New);
3592
3593
// Don't complain about this if we're in GNU89 mode and the old function
3594
// is an extern inline function.
3595
// Don't complain about specializations. They are not supposed to have
3596
// storage classes.
3597
if (!isa<CXXMethodDecl>(New) && !isa<CXXMethodDecl>(Old) &&
3598
New->getStorageClass() == SC_Static &&
3599
Old->hasExternalFormalLinkage() &&
3600
!New->getTemplateSpecializationInfo() &&
3601
!canRedefineFunction(Old, getLangOpts())) {
3602
if (getLangOpts().MicrosoftExt) {
3603
Diag(New->getLocation(), diag::ext_static_non_static) << New;
3604
Diag(OldLocation, PrevDiag) << Old << Old->getType();
3605
} else {
3606
Diag(New->getLocation(), diag::err_static_non_static) << New;
3607
Diag(OldLocation, PrevDiag) << Old << Old->getType();
3608
return true;
3609
}
3610
}
3611
3612
if (const auto *ILA = New->getAttr<InternalLinkageAttr>())
3613
if (!Old->hasAttr<InternalLinkageAttr>()) {
3614
Diag(New->getLocation(), diag::err_attribute_missing_on_first_decl)
3615
<< ILA;
3616
Diag(Old->getLocation(), diag::note_previous_declaration);
3617
New->dropAttr<InternalLinkageAttr>();
3618
}
3619
3620
if (auto *EA = New->getAttr<ErrorAttr>()) {
3621
if (!Old->hasAttr<ErrorAttr>()) {
3622
Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3623
Diag(Old->getLocation(), diag::note_previous_declaration);
3624
New->dropAttr<ErrorAttr>();
3625
}
3626
}
3627
3628
if (CheckRedeclarationInModule(New, Old))
3629
return true;
3630
3631
if (!getLangOpts().CPlusPlus) {
3632
bool OldOvl = Old->hasAttr<OverloadableAttr>();
3633
if (OldOvl != New->hasAttr<OverloadableAttr>() && !Old->isImplicit()) {
3634
Diag(New->getLocation(), diag::err_attribute_overloadable_mismatch)
3635
<< New << OldOvl;
3636
3637
// Try our best to find a decl that actually has the overloadable
3638
// attribute for the note. In most cases (e.g. programs with only one
3639
// broken declaration/definition), this won't matter.
3640
//
3641
// FIXME: We could do this if we juggled some extra state in
3642
// OverloadableAttr, rather than just removing it.
3643
const Decl *DiagOld = Old;
3644
if (OldOvl) {
3645
auto OldIter = llvm::find_if(Old->redecls(), [](const Decl *D) {
3646
const auto *A = D->getAttr<OverloadableAttr>();
3647
return A && !A->isImplicit();
3648
});
3649
// If we've implicitly added *all* of the overloadable attrs to this
3650
// chain, emitting a "previous redecl" note is pointless.
3651
DiagOld = OldIter == Old->redecls_end() ? nullptr : *OldIter;
3652
}
3653
3654
if (DiagOld)
3655
Diag(DiagOld->getLocation(),
3656
diag::note_attribute_overloadable_prev_overload)
3657
<< OldOvl;
3658
3659
if (OldOvl)
3660
New->addAttr(OverloadableAttr::CreateImplicit(Context));
3661
else
3662
New->dropAttr<OverloadableAttr>();
3663
}
3664
}
3665
3666
// It is not permitted to redeclare an SME function with different SME
3667
// attributes.
3668
if (IsInvalidSMECallConversion(Old->getType(), New->getType())) {
3669
Diag(New->getLocation(), diag::err_sme_attr_mismatch)
3670
<< New->getType() << Old->getType();
3671
Diag(OldLocation, diag::note_previous_declaration);
3672
return true;
3673
}
3674
3675
// If a function is first declared with a calling convention, but is later
3676
// declared or defined without one, all following decls assume the calling
3677
// convention of the first.
3678
//
3679
// It's OK if a function is first declared without a calling convention,
3680
// but is later declared or defined with the default calling convention.
3681
//
3682
// To test if either decl has an explicit calling convention, we look for
3683
// AttributedType sugar nodes on the type as written. If they are missing or
3684
// were canonicalized away, we assume the calling convention was implicit.
3685
//
3686
// Note also that we DO NOT return at this point, because we still have
3687
// other tests to run.
3688
QualType OldQType = Context.getCanonicalType(Old->getType());
3689
QualType NewQType = Context.getCanonicalType(New->getType());
3690
const FunctionType *OldType = cast<FunctionType>(OldQType);
3691
const FunctionType *NewType = cast<FunctionType>(NewQType);
3692
FunctionType::ExtInfo OldTypeInfo = OldType->getExtInfo();
3693
FunctionType::ExtInfo NewTypeInfo = NewType->getExtInfo();
3694
bool RequiresAdjustment = false;
3695
3696
if (OldTypeInfo.getCC() != NewTypeInfo.getCC()) {
3697
FunctionDecl *First = Old->getFirstDecl();
3698
const FunctionType *FT =
3699
First->getType().getCanonicalType()->castAs<FunctionType>();
3700
FunctionType::ExtInfo FI = FT->getExtInfo();
3701
bool NewCCExplicit = getCallingConvAttributedType(New->getType());
3702
if (!NewCCExplicit) {
3703
// Inherit the CC from the previous declaration if it was specified
3704
// there but not here.
3705
NewTypeInfo = NewTypeInfo.withCallingConv(OldTypeInfo.getCC());
3706
RequiresAdjustment = true;
3707
} else if (Old->getBuiltinID()) {
3708
// Builtin attribute isn't propagated to the new one yet at this point,
3709
// so we check if the old one is a builtin.
3710
3711
// Calling Conventions on a Builtin aren't really useful and setting a
3712
// default calling convention and cdecl'ing some builtin redeclarations is
3713
// common, so warn and ignore the calling convention on the redeclaration.
3714
Diag(New->getLocation(), diag::warn_cconv_unsupported)
3715
<< FunctionType::getNameForCallConv(NewTypeInfo.getCC())
3716
<< (int)CallingConventionIgnoredReason::BuiltinFunction;
3717
NewTypeInfo = NewTypeInfo.withCallingConv(OldTypeInfo.getCC());
3718
RequiresAdjustment = true;
3719
} else {
3720
// Calling conventions aren't compatible, so complain.
3721
bool FirstCCExplicit = getCallingConvAttributedType(First->getType());
3722
Diag(New->getLocation(), diag::err_cconv_change)
3723
<< FunctionType::getNameForCallConv(NewTypeInfo.getCC())
3724
<< !FirstCCExplicit
3725
<< (!FirstCCExplicit ? "" :
3726
FunctionType::getNameForCallConv(FI.getCC()));
3727
3728
// Put the note on the first decl, since it is the one that matters.
3729
Diag(First->getLocation(), diag::note_previous_declaration);
3730
return true;
3731
}
3732
}
3733
3734
// FIXME: diagnose the other way around?
3735
if (OldTypeInfo.getNoReturn() && !NewTypeInfo.getNoReturn()) {
3736
NewTypeInfo = NewTypeInfo.withNoReturn(true);
3737
RequiresAdjustment = true;
3738
}
3739
3740
// Merge regparm attribute.
3741
if (OldTypeInfo.getHasRegParm() != NewTypeInfo.getHasRegParm() ||
3742
OldTypeInfo.getRegParm() != NewTypeInfo.getRegParm()) {
3743
if (NewTypeInfo.getHasRegParm()) {
3744
Diag(New->getLocation(), diag::err_regparm_mismatch)
3745
<< NewType->getRegParmType()
3746
<< OldType->getRegParmType();
3747
Diag(OldLocation, diag::note_previous_declaration);
3748
return true;
3749
}
3750
3751
NewTypeInfo = NewTypeInfo.withRegParm(OldTypeInfo.getRegParm());
3752
RequiresAdjustment = true;
3753
}
3754
3755
// Merge ns_returns_retained attribute.
3756
if (OldTypeInfo.getProducesResult() != NewTypeInfo.getProducesResult()) {
3757
if (NewTypeInfo.getProducesResult()) {
3758
Diag(New->getLocation(), diag::err_function_attribute_mismatch)
3759
<< "'ns_returns_retained'";
3760
Diag(OldLocation, diag::note_previous_declaration);
3761
return true;
3762
}
3763
3764
NewTypeInfo = NewTypeInfo.withProducesResult(true);
3765
RequiresAdjustment = true;
3766
}
3767
3768
if (OldTypeInfo.getNoCallerSavedRegs() !=
3769
NewTypeInfo.getNoCallerSavedRegs()) {
3770
if (NewTypeInfo.getNoCallerSavedRegs()) {
3771
AnyX86NoCallerSavedRegistersAttr *Attr =
3772
New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3773
Diag(New->getLocation(), diag::err_function_attribute_mismatch) << Attr;
3774
Diag(OldLocation, diag::note_previous_declaration);
3775
return true;
3776
}
3777
3778
NewTypeInfo = NewTypeInfo.withNoCallerSavedRegs(true);
3779
RequiresAdjustment = true;
3780
}
3781
3782
if (RequiresAdjustment) {
3783
const FunctionType *AdjustedType = New->getType()->getAs<FunctionType>();
3784
AdjustedType = Context.adjustFunctionType(AdjustedType, NewTypeInfo);
3785
New->setType(QualType(AdjustedType, 0));
3786
NewQType = Context.getCanonicalType(New->getType());
3787
}
3788
3789
// If this redeclaration makes the function inline, we may need to add it to
3790
// UndefinedButUsed.
3791
if (!Old->isInlined() && New->isInlined() &&
3792
!New->hasAttr<GNUInlineAttr>() &&
3793
!getLangOpts().GNUInline &&
3794
Old->isUsed(false) &&
3795
!Old->isDefined() && !New->isThisDeclarationADefinition())
3796
UndefinedButUsed.insert(std::make_pair(Old->getCanonicalDecl(),
3797
SourceLocation()));
3798
3799
// If this redeclaration makes it newly gnu_inline, we don't want to warn
3800
// about it.
3801
if (New->hasAttr<GNUInlineAttr>() &&
3802
Old->isInlined() && !Old->hasAttr<GNUInlineAttr>()) {
3803
UndefinedButUsed.erase(Old->getCanonicalDecl());
3804
}
3805
3806
// If pass_object_size params don't match up perfectly, this isn't a valid
3807
// redeclaration.
3808
if (Old->getNumParams() > 0 && Old->getNumParams() == New->getNumParams() &&
3809
!hasIdenticalPassObjectSizeAttrs(Old, New)) {
3810
Diag(New->getLocation(), diag::err_different_pass_object_size_params)
3811
<< New->getDeclName();
3812
Diag(OldLocation, PrevDiag) << Old << Old->getType();
3813
return true;
3814
}
3815
3816
QualType OldQTypeForComparison = OldQType;
3817
if (Context.hasAnyFunctionEffects()) {
3818
const auto OldFX = Old->getFunctionEffects();
3819
const auto NewFX = New->getFunctionEffects();
3820
if (OldFX != NewFX) {
3821
const auto Diffs = FunctionEffectDifferences(OldFX, NewFX);
3822
for (const auto &Diff : Diffs) {
3823
if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *New, NewFX)) {
3824
Diag(New->getLocation(),
3825
diag::warn_mismatched_func_effect_redeclaration)
3826
<< Diff.effectName();
3827
Diag(Old->getLocation(), diag::note_previous_declaration);
3828
}
3829
}
3830
// Following a warning, we could skip merging effects from the previous
3831
// declaration, but that would trigger an additional "conflicting types"
3832
// error.
3833
if (const auto *NewFPT = NewQType->getAs<FunctionProtoType>()) {
3834
FunctionEffectSet::Conflicts MergeErrs;
3835
FunctionEffectSet MergedFX =
3836
FunctionEffectSet::getUnion(OldFX, NewFX, MergeErrs);
3837
if (!MergeErrs.empty())
3838
diagnoseFunctionEffectMergeConflicts(MergeErrs, New->getLocation(),
3839
Old->getLocation());
3840
3841
FunctionProtoType::ExtProtoInfo EPI = NewFPT->getExtProtoInfo();
3842
EPI.FunctionEffects = FunctionEffectsRef(MergedFX);
3843
QualType ModQT = Context.getFunctionType(NewFPT->getReturnType(),
3844
NewFPT->getParamTypes(), EPI);
3845
3846
New->setType(ModQT);
3847
NewQType = New->getType();
3848
3849
// Revise OldQTForComparison to include the merged effects,
3850
// so as not to fail due to differences later.
3851
if (const auto *OldFPT = OldQType->getAs<FunctionProtoType>()) {
3852
EPI = OldFPT->getExtProtoInfo();
3853
EPI.FunctionEffects = FunctionEffectsRef(MergedFX);
3854
OldQTypeForComparison = Context.getFunctionType(
3855
OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
3856
}
3857
}
3858
}
3859
}
3860
3861
if (getLangOpts().CPlusPlus) {
3862
OldQType = Context.getCanonicalType(Old->getType());
3863
NewQType = Context.getCanonicalType(New->getType());
3864
3865
// Go back to the type source info to compare the declared return types,
3866
// per C++1y [dcl.type.auto]p13:
3867
// Redeclarations or specializations of a function or function template
3868
// with a declared return type that uses a placeholder type shall also
3869
// use that placeholder, not a deduced type.
3870
QualType OldDeclaredReturnType = Old->getDeclaredReturnType();
3871
QualType NewDeclaredReturnType = New->getDeclaredReturnType();
3872
if (!Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
3873
canFullyTypeCheckRedeclaration(New, Old, NewDeclaredReturnType,
3874
OldDeclaredReturnType)) {
3875
QualType ResQT;
3876
if (NewDeclaredReturnType->isObjCObjectPointerType() &&
3877
OldDeclaredReturnType->isObjCObjectPointerType())
3878
// FIXME: This does the wrong thing for a deduced return type.
3879
ResQT = Context.mergeObjCGCQualifiers(NewQType, OldQType);
3880
if (ResQT.isNull()) {
3881
if (New->isCXXClassMember() && New->isOutOfLine())
3882
Diag(New->getLocation(), diag::err_member_def_does_not_match_ret_type)
3883
<< New << New->getReturnTypeSourceRange();
3884
else
3885
Diag(New->getLocation(), diag::err_ovl_diff_return_type)
3886
<< New->getReturnTypeSourceRange();
3887
Diag(OldLocation, PrevDiag) << Old << Old->getType()
3888
<< Old->getReturnTypeSourceRange();
3889
return true;
3890
}
3891
else
3892
NewQType = ResQT;
3893
}
3894
3895
QualType OldReturnType = OldType->getReturnType();
3896
QualType NewReturnType = cast<FunctionType>(NewQType)->getReturnType();
3897
if (OldReturnType != NewReturnType) {
3898
// If this function has a deduced return type and has already been
3899
// defined, copy the deduced value from the old declaration.
3900
AutoType *OldAT = Old->getReturnType()->getContainedAutoType();
3901
if (OldAT && OldAT->isDeduced()) {
3902
QualType DT = OldAT->getDeducedType();
3903
if (DT.isNull()) {
3904
New->setType(SubstAutoTypeDependent(New->getType()));
3905
NewQType = Context.getCanonicalType(SubstAutoTypeDependent(NewQType));
3906
} else {
3907
New->setType(SubstAutoType(New->getType(), DT));
3908
NewQType = Context.getCanonicalType(SubstAutoType(NewQType, DT));
3909
}
3910
}
3911
}
3912
3913
const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
3914
CXXMethodDecl *NewMethod = dyn_cast<CXXMethodDecl>(New);
3915
if (OldMethod && NewMethod) {
3916
// Preserve triviality.
3917
NewMethod->setTrivial(OldMethod->isTrivial());
3918
3919
// MSVC allows explicit template specialization at class scope:
3920
// 2 CXXMethodDecls referring to the same function will be injected.
3921
// We don't want a redeclaration error.
3922
bool IsClassScopeExplicitSpecialization =
3923
OldMethod->isFunctionTemplateSpecialization() &&
3924
NewMethod->isFunctionTemplateSpecialization();
3925
bool isFriend = NewMethod->getFriendObjectKind();
3926
3927
if (!isFriend && NewMethod->getLexicalDeclContext()->isRecord() &&
3928
!IsClassScopeExplicitSpecialization) {
3929
// -- Member function declarations with the same name and the
3930
// same parameter types cannot be overloaded if any of them
3931
// is a static member function declaration.
3932
if (OldMethod->isStatic() != NewMethod->isStatic()) {
3933
Diag(New->getLocation(), diag::err_ovl_static_nonstatic_member);
3934
Diag(OldLocation, PrevDiag) << Old << Old->getType();
3935
return true;
3936
}
3937
3938
// C++ [class.mem]p1:
3939
// [...] A member shall not be declared twice in the
3940
// member-specification, except that a nested class or member
3941
// class template can be declared and then later defined.
3942
if (!inTemplateInstantiation()) {
3943
unsigned NewDiag;
3944
if (isa<CXXConstructorDecl>(OldMethod))
3945
NewDiag = diag::err_constructor_redeclared;
3946
else if (isa<CXXDestructorDecl>(NewMethod))
3947
NewDiag = diag::err_destructor_redeclared;
3948
else if (isa<CXXConversionDecl>(NewMethod))
3949
NewDiag = diag::err_conv_function_redeclared;
3950
else
3951
NewDiag = diag::err_member_redeclared;
3952
3953
Diag(New->getLocation(), NewDiag);
3954
} else {
3955
Diag(New->getLocation(), diag::err_member_redeclared_in_instantiation)
3956
<< New << New->getType();
3957
}
3958
Diag(OldLocation, PrevDiag) << Old << Old->getType();
3959
return true;
3960
3961
// Complain if this is an explicit declaration of a special
3962
// member that was initially declared implicitly.
3963
//
3964
// As an exception, it's okay to befriend such methods in order
3965
// to permit the implicit constructor/destructor/operator calls.
3966
} else if (OldMethod->isImplicit()) {
3967
if (isFriend) {
3968
NewMethod->setImplicit();
3969
} else {
3970
Diag(NewMethod->getLocation(),
3971
diag::err_definition_of_implicitly_declared_member)
3972
<< New << llvm::to_underlying(getSpecialMember(OldMethod));
3973
return true;
3974
}
3975
} else if (OldMethod->getFirstDecl()->isExplicitlyDefaulted() && !isFriend) {
3976
Diag(NewMethod->getLocation(),
3977
diag::err_definition_of_explicitly_defaulted_member)
3978
<< llvm::to_underlying(getSpecialMember(OldMethod));
3979
return true;
3980
}
3981
}
3982
3983
// C++1z [over.load]p2
3984
// Certain function declarations cannot be overloaded:
3985
// -- Function declarations that differ only in the return type,
3986
// the exception specification, or both cannot be overloaded.
3987
3988
// Check the exception specifications match. This may recompute the type of
3989
// both Old and New if it resolved exception specifications, so grab the
3990
// types again after this. Because this updates the type, we do this before
3991
// any of the other checks below, which may update the "de facto" NewQType
3992
// but do not necessarily update the type of New.
3993
if (CheckEquivalentExceptionSpec(Old, New))
3994
return true;
3995
3996
// C++11 [dcl.attr.noreturn]p1:
3997
// The first declaration of a function shall specify the noreturn
3998
// attribute if any declaration of that function specifies the noreturn
3999
// attribute.
4000
if (const auto *NRA = New->getAttr<CXX11NoReturnAttr>())
4001
if (!Old->hasAttr<CXX11NoReturnAttr>()) {
4002
Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4003
<< NRA;
4004
Diag(Old->getLocation(), diag::note_previous_declaration);
4005
}
4006
4007
// C++11 [dcl.attr.depend]p2:
4008
// The first declaration of a function shall specify the
4009
// carries_dependency attribute for its declarator-id if any declaration
4010
// of the function specifies the carries_dependency attribute.
4011
const CarriesDependencyAttr *CDA = New->getAttr<CarriesDependencyAttr>();
4012
if (CDA && !Old->hasAttr<CarriesDependencyAttr>()) {
4013
Diag(CDA->getLocation(),
4014
diag::err_carries_dependency_missing_on_first_decl) << 0/*Function*/;
4015
Diag(Old->getFirstDecl()->getLocation(),
4016
diag::note_carries_dependency_missing_first_decl) << 0/*Function*/;
4017
}
4018
4019
// (C++98 8.3.5p3):
4020
// All declarations for a function shall agree exactly in both the
4021
// return type and the parameter-type-list.
4022
// We also want to respect all the extended bits except noreturn.
4023
4024
// noreturn should now match unless the old type info didn't have it.
4025
if (!OldTypeInfo.getNoReturn() && NewTypeInfo.getNoReturn()) {
4026
auto *OldType = OldQTypeForComparison->castAs<FunctionProtoType>();
4027
const FunctionType *OldTypeForComparison
4028
= Context.adjustFunctionType(OldType, OldTypeInfo.withNoReturn(true));
4029
OldQTypeForComparison = QualType(OldTypeForComparison, 0);
4030
assert(OldQTypeForComparison.isCanonical());
4031
}
4032
4033
if (haveIncompatibleLanguageLinkages(Old, New)) {
4034
// As a special case, retain the language linkage from previous
4035
// declarations of a friend function as an extension.
4036
//
4037
// This liberal interpretation of C++ [class.friend]p3 matches GCC/MSVC
4038
// and is useful because there's otherwise no way to specify language
4039
// linkage within class scope.
4040
//
4041
// Check cautiously as the friend object kind isn't yet complete.
4042
if (New->getFriendObjectKind() != Decl::FOK_None) {
4043
Diag(New->getLocation(), diag::ext_retained_language_linkage) << New;
4044
Diag(OldLocation, PrevDiag);
4045
} else {
4046
Diag(New->getLocation(), diag::err_different_language_linkage) << New;
4047
Diag(OldLocation, PrevDiag);
4048
return true;
4049
}
4050
}
4051
4052
// If the function types are compatible, merge the declarations. Ignore the
4053
// exception specifier because it was already checked above in
4054
// CheckEquivalentExceptionSpec, and we don't want follow-on diagnostics
4055
// about incompatible types under -fms-compatibility.
4056
if (Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4057
NewQType))
4058
return MergeCompatibleFunctionDecls(New, Old, S, MergeTypeWithOld);
4059
4060
// If the types are imprecise (due to dependent constructs in friends or
4061
// local extern declarations), it's OK if they differ. We'll check again
4062
// during instantiation.
4063
if (!canFullyTypeCheckRedeclaration(New, Old, NewQType, OldQType))
4064
return false;
4065
4066
// Fall through for conflicting redeclarations and redefinitions.
4067
}
4068
4069
// C: Function types need to be compatible, not identical. This handles
4070
// duplicate function decls like "void f(int); void f(enum X);" properly.
4071
if (!getLangOpts().CPlusPlus) {
4072
// C99 6.7.5.3p15: ...If one type has a parameter type list and the other
4073
// type is specified by a function definition that contains a (possibly
4074
// empty) identifier list, both shall agree in the number of parameters
4075
// and the type of each parameter shall be compatible with the type that
4076
// results from the application of default argument promotions to the
4077
// type of the corresponding identifier. ...
4078
// This cannot be handled by ASTContext::typesAreCompatible() because that
4079
// doesn't know whether the function type is for a definition or not when
4080
// eventually calling ASTContext::mergeFunctionTypes(). The only situation
4081
// we need to cover here is that the number of arguments agree as the
4082
// default argument promotion rules were already checked by
4083
// ASTContext::typesAreCompatible().
4084
if (Old->hasPrototype() && !New->hasWrittenPrototype() && NewDeclIsDefn &&
4085
Old->getNumParams() != New->getNumParams() && !Old->isImplicit()) {
4086
if (Old->hasInheritedPrototype())
4087
Old = Old->getCanonicalDecl();
4088
Diag(New->getLocation(), diag::err_conflicting_types) << New;
4089
Diag(Old->getLocation(), PrevDiag) << Old << Old->getType();
4090
return true;
4091
}
4092
4093
// If we are merging two functions where only one of them has a prototype,
4094
// we may have enough information to decide to issue a diagnostic that the
4095
// function without a prototype will change behavior in C23. This handles
4096
// cases like:
4097
// void i(); void i(int j);
4098
// void i(int j); void i();
4099
// void i(); void i(int j) {}
4100
// See ActOnFinishFunctionBody() for other cases of the behavior change
4101
// diagnostic. See GetFullTypeForDeclarator() for handling of a function
4102
// type without a prototype.
4103
if (New->hasWrittenPrototype() != Old->hasWrittenPrototype() &&
4104
!New->isImplicit() && !Old->isImplicit()) {
4105
const FunctionDecl *WithProto, *WithoutProto;
4106
if (New->hasWrittenPrototype()) {
4107
WithProto = New;
4108
WithoutProto = Old;
4109
} else {
4110
WithProto = Old;
4111
WithoutProto = New;
4112
}
4113
4114
if (WithProto->getNumParams() != 0) {
4115
if (WithoutProto->getBuiltinID() == 0 && !WithoutProto->isImplicit()) {
4116
// The one without the prototype will be changing behavior in C23, so
4117
// warn about that one so long as it's a user-visible declaration.
4118
bool IsWithoutProtoADef = false, IsWithProtoADef = false;
4119
if (WithoutProto == New)
4120
IsWithoutProtoADef = NewDeclIsDefn;
4121
else
4122
IsWithProtoADef = NewDeclIsDefn;
4123
Diag(WithoutProto->getLocation(),
4124
diag::warn_non_prototype_changes_behavior)
4125
<< IsWithoutProtoADef << (WithoutProto->getNumParams() ? 0 : 1)
4126
<< (WithoutProto == Old) << IsWithProtoADef;
4127
4128
// The reason the one without the prototype will be changing behavior
4129
// is because of the one with the prototype, so note that so long as
4130
// it's a user-visible declaration. There is one exception to this:
4131
// when the new declaration is a definition without a prototype, the
4132
// old declaration with a prototype is not the cause of the issue,
4133
// and that does not need to be noted because the one with a
4134
// prototype will not change behavior in C23.
4135
if (WithProto->getBuiltinID() == 0 && !WithProto->isImplicit() &&
4136
!IsWithoutProtoADef)
4137
Diag(WithProto->getLocation(), diag::note_conflicting_prototype);
4138
}
4139
}
4140
}
4141
4142
if (Context.typesAreCompatible(OldQType, NewQType)) {
4143
const FunctionType *OldFuncType = OldQType->getAs<FunctionType>();
4144
const FunctionType *NewFuncType = NewQType->getAs<FunctionType>();
4145
const FunctionProtoType *OldProto = nullptr;
4146
if (MergeTypeWithOld && isa<FunctionNoProtoType>(NewFuncType) &&
4147
(OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4148
// The old declaration provided a function prototype, but the
4149
// new declaration does not. Merge in the prototype.
4150
assert(!OldProto->hasExceptionSpec() && "Exception spec in C");
4151
NewQType = Context.getFunctionType(NewFuncType->getReturnType(),
4152
OldProto->getParamTypes(),
4153
OldProto->getExtProtoInfo());
4154
New->setType(NewQType);
4155
New->setHasInheritedPrototype();
4156
4157
// Synthesize parameters with the same types.
4158
SmallVector<ParmVarDecl *, 16> Params;
4159
for (const auto &ParamType : OldProto->param_types()) {
4160
ParmVarDecl *Param = ParmVarDecl::Create(
4161
Context, New, SourceLocation(), SourceLocation(), nullptr,
4162
ParamType, /*TInfo=*/nullptr, SC_None, nullptr);
4163
Param->setScopeInfo(0, Params.size());
4164
Param->setImplicit();
4165
Params.push_back(Param);
4166
}
4167
4168
New->setParams(Params);
4169
}
4170
4171
return MergeCompatibleFunctionDecls(New, Old, S, MergeTypeWithOld);
4172
}
4173
}
4174
4175
// Check if the function types are compatible when pointer size address
4176
// spaces are ignored.
4177
if (Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4178
return false;
4179
4180
// GNU C permits a K&R definition to follow a prototype declaration
4181
// if the declared types of the parameters in the K&R definition
4182
// match the types in the prototype declaration, even when the
4183
// promoted types of the parameters from the K&R definition differ
4184
// from the types in the prototype. GCC then keeps the types from
4185
// the prototype.
4186
//
4187
// If a variadic prototype is followed by a non-variadic K&R definition,
4188
// the K&R definition becomes variadic. This is sort of an edge case, but
4189
// it's legal per the standard depending on how you read C99 6.7.5.3p15 and
4190
// C99 6.9.1p8.
4191
if (!getLangOpts().CPlusPlus &&
4192
Old->hasPrototype() && !New->hasPrototype() &&
4193
New->getType()->getAs<FunctionProtoType>() &&
4194
Old->getNumParams() == New->getNumParams()) {
4195
SmallVector<QualType, 16> ArgTypes;
4196
SmallVector<GNUCompatibleParamWarning, 16> Warnings;
4197
const FunctionProtoType *OldProto
4198
= Old->getType()->getAs<FunctionProtoType>();
4199
const FunctionProtoType *NewProto
4200
= New->getType()->getAs<FunctionProtoType>();
4201
4202
// Determine whether this is the GNU C extension.
4203
QualType MergedReturn = Context.mergeTypes(OldProto->getReturnType(),
4204
NewProto->getReturnType());
4205
bool LooseCompatible = !MergedReturn.isNull();
4206
for (unsigned Idx = 0, End = Old->getNumParams();
4207
LooseCompatible && Idx != End; ++Idx) {
4208
ParmVarDecl *OldParm = Old->getParamDecl(Idx);
4209
ParmVarDecl *NewParm = New->getParamDecl(Idx);
4210
if (Context.typesAreCompatible(OldParm->getType(),
4211
NewProto->getParamType(Idx))) {
4212
ArgTypes.push_back(NewParm->getType());
4213
} else if (Context.typesAreCompatible(OldParm->getType(),
4214
NewParm->getType(),
4215
/*CompareUnqualified=*/true)) {
4216
GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4217
NewProto->getParamType(Idx) };
4218
Warnings.push_back(Warn);
4219
ArgTypes.push_back(NewParm->getType());
4220
} else
4221
LooseCompatible = false;
4222
}
4223
4224
if (LooseCompatible) {
4225
for (unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4226
Diag(Warnings[Warn].NewParm->getLocation(),
4227
diag::ext_param_promoted_not_compatible_with_prototype)
4228
<< Warnings[Warn].PromotedType
4229
<< Warnings[Warn].OldParm->getType();
4230
if (Warnings[Warn].OldParm->getLocation().isValid())
4231
Diag(Warnings[Warn].OldParm->getLocation(),
4232
diag::note_previous_declaration);
4233
}
4234
4235
if (MergeTypeWithOld)
4236
New->setType(Context.getFunctionType(MergedReturn, ArgTypes,
4237
OldProto->getExtProtoInfo()));
4238
return MergeCompatibleFunctionDecls(New, Old, S, MergeTypeWithOld);
4239
}
4240
4241
// Fall through to diagnose conflicting types.
4242
}
4243
4244
// A function that has already been declared has been redeclared or
4245
// defined with a different type; show an appropriate diagnostic.
4246
4247
// If the previous declaration was an implicitly-generated builtin
4248
// declaration, then at the very least we should use a specialized note.
4249
unsigned BuiltinID;
4250
if (Old->isImplicit() && (BuiltinID = Old->getBuiltinID())) {
4251
// If it's actually a library-defined builtin function like 'malloc'
4252
// or 'printf', just warn about the incompatible redeclaration.
4253
if (Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4254
Diag(New->getLocation(), diag::warn_redecl_library_builtin) << New;
4255
Diag(OldLocation, diag::note_previous_builtin_declaration)
4256
<< Old << Old->getType();
4257
return false;
4258
}
4259
4260
PrevDiag = diag::note_previous_builtin_declaration;
4261
}
4262
4263
Diag(New->getLocation(), diag::err_conflicting_types) << New->getDeclName();
4264
Diag(OldLocation, PrevDiag) << Old << Old->getType();
4265
return true;
4266
}
4267
4268
bool Sema::MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old,
4269
Scope *S, bool MergeTypeWithOld) {
4270
// Merge the attributes
4271
mergeDeclAttributes(New, Old);
4272
4273
// Merge "pure" flag.
4274
if (Old->isPureVirtual())
4275
New->setIsPureVirtual();
4276
4277
// Merge "used" flag.
4278
if (Old->getMostRecentDecl()->isUsed(false))
4279
New->setIsUsed();
4280
4281
// Merge attributes from the parameters. These can mismatch with K&R
4282
// declarations.
4283
if (New->getNumParams() == Old->getNumParams())
4284
for (unsigned i = 0, e = New->getNumParams(); i != e; ++i) {
4285
ParmVarDecl *NewParam = New->getParamDecl(i);
4286
ParmVarDecl *OldParam = Old->getParamDecl(i);
4287
mergeParamDeclAttributes(NewParam, OldParam, *this);
4288
mergeParamDeclTypes(NewParam, OldParam, *this);
4289
}
4290
4291
if (getLangOpts().CPlusPlus)
4292
return MergeCXXFunctionDecl(New, Old, S);
4293
4294
// Merge the function types so the we get the composite types for the return
4295
// and argument types. Per C11 6.2.7/4, only update the type if the old decl
4296
// was visible.
4297
QualType Merged = Context.mergeTypes(Old->getType(), New->getType());
4298
if (!Merged.isNull() && MergeTypeWithOld)
4299
New->setType(Merged);
4300
4301
return false;
4302
}
4303
4304
void Sema::mergeObjCMethodDecls(ObjCMethodDecl *newMethod,
4305
ObjCMethodDecl *oldMethod) {
4306
// Merge the attributes, including deprecated/unavailable
4307
AvailabilityMergeKind MergeKind =
4308
isa<ObjCProtocolDecl>(oldMethod->getDeclContext())
4309
? (oldMethod->isOptional() ? AMK_OptionalProtocolImplementation
4310
: AMK_ProtocolImplementation)
4311
: isa<ObjCImplDecl>(newMethod->getDeclContext()) ? AMK_Redeclaration
4312
: AMK_Override;
4313
4314
mergeDeclAttributes(newMethod, oldMethod, MergeKind);
4315
4316
// Merge attributes from the parameters.
4317
ObjCMethodDecl::param_const_iterator oi = oldMethod->param_begin(),
4318
oe = oldMethod->param_end();
4319
for (ObjCMethodDecl::param_iterator
4320
ni = newMethod->param_begin(), ne = newMethod->param_end();
4321
ni != ne && oi != oe; ++ni, ++oi)
4322
mergeParamDeclAttributes(*ni, *oi, *this);
4323
4324
ObjC().CheckObjCMethodOverride(newMethod, oldMethod);
4325
}
4326
4327
static void diagnoseVarDeclTypeMismatch(Sema &S, VarDecl *New, VarDecl* Old) {
4328
assert(!S.Context.hasSameType(New->getType(), Old->getType()));
4329
4330
S.Diag(New->getLocation(), New->isThisDeclarationADefinition()
4331
? diag::err_redefinition_different_type
4332
: diag::err_redeclaration_different_type)
4333
<< New->getDeclName() << New->getType() << Old->getType();
4334
4335
diag::kind PrevDiag;
4336
SourceLocation OldLocation;
4337
std::tie(PrevDiag, OldLocation)
4338
= getNoteDiagForInvalidRedeclaration(Old, New);
4339
S.Diag(OldLocation, PrevDiag) << Old << Old->getType();
4340
New->setInvalidDecl();
4341
}
4342
4343
void Sema::MergeVarDeclTypes(VarDecl *New, VarDecl *Old,
4344
bool MergeTypeWithOld) {
4345
if (New->isInvalidDecl() || Old->isInvalidDecl() || New->getType()->containsErrors() || Old->getType()->containsErrors())
4346
return;
4347
4348
QualType MergedT;
4349
if (getLangOpts().CPlusPlus) {
4350
if (New->getType()->isUndeducedType()) {
4351
// We don't know what the new type is until the initializer is attached.
4352
return;
4353
} else if (Context.hasSameType(New->getType(), Old->getType())) {
4354
// These could still be something that needs exception specs checked.
4355
return MergeVarDeclExceptionSpecs(New, Old);
4356
}
4357
// C++ [basic.link]p10:
4358
// [...] the types specified by all declarations referring to a given
4359
// object or function shall be identical, except that declarations for an
4360
// array object can specify array types that differ by the presence or
4361
// absence of a major array bound (8.3.4).
4362
else if (Old->getType()->isArrayType() && New->getType()->isArrayType()) {
4363
const ArrayType *OldArray = Context.getAsArrayType(Old->getType());
4364
const ArrayType *NewArray = Context.getAsArrayType(New->getType());
4365
4366
// We are merging a variable declaration New into Old. If it has an array
4367
// bound, and that bound differs from Old's bound, we should diagnose the
4368
// mismatch.
4369
if (!NewArray->isIncompleteArrayType() && !NewArray->isDependentType()) {
4370
for (VarDecl *PrevVD = Old->getMostRecentDecl(); PrevVD;
4371
PrevVD = PrevVD->getPreviousDecl()) {
4372
QualType PrevVDTy = PrevVD->getType();
4373
if (PrevVDTy->isIncompleteArrayType() || PrevVDTy->isDependentType())
4374
continue;
4375
4376
if (!Context.hasSameType(New->getType(), PrevVDTy))
4377
return diagnoseVarDeclTypeMismatch(*this, New, PrevVD);
4378
}
4379
}
4380
4381
if (OldArray->isIncompleteArrayType() && NewArray->isArrayType()) {
4382
if (Context.hasSameType(OldArray->getElementType(),
4383
NewArray->getElementType()))
4384
MergedT = New->getType();
4385
}
4386
// FIXME: Check visibility. New is hidden but has a complete type. If New
4387
// has no array bound, it should not inherit one from Old, if Old is not
4388
// visible.
4389
else if (OldArray->isArrayType() && NewArray->isIncompleteArrayType()) {
4390
if (Context.hasSameType(OldArray->getElementType(),
4391
NewArray->getElementType()))
4392
MergedT = Old->getType();
4393
}
4394
}
4395
else if (New->getType()->isObjCObjectPointerType() &&
4396
Old->getType()->isObjCObjectPointerType()) {
4397
MergedT = Context.mergeObjCGCQualifiers(New->getType(),
4398
Old->getType());
4399
}
4400
} else {
4401
// C 6.2.7p2:
4402
// All declarations that refer to the same object or function shall have
4403
// compatible type.
4404
MergedT = Context.mergeTypes(New->getType(), Old->getType());
4405
}
4406
if (MergedT.isNull()) {
4407
// It's OK if we couldn't merge types if either type is dependent, for a
4408
// block-scope variable. In other cases (static data members of class
4409
// templates, variable templates, ...), we require the types to be
4410
// equivalent.
4411
// FIXME: The C++ standard doesn't say anything about this.
4412
if ((New->getType()->isDependentType() ||
4413
Old->getType()->isDependentType()) && New->isLocalVarDecl()) {
4414
// If the old type was dependent, we can't merge with it, so the new type
4415
// becomes dependent for now. We'll reproduce the original type when we
4416
// instantiate the TypeSourceInfo for the variable.
4417
if (!New->getType()->isDependentType() && MergeTypeWithOld)
4418
New->setType(Context.DependentTy);
4419
return;
4420
}
4421
return diagnoseVarDeclTypeMismatch(*this, New, Old);
4422
}
4423
4424
// Don't actually update the type on the new declaration if the old
4425
// declaration was an extern declaration in a different scope.
4426
if (MergeTypeWithOld)
4427
New->setType(MergedT);
4428
}
4429
4430
static bool mergeTypeWithPrevious(Sema &S, VarDecl *NewVD, VarDecl *OldVD,
4431
LookupResult &Previous) {
4432
// C11 6.2.7p4:
4433
// For an identifier with internal or external linkage declared
4434
// in a scope in which a prior declaration of that identifier is
4435
// visible, if the prior declaration specifies internal or
4436
// external linkage, the type of the identifier at the later
4437
// declaration becomes the composite type.
4438
//
4439
// If the variable isn't visible, we do not merge with its type.
4440
if (Previous.isShadowed())
4441
return false;
4442
4443
if (S.getLangOpts().CPlusPlus) {
4444
// C++11 [dcl.array]p3:
4445
// If there is a preceding declaration of the entity in the same
4446
// scope in which the bound was specified, an omitted array bound
4447
// is taken to be the same as in that earlier declaration.
4448
return NewVD->isPreviousDeclInSameBlockScope() ||
4449
(!OldVD->getLexicalDeclContext()->isFunctionOrMethod() &&
4450
!NewVD->getLexicalDeclContext()->isFunctionOrMethod());
4451
} else {
4452
// If the old declaration was function-local, don't merge with its
4453
// type unless we're in the same function.
4454
return !OldVD->getLexicalDeclContext()->isFunctionOrMethod() ||
4455
OldVD->getLexicalDeclContext() == NewVD->getLexicalDeclContext();
4456
}
4457
}
4458
4459
void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
4460
// If the new decl is already invalid, don't do any other checking.
4461
if (New->isInvalidDecl())
4462
return;
4463
4464
if (!shouldLinkPossiblyHiddenDecl(Previous, New))
4465
return;
4466
4467
VarTemplateDecl *NewTemplate = New->getDescribedVarTemplate();
4468
4469
// Verify the old decl was also a variable or variable template.
4470
VarDecl *Old = nullptr;
4471
VarTemplateDecl *OldTemplate = nullptr;
4472
if (Previous.isSingleResult()) {
4473
if (NewTemplate) {
4474
OldTemplate = dyn_cast<VarTemplateDecl>(Previous.getFoundDecl());
4475
Old = OldTemplate ? OldTemplate->getTemplatedDecl() : nullptr;
4476
4477
if (auto *Shadow =
4478
dyn_cast<UsingShadowDecl>(Previous.getRepresentativeDecl()))
4479
if (checkUsingShadowRedecl<VarTemplateDecl>(*this, Shadow, NewTemplate))
4480
return New->setInvalidDecl();
4481
} else {
4482
Old = dyn_cast<VarDecl>(Previous.getFoundDecl());
4483
4484
if (auto *Shadow =
4485
dyn_cast<UsingShadowDecl>(Previous.getRepresentativeDecl()))
4486
if (checkUsingShadowRedecl<VarDecl>(*this, Shadow, New))
4487
return New->setInvalidDecl();
4488
}
4489
}
4490
if (!Old) {
4491
Diag(New->getLocation(), diag::err_redefinition_different_kind)
4492
<< New->getDeclName();
4493
notePreviousDefinition(Previous.getRepresentativeDecl(),
4494
New->getLocation());
4495
return New->setInvalidDecl();
4496
}
4497
4498
// If the old declaration was found in an inline namespace and the new
4499
// declaration was qualified, update the DeclContext to match.
4500
adjustDeclContextForDeclaratorDecl(New, Old);
4501
4502
// Ensure the template parameters are compatible.
4503
if (NewTemplate &&
4504
!TemplateParameterListsAreEqual(NewTemplate->getTemplateParameters(),
4505
OldTemplate->getTemplateParameters(),
4506
/*Complain=*/true, TPL_TemplateMatch))
4507
return New->setInvalidDecl();
4508
4509
// C++ [class.mem]p1:
4510
// A member shall not be declared twice in the member-specification [...]
4511
//
4512
// Here, we need only consider static data members.
4513
if (Old->isStaticDataMember() && !New->isOutOfLine()) {
4514
Diag(New->getLocation(), diag::err_duplicate_member)
4515
<< New->getIdentifier();
4516
Diag(Old->getLocation(), diag::note_previous_declaration);
4517
New->setInvalidDecl();
4518
}
4519
4520
mergeDeclAttributes(New, Old);
4521
// Warn if an already-defined variable is made a weak_import in a subsequent
4522
// declaration
4523
if (New->hasAttr<WeakImportAttr>())
4524
for (auto *D = Old; D; D = D->getPreviousDecl()) {
4525
if (D->isThisDeclarationADefinition() != VarDecl::DeclarationOnly) {
4526
Diag(New->getLocation(), diag::warn_weak_import) << New->getDeclName();
4527
Diag(D->getLocation(), diag::note_previous_definition);
4528
// Remove weak_import attribute on new declaration.
4529
New->dropAttr<WeakImportAttr>();
4530
break;
4531
}
4532
}
4533
4534
if (const auto *ILA = New->getAttr<InternalLinkageAttr>())
4535
if (!Old->hasAttr<InternalLinkageAttr>()) {
4536
Diag(New->getLocation(), diag::err_attribute_missing_on_first_decl)
4537
<< ILA;
4538
Diag(Old->getLocation(), diag::note_previous_declaration);
4539
New->dropAttr<InternalLinkageAttr>();
4540
}
4541
4542
// Merge the types.
4543
VarDecl *MostRecent = Old->getMostRecentDecl();
4544
if (MostRecent != Old) {
4545
MergeVarDeclTypes(New, MostRecent,
4546
mergeTypeWithPrevious(*this, New, MostRecent, Previous));
4547
if (New->isInvalidDecl())
4548
return;
4549
}
4550
4551
MergeVarDeclTypes(New, Old, mergeTypeWithPrevious(*this, New, Old, Previous));
4552
if (New->isInvalidDecl())
4553
return;
4554
4555
diag::kind PrevDiag;
4556
SourceLocation OldLocation;
4557
std::tie(PrevDiag, OldLocation) =
4558
getNoteDiagForInvalidRedeclaration(Old, New);
4559
4560
// [dcl.stc]p8: Check if we have a non-static decl followed by a static.
4561
if (New->getStorageClass() == SC_Static &&
4562
!New->isStaticDataMember() &&
4563
Old->hasExternalFormalLinkage()) {
4564
if (getLangOpts().MicrosoftExt) {
4565
Diag(New->getLocation(), diag::ext_static_non_static)
4566
<< New->getDeclName();
4567
Diag(OldLocation, PrevDiag);
4568
} else {
4569
Diag(New->getLocation(), diag::err_static_non_static)
4570
<< New->getDeclName();
4571
Diag(OldLocation, PrevDiag);
4572
return New->setInvalidDecl();
4573
}
4574
}
4575
// C99 6.2.2p4:
4576
// For an identifier declared with the storage-class specifier
4577
// extern in a scope in which a prior declaration of that
4578
// identifier is visible,23) if the prior declaration specifies
4579
// internal or external linkage, the linkage of the identifier at
4580
// the later declaration is the same as the linkage specified at
4581
// the prior declaration. If no prior declaration is visible, or
4582
// if the prior declaration specifies no linkage, then the
4583
// identifier has external linkage.
4584
if (New->hasExternalStorage() && Old->hasLinkage())
4585
/* Okay */;
4586
else if (New->getCanonicalDecl()->getStorageClass() != SC_Static &&
4587
!New->isStaticDataMember() &&
4588
Old->getCanonicalDecl()->getStorageClass() == SC_Static) {
4589
Diag(New->getLocation(), diag::err_non_static_static) << New->getDeclName();
4590
Diag(OldLocation, PrevDiag);
4591
return New->setInvalidDecl();
4592
}
4593
4594
// Check if extern is followed by non-extern and vice-versa.
4595
if (New->hasExternalStorage() &&
4596
!Old->hasLinkage() && Old->isLocalVarDeclOrParm()) {
4597
Diag(New->getLocation(), diag::err_extern_non_extern) << New->getDeclName();
4598
Diag(OldLocation, PrevDiag);
4599
return New->setInvalidDecl();
4600
}
4601
if (Old->hasLinkage() && New->isLocalVarDeclOrParm() &&
4602
!New->hasExternalStorage()) {
4603
Diag(New->getLocation(), diag::err_non_extern_extern) << New->getDeclName();
4604
Diag(OldLocation, PrevDiag);
4605
return New->setInvalidDecl();
4606
}
4607
4608
if (CheckRedeclarationInModule(New, Old))
4609
return;
4610
4611
// Variables with external linkage are analyzed in FinalizeDeclaratorGroup.
4612
4613
// FIXME: The test for external storage here seems wrong? We still
4614
// need to check for mismatches.
4615
if (!New->hasExternalStorage() && !New->isFileVarDecl() &&
4616
// Don't complain about out-of-line definitions of static members.
4617
!(Old->getLexicalDeclContext()->isRecord() &&
4618
!New->getLexicalDeclContext()->isRecord())) {
4619
Diag(New->getLocation(), diag::err_redefinition) << New->getDeclName();
4620
Diag(OldLocation, PrevDiag);
4621
return New->setInvalidDecl();
4622
}
4623
4624
if (New->isInline() && !Old->getMostRecentDecl()->isInline()) {
4625
if (VarDecl *Def = Old->getDefinition()) {
4626
// C++1z [dcl.fcn.spec]p4:
4627
// If the definition of a variable appears in a translation unit before
4628
// its first declaration as inline, the program is ill-formed.
4629
Diag(New->getLocation(), diag::err_inline_decl_follows_def) << New;
4630
Diag(Def->getLocation(), diag::note_previous_definition);
4631
}
4632
}
4633
4634
// If this redeclaration makes the variable inline, we may need to add it to
4635
// UndefinedButUsed.
4636
if (!Old->isInline() && New->isInline() && Old->isUsed(false) &&
4637
!Old->getDefinition() && !New->isThisDeclarationADefinition())
4638
UndefinedButUsed.insert(std::make_pair(Old->getCanonicalDecl(),
4639
SourceLocation()));
4640
4641
if (New->getTLSKind() != Old->getTLSKind()) {
4642
if (!Old->getTLSKind()) {
4643
Diag(New->getLocation(), diag::err_thread_non_thread) << New->getDeclName();
4644
Diag(OldLocation, PrevDiag);
4645
} else if (!New->getTLSKind()) {
4646
Diag(New->getLocation(), diag::err_non_thread_thread) << New->getDeclName();
4647
Diag(OldLocation, PrevDiag);
4648
} else {
4649
// Do not allow redeclaration to change the variable between requiring
4650
// static and dynamic initialization.
4651
// FIXME: GCC allows this, but uses the TLS keyword on the first
4652
// declaration to determine the kind. Do we need to be compatible here?
4653
Diag(New->getLocation(), diag::err_thread_thread_different_kind)
4654
<< New->getDeclName() << (New->getTLSKind() == VarDecl::TLS_Dynamic);
4655
Diag(OldLocation, PrevDiag);
4656
}
4657
}
4658
4659
// C++ doesn't have tentative definitions, so go right ahead and check here.
4660
if (getLangOpts().CPlusPlus) {
4661
if (Old->isStaticDataMember() && Old->getCanonicalDecl()->isInline() &&
4662
Old->getCanonicalDecl()->isConstexpr()) {
4663
// This definition won't be a definition any more once it's been merged.
4664
Diag(New->getLocation(),
4665
diag::warn_deprecated_redundant_constexpr_static_def);
4666
} else if (New->isThisDeclarationADefinition() == VarDecl::Definition) {
4667
VarDecl *Def = Old->getDefinition();
4668
if (Def && checkVarDeclRedefinition(Def, New))
4669
return;
4670
}
4671
}
4672
4673
if (haveIncompatibleLanguageLinkages(Old, New)) {
4674
Diag(New->getLocation(), diag::err_different_language_linkage) << New;
4675
Diag(OldLocation, PrevDiag);
4676
New->setInvalidDecl();
4677
return;
4678
}
4679
4680
// Merge "used" flag.
4681
if (Old->getMostRecentDecl()->isUsed(false))
4682
New->setIsUsed();
4683
4684
// Keep a chain of previous declarations.
4685
New->setPreviousDecl(Old);
4686
if (NewTemplate)
4687
NewTemplate->setPreviousDecl(OldTemplate);
4688
4689
// Inherit access appropriately.
4690
New->setAccess(Old->getAccess());
4691
if (NewTemplate)
4692
NewTemplate->setAccess(New->getAccess());
4693
4694
if (Old->isInline())
4695
New->setImplicitlyInline();
4696
}
4697
4698
void Sema::notePreviousDefinition(const NamedDecl *Old, SourceLocation New) {
4699
SourceManager &SrcMgr = getSourceManager();
4700
auto FNewDecLoc = SrcMgr.getDecomposedLoc(New);
4701
auto FOldDecLoc = SrcMgr.getDecomposedLoc(Old->getLocation());
4702
auto *FNew = SrcMgr.getFileEntryForID(FNewDecLoc.first);
4703
auto FOld = SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4704
auto &HSI = PP.getHeaderSearchInfo();
4705
StringRef HdrFilename =
4706
SrcMgr.getFilename(SrcMgr.getSpellingLoc(Old->getLocation()));
4707
4708
auto noteFromModuleOrInclude = [&](Module *Mod,
4709
SourceLocation IncLoc) -> bool {
4710
// Redefinition errors with modules are common with non modular mapped
4711
// headers, example: a non-modular header H in module A that also gets
4712
// included directly in a TU. Pointing twice to the same header/definition
4713
// is confusing, try to get better diagnostics when modules is on.
4714
if (IncLoc.isValid()) {
4715
if (Mod) {
4716
Diag(IncLoc, diag::note_redefinition_modules_same_file)
4717
<< HdrFilename.str() << Mod->getFullModuleName();
4718
if (!Mod->DefinitionLoc.isInvalid())
4719
Diag(Mod->DefinitionLoc, diag::note_defined_here)
4720
<< Mod->getFullModuleName();
4721
} else {
4722
Diag(IncLoc, diag::note_redefinition_include_same_file)
4723
<< HdrFilename.str();
4724
}
4725
return true;
4726
}
4727
4728
return false;
4729
};
4730
4731
// Is it the same file and same offset? Provide more information on why
4732
// this leads to a redefinition error.
4733
if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4734
SourceLocation OldIncLoc = SrcMgr.getIncludeLoc(FOldDecLoc.first);
4735
SourceLocation NewIncLoc = SrcMgr.getIncludeLoc(FNewDecLoc.first);
4736
bool EmittedDiag =
4737
noteFromModuleOrInclude(Old->getOwningModule(), OldIncLoc);
4738
EmittedDiag |= noteFromModuleOrInclude(getCurrentModule(), NewIncLoc);
4739
4740
// If the header has no guards, emit a note suggesting one.
4741
if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4742
Diag(Old->getLocation(), diag::note_use_ifdef_guards);
4743
4744
if (EmittedDiag)
4745
return;
4746
}
4747
4748
// Redefinition coming from different files or couldn't do better above.
4749
if (Old->getLocation().isValid())
4750
Diag(Old->getLocation(), diag::note_previous_definition);
4751
}
4752
4753
bool Sema::checkVarDeclRedefinition(VarDecl *Old, VarDecl *New) {
4754
if (!hasVisibleDefinition(Old) &&
4755
(New->getFormalLinkage() == Linkage::Internal || New->isInline() ||
4756
isa<VarTemplateSpecializationDecl>(New) ||
4757
New->getDescribedVarTemplate() || New->getNumTemplateParameterLists() ||
4758
New->getDeclContext()->isDependentContext())) {
4759
// The previous definition is hidden, and multiple definitions are
4760
// permitted (in separate TUs). Demote this to a declaration.
4761
New->demoteThisDefinitionToDeclaration();
4762
4763
// Make the canonical definition visible.
4764
if (auto *OldTD = Old->getDescribedVarTemplate())
4765
makeMergedDefinitionVisible(OldTD);
4766
makeMergedDefinitionVisible(Old);
4767
return false;
4768
} else {
4769
Diag(New->getLocation(), diag::err_redefinition) << New;
4770
notePreviousDefinition(Old, New->getLocation());
4771
New->setInvalidDecl();
4772
return true;
4773
}
4774
}
4775
4776
Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
4777
DeclSpec &DS,
4778
const ParsedAttributesView &DeclAttrs,
4779
RecordDecl *&AnonRecord) {
4780
return ParsedFreeStandingDeclSpec(
4781
S, AS, DS, DeclAttrs, MultiTemplateParamsArg(), false, AnonRecord);
4782
}
4783
4784
// The MS ABI changed between VS2013 and VS2015 with regard to numbers used to
4785
// disambiguate entities defined in different scopes.
4786
// While the VS2015 ABI fixes potential miscompiles, it is also breaks
4787
// compatibility.
4788
// We will pick our mangling number depending on which version of MSVC is being
4789
// targeted.
4790
static unsigned getMSManglingNumber(const LangOptions &LO, Scope *S) {
4791
return LO.isCompatibleWithMSVC(LangOptions::MSVC2015)
4792
? S->getMSCurManglingNumber()
4793
: S->getMSLastManglingNumber();
4794
}
4795
4796
void Sema::handleTagNumbering(const TagDecl *Tag, Scope *TagScope) {
4797
if (!Context.getLangOpts().CPlusPlus)
4798
return;
4799
4800
if (isa<CXXRecordDecl>(Tag->getParent())) {
4801
// If this tag is the direct child of a class, number it if
4802
// it is anonymous.
4803
if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
4804
return;
4805
MangleNumberingContext &MCtx =
4806
Context.getManglingNumberContext(Tag->getParent());
4807
Context.setManglingNumber(
4808
Tag, MCtx.getManglingNumber(
4809
Tag, getMSManglingNumber(getLangOpts(), TagScope)));
4810
return;
4811
}
4812
4813
// If this tag isn't a direct child of a class, number it if it is local.
4814
MangleNumberingContext *MCtx;
4815
Decl *ManglingContextDecl;
4816
std::tie(MCtx, ManglingContextDecl) =
4817
getCurrentMangleNumberContext(Tag->getDeclContext());
4818
if (MCtx) {
4819
Context.setManglingNumber(
4820
Tag, MCtx->getManglingNumber(
4821
Tag, getMSManglingNumber(getLangOpts(), TagScope)));
4822
}
4823
}
4824
4825
namespace {
4826
struct NonCLikeKind {
4827
enum {
4828
None,
4829
BaseClass,
4830
DefaultMemberInit,
4831
Lambda,
4832
Friend,
4833
OtherMember,
4834
Invalid,
4835
} Kind = None;
4836
SourceRange Range;
4837
4838
explicit operator bool() { return Kind != None; }
4839
};
4840
}
4841
4842
/// Determine whether a class is C-like, according to the rules of C++
4843
/// [dcl.typedef] for anonymous classes with typedef names for linkage.
4844
static NonCLikeKind getNonCLikeKindForAnonymousStruct(const CXXRecordDecl *RD) {
4845
if (RD->isInvalidDecl())
4846
return {NonCLikeKind::Invalid, {}};
4847
4848
// C++ [dcl.typedef]p9: [P1766R1]
4849
// An unnamed class with a typedef name for linkage purposes shall not
4850
//
4851
// -- have any base classes
4852
if (RD->getNumBases())
4853
return {NonCLikeKind::BaseClass,
4854
SourceRange(RD->bases_begin()->getBeginLoc(),
4855
RD->bases_end()[-1].getEndLoc())};
4856
bool Invalid = false;
4857
for (Decl *D : RD->decls()) {
4858
// Don't complain about things we already diagnosed.
4859
if (D->isInvalidDecl()) {
4860
Invalid = true;
4861
continue;
4862
}
4863
4864
// -- have any [...] default member initializers
4865
if (auto *FD = dyn_cast<FieldDecl>(D)) {
4866
if (FD->hasInClassInitializer()) {
4867
auto *Init = FD->getInClassInitializer();
4868
return {NonCLikeKind::DefaultMemberInit,
4869
Init ? Init->getSourceRange() : D->getSourceRange()};
4870
}
4871
continue;
4872
}
4873
4874
// FIXME: We don't allow friend declarations. This violates the wording of
4875
// P1766, but not the intent.
4876
if (isa<FriendDecl>(D))
4877
return {NonCLikeKind::Friend, D->getSourceRange()};
4878
4879
// -- declare any members other than non-static data members, member
4880
// enumerations, or member classes,
4881
if (isa<StaticAssertDecl>(D) || isa<IndirectFieldDecl>(D) ||
4882
isa<EnumDecl>(D))
4883
continue;
4884
auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
4885
if (!MemberRD) {
4886
if (D->isImplicit())
4887
continue;
4888
return {NonCLikeKind::OtherMember, D->getSourceRange()};
4889
}
4890
4891
// -- contain a lambda-expression,
4892
if (MemberRD->isLambda())
4893
return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
4894
4895
// and all member classes shall also satisfy these requirements
4896
// (recursively).
4897
if (MemberRD->isThisDeclarationADefinition()) {
4898
if (auto Kind = getNonCLikeKindForAnonymousStruct(MemberRD))
4899
return Kind;
4900
}
4901
}
4902
4903
return {Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
4904
}
4905
4906
void Sema::setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
4907
TypedefNameDecl *NewTD) {
4908
if (TagFromDeclSpec->isInvalidDecl())
4909
return;
4910
4911
// Do nothing if the tag already has a name for linkage purposes.
4912
if (TagFromDeclSpec->hasNameForLinkage())
4913
return;
4914
4915
// A well-formed anonymous tag must always be a TagUseKind::Definition.
4916
assert(TagFromDeclSpec->isThisDeclarationADefinition());
4917
4918
// The type must match the tag exactly; no qualifiers allowed.
4919
if (!Context.hasSameType(NewTD->getUnderlyingType(),
4920
Context.getTagDeclType(TagFromDeclSpec))) {
4921
if (getLangOpts().CPlusPlus)
4922
Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
4923
return;
4924
}
4925
4926
// C++ [dcl.typedef]p9: [P1766R1, applied as DR]
4927
// An unnamed class with a typedef name for linkage purposes shall [be
4928
// C-like].
4929
//
4930
// FIXME: Also diagnose if we've already computed the linkage. That ideally
4931
// shouldn't happen, but there are constructs that the language rule doesn't
4932
// disallow for which we can't reasonably avoid computing linkage early.
4933
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
4934
NonCLikeKind NonCLike = RD ? getNonCLikeKindForAnonymousStruct(RD)
4935
: NonCLikeKind();
4936
bool ChangesLinkage = TagFromDeclSpec->hasLinkageBeenComputed();
4937
if (NonCLike || ChangesLinkage) {
4938
if (NonCLike.Kind == NonCLikeKind::Invalid)
4939
return;
4940
4941
unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
4942
if (ChangesLinkage) {
4943
// If the linkage changes, we can't accept this as an extension.
4944
if (NonCLike.Kind == NonCLikeKind::None)
4945
DiagID = diag::err_typedef_changes_linkage;
4946
else
4947
DiagID = diag::err_non_c_like_anon_struct_in_typedef;
4948
}
4949
4950
SourceLocation FixitLoc =
4951
getLocForEndOfToken(TagFromDeclSpec->getInnerLocStart());
4952
llvm::SmallString<40> TextToInsert;
4953
TextToInsert += ' ';
4954
TextToInsert += NewTD->getIdentifier()->getName();
4955
4956
Diag(FixitLoc, DiagID)
4957
<< isa<TypeAliasDecl>(NewTD)
4958
<< FixItHint::CreateInsertion(FixitLoc, TextToInsert);
4959
if (NonCLike.Kind != NonCLikeKind::None) {
4960
Diag(NonCLike.Range.getBegin(), diag::note_non_c_like_anon_struct)
4961
<< NonCLike.Kind - 1 << NonCLike.Range;
4962
}
4963
Diag(NewTD->getLocation(), diag::note_typedef_for_linkage_here)
4964
<< NewTD << isa<TypeAliasDecl>(NewTD);
4965
4966
if (ChangesLinkage)
4967
return;
4968
}
4969
4970
// Otherwise, set this as the anon-decl typedef for the tag.
4971
TagFromDeclSpec->setTypedefNameForAnonDecl(NewTD);
4972
}
4973
4974
static unsigned GetDiagnosticTypeSpecifierID(const DeclSpec &DS) {
4975
DeclSpec::TST T = DS.getTypeSpecType();
4976
switch (T) {
4977
case DeclSpec::TST_class:
4978
return 0;
4979
case DeclSpec::TST_struct:
4980
return 1;
4981
case DeclSpec::TST_interface:
4982
return 2;
4983
case DeclSpec::TST_union:
4984
return 3;
4985
case DeclSpec::TST_enum:
4986
if (const auto *ED = dyn_cast<EnumDecl>(DS.getRepAsDecl())) {
4987
if (ED->isScopedUsingClassTag())
4988
return 5;
4989
if (ED->isScoped())
4990
return 6;
4991
}
4992
return 4;
4993
default:
4994
llvm_unreachable("unexpected type specifier");
4995
}
4996
}
4997
4998
Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
4999
DeclSpec &DS,
5000
const ParsedAttributesView &DeclAttrs,
5001
MultiTemplateParamsArg TemplateParams,
5002
bool IsExplicitInstantiation,
5003
RecordDecl *&AnonRecord) {
5004
Decl *TagD = nullptr;
5005
TagDecl *Tag = nullptr;
5006
if (DS.getTypeSpecType() == DeclSpec::TST_class ||
5007
DS.getTypeSpecType() == DeclSpec::TST_struct ||
5008
DS.getTypeSpecType() == DeclSpec::TST_interface ||
5009
DS.getTypeSpecType() == DeclSpec::TST_union ||
5010
DS.getTypeSpecType() == DeclSpec::TST_enum) {
5011
TagD = DS.getRepAsDecl();
5012
5013
if (!TagD) // We probably had an error
5014
return nullptr;
5015
5016
// Note that the above type specs guarantee that the
5017
// type rep is a Decl, whereas in many of the others
5018
// it's a Type.
5019
if (isa<TagDecl>(TagD))
5020
Tag = cast<TagDecl>(TagD);
5021
else if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(TagD))
5022
Tag = CTD->getTemplatedDecl();
5023
}
5024
5025
if (Tag) {
5026
handleTagNumbering(Tag, S);
5027
Tag->setFreeStanding();
5028
if (Tag->isInvalidDecl())
5029
return Tag;
5030
}
5031
5032
if (unsigned TypeQuals = DS.getTypeQualifiers()) {
5033
// Enforce C99 6.7.3p2: "Types other than pointer types derived from object
5034
// or incomplete types shall not be restrict-qualified."
5035
if (TypeQuals & DeclSpec::TQ_restrict)
5036
Diag(DS.getRestrictSpecLoc(),
5037
diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5038
<< DS.getSourceRange();
5039
}
5040
5041
if (DS.isInlineSpecified())
5042
Diag(DS.getInlineSpecLoc(), diag::err_inline_non_function)
5043
<< getLangOpts().CPlusPlus17;
5044
5045
if (DS.hasConstexprSpecifier()) {
5046
// C++0x [dcl.constexpr]p1: constexpr can only be applied to declarations
5047
// and definitions of functions and variables.
5048
// C++2a [dcl.constexpr]p1: The consteval specifier shall be applied only to
5049
// the declaration of a function or function template
5050
if (Tag)
5051
Diag(DS.getConstexprSpecLoc(), diag::err_constexpr_tag)
5052
<< GetDiagnosticTypeSpecifierID(DS)
5053
<< static_cast<int>(DS.getConstexprSpecifier());
5054
else if (getLangOpts().C23)
5055
Diag(DS.getConstexprSpecLoc(), diag::err_c23_constexpr_not_variable);
5056
else
5057
Diag(DS.getConstexprSpecLoc(), diag::err_constexpr_wrong_decl_kind)
5058
<< static_cast<int>(DS.getConstexprSpecifier());
5059
// Don't emit warnings after this error.
5060
return TagD;
5061
}
5062
5063
DiagnoseFunctionSpecifiers(DS);
5064
5065
if (DS.isFriendSpecified()) {
5066
// If we're dealing with a decl but not a TagDecl, assume that
5067
// whatever routines created it handled the friendship aspect.
5068
if (TagD && !Tag)
5069
return nullptr;
5070
return ActOnFriendTypeDecl(S, DS, TemplateParams);
5071
}
5072
5073
// Track whether this decl-specifier declares anything.
5074
bool DeclaresAnything = true;
5075
5076
// Handle anonymous struct definitions.
5077
if (RecordDecl *Record = dyn_cast_or_null<RecordDecl>(Tag)) {
5078
if (!Record->getDeclName() && Record->isCompleteDefinition() &&
5079
DS.getStorageClassSpec() != DeclSpec::SCS_typedef) {
5080
if (getLangOpts().CPlusPlus ||
5081
Record->getDeclContext()->isRecord()) {
5082
// If CurContext is a DeclContext that can contain statements,
5083
// RecursiveASTVisitor won't visit the decls that
5084
// BuildAnonymousStructOrUnion() will put into CurContext.
5085
// Also store them here so that they can be part of the
5086
// DeclStmt that gets created in this case.
5087
// FIXME: Also return the IndirectFieldDecls created by
5088
// BuildAnonymousStructOr union, for the same reason?
5089
if (CurContext->isFunctionOrMethod())
5090
AnonRecord = Record;
5091
return BuildAnonymousStructOrUnion(S, DS, AS, Record,
5092
Context.getPrintingPolicy());
5093
}
5094
5095
DeclaresAnything = false;
5096
}
5097
}
5098
5099
// C11 6.7.2.1p2:
5100
// A struct-declaration that does not declare an anonymous structure or
5101
// anonymous union shall contain a struct-declarator-list.
5102
//
5103
// This rule also existed in C89 and C99; the grammar for struct-declaration
5104
// did not permit a struct-declaration without a struct-declarator-list.
5105
if (!getLangOpts().CPlusPlus && CurContext->isRecord() &&
5106
DS.getStorageClassSpec() == DeclSpec::SCS_unspecified) {
5107
// Check for Microsoft C extension: anonymous struct/union member.
5108
// Handle 2 kinds of anonymous struct/union:
5109
// struct STRUCT;
5110
// union UNION;
5111
// and
5112
// STRUCT_TYPE; <- where STRUCT_TYPE is a typedef struct.
5113
// UNION_TYPE; <- where UNION_TYPE is a typedef union.
5114
if ((Tag && Tag->getDeclName()) ||
5115
DS.getTypeSpecType() == DeclSpec::TST_typename) {
5116
RecordDecl *Record = nullptr;
5117
if (Tag)
5118
Record = dyn_cast<RecordDecl>(Tag);
5119
else if (const RecordType *RT =
5120
DS.getRepAsType().get()->getAsStructureType())
5121
Record = RT->getDecl();
5122
else if (const RecordType *UT = DS.getRepAsType().get()->getAsUnionType())
5123
Record = UT->getDecl();
5124
5125
if (Record && getLangOpts().MicrosoftExt) {
5126
Diag(DS.getBeginLoc(), diag::ext_ms_anonymous_record)
5127
<< Record->isUnion() << DS.getSourceRange();
5128
return BuildMicrosoftCAnonymousStruct(S, DS, Record);
5129
}
5130
5131
DeclaresAnything = false;
5132
}
5133
}
5134
5135
// Skip all the checks below if we have a type error.
5136
if (DS.getTypeSpecType() == DeclSpec::TST_error ||
5137
(TagD && TagD->isInvalidDecl()))
5138
return TagD;
5139
5140
if (getLangOpts().CPlusPlus &&
5141
DS.getStorageClassSpec() != DeclSpec::SCS_typedef)
5142
if (EnumDecl *Enum = dyn_cast_or_null<EnumDecl>(Tag))
5143
if (Enum->enumerator_begin() == Enum->enumerator_end() &&
5144
!Enum->getIdentifier() && !Enum->isInvalidDecl())
5145
DeclaresAnything = false;
5146
5147
if (!DS.isMissingDeclaratorOk()) {
5148
// Customize diagnostic for a typedef missing a name.
5149
if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef)
5150
Diag(DS.getBeginLoc(), diag::ext_typedef_without_a_name)
5151
<< DS.getSourceRange();
5152
else
5153
DeclaresAnything = false;
5154
}
5155
5156
if (DS.isModulePrivateSpecified() &&
5157
Tag && Tag->getDeclContext()->isFunctionOrMethod())
5158
Diag(DS.getModulePrivateSpecLoc(), diag::err_module_private_local_class)
5159
<< llvm::to_underlying(Tag->getTagKind())
5160
<< FixItHint::CreateRemoval(DS.getModulePrivateSpecLoc());
5161
5162
ActOnDocumentableDecl(TagD);
5163
5164
// C 6.7/2:
5165
// A declaration [...] shall declare at least a declarator [...], a tag,
5166
// or the members of an enumeration.
5167
// C++ [dcl.dcl]p3:
5168
// [If there are no declarators], and except for the declaration of an
5169
// unnamed bit-field, the decl-specifier-seq shall introduce one or more
5170
// names into the program, or shall redeclare a name introduced by a
5171
// previous declaration.
5172
if (!DeclaresAnything) {
5173
// In C, we allow this as a (popular) extension / bug. Don't bother
5174
// producing further diagnostics for redundant qualifiers after this.
5175
Diag(DS.getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5176
? diag::err_no_declarators
5177
: diag::ext_no_declarators)
5178
<< DS.getSourceRange();
5179
return TagD;
5180
}
5181
5182
// C++ [dcl.stc]p1:
5183
// If a storage-class-specifier appears in a decl-specifier-seq, [...] the
5184
// init-declarator-list of the declaration shall not be empty.
5185
// C++ [dcl.fct.spec]p1:
5186
// If a cv-qualifier appears in a decl-specifier-seq, the
5187
// init-declarator-list of the declaration shall not be empty.
5188
//
5189
// Spurious qualifiers here appear to be valid in C.
5190
unsigned DiagID = diag::warn_standalone_specifier;
5191
if (getLangOpts().CPlusPlus)
5192
DiagID = diag::ext_standalone_specifier;
5193
5194
// Note that a linkage-specification sets a storage class, but
5195
// 'extern "C" struct foo;' is actually valid and not theoretically
5196
// useless.
5197
if (DeclSpec::SCS SCS = DS.getStorageClassSpec()) {
5198
if (SCS == DeclSpec::SCS_mutable)
5199
// Since mutable is not a viable storage class specifier in C, there is
5200
// no reason to treat it as an extension. Instead, diagnose as an error.
5201
Diag(DS.getStorageClassSpecLoc(), diag::err_mutable_nonmember);
5202
else if (!DS.isExternInLinkageSpec() && SCS != DeclSpec::SCS_typedef)
5203
Diag(DS.getStorageClassSpecLoc(), DiagID)
5204
<< DeclSpec::getSpecifierName(SCS);
5205
}
5206
5207
if (DeclSpec::TSCS TSCS = DS.getThreadStorageClassSpec())
5208
Diag(DS.getThreadStorageClassSpecLoc(), DiagID)
5209
<< DeclSpec::getSpecifierName(TSCS);
5210
if (DS.getTypeQualifiers()) {
5211
if (DS.getTypeQualifiers() & DeclSpec::TQ_const)
5212
Diag(DS.getConstSpecLoc(), DiagID) << "const";
5213
if (DS.getTypeQualifiers() & DeclSpec::TQ_volatile)
5214
Diag(DS.getConstSpecLoc(), DiagID) << "volatile";
5215
// Restrict is covered above.
5216
if (DS.getTypeQualifiers() & DeclSpec::TQ_atomic)
5217
Diag(DS.getAtomicSpecLoc(), DiagID) << "_Atomic";
5218
if (DS.getTypeQualifiers() & DeclSpec::TQ_unaligned)
5219
Diag(DS.getUnalignedSpecLoc(), DiagID) << "__unaligned";
5220
}
5221
5222
// Warn about ignored type attributes, for example:
5223
// __attribute__((aligned)) struct A;
5224
// Attributes should be placed after tag to apply to type declaration.
5225
if (!DS.getAttributes().empty() || !DeclAttrs.empty()) {
5226
DeclSpec::TST TypeSpecType = DS.getTypeSpecType();
5227
if (TypeSpecType == DeclSpec::TST_class ||
5228
TypeSpecType == DeclSpec::TST_struct ||
5229
TypeSpecType == DeclSpec::TST_interface ||
5230
TypeSpecType == DeclSpec::TST_union ||
5231
TypeSpecType == DeclSpec::TST_enum) {
5232
5233
auto EmitAttributeDiagnostic = [this, &DS](const ParsedAttr &AL) {
5234
unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5235
if (AL.isAlignas() && !getLangOpts().CPlusPlus)
5236
DiagnosticId = diag::warn_attribute_ignored;
5237
else if (AL.isRegularKeywordAttribute())
5238
DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5239
else
5240
DiagnosticId = diag::warn_declspec_attribute_ignored;
5241
Diag(AL.getLoc(), DiagnosticId)
5242
<< AL << GetDiagnosticTypeSpecifierID(DS);
5243
};
5244
5245
llvm::for_each(DS.getAttributes(), EmitAttributeDiagnostic);
5246
llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5247
}
5248
}
5249
5250
return TagD;
5251
}
5252
5253
/// We are trying to inject an anonymous member into the given scope;
5254
/// check if there's an existing declaration that can't be overloaded.
5255
///
5256
/// \return true if this is a forbidden redeclaration
5257
static bool CheckAnonMemberRedeclaration(Sema &SemaRef, Scope *S,
5258
DeclContext *Owner,
5259
DeclarationName Name,
5260
SourceLocation NameLoc, bool IsUnion,
5261
StorageClass SC) {
5262
LookupResult R(SemaRef, Name, NameLoc,
5263
Owner->isRecord() ? Sema::LookupMemberName
5264
: Sema::LookupOrdinaryName,
5265
RedeclarationKind::ForVisibleRedeclaration);
5266
if (!SemaRef.LookupName(R, S)) return false;
5267
5268
// Pick a representative declaration.
5269
NamedDecl *PrevDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
5270
assert(PrevDecl && "Expected a non-null Decl");
5271
5272
if (!SemaRef.isDeclInScope(PrevDecl, Owner, S))
5273
return false;
5274
5275
if (SC == StorageClass::SC_None &&
5276
PrevDecl->isPlaceholderVar(SemaRef.getLangOpts()) &&
5277
(Owner->isFunctionOrMethod() || Owner->isRecord())) {
5278
if (!Owner->isRecord())
5279
SemaRef.DiagPlaceholderVariableDefinition(NameLoc);
5280
return false;
5281
}
5282
5283
SemaRef.Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5284
<< IsUnion << Name;
5285
SemaRef.Diag(PrevDecl->getLocation(), diag::note_previous_declaration);
5286
5287
return true;
5288
}
5289
5290
void Sema::ActOnDefinedDeclarationSpecifier(Decl *D) {
5291
if (auto *RD = dyn_cast_if_present<RecordDecl>(D))
5292
DiagPlaceholderFieldDeclDefinitions(RD);
5293
}
5294
5295
void Sema::DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record) {
5296
if (!getLangOpts().CPlusPlus)
5297
return;
5298
5299
// This function can be parsed before we have validated the
5300
// structure as an anonymous struct
5301
if (Record->isAnonymousStructOrUnion())
5302
return;
5303
5304
const NamedDecl *First = 0;
5305
for (const Decl *D : Record->decls()) {
5306
const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5307
if (!ND || !ND->isPlaceholderVar(getLangOpts()))
5308
continue;
5309
if (!First)
5310
First = ND;
5311
else
5312
DiagPlaceholderVariableDefinition(ND->getLocation());
5313
}
5314
}
5315
5316
/// InjectAnonymousStructOrUnionMembers - Inject the members of the
5317
/// anonymous struct or union AnonRecord into the owning context Owner
5318
/// and scope S. This routine will be invoked just after we realize
5319
/// that an unnamed union or struct is actually an anonymous union or
5320
/// struct, e.g.,
5321
///
5322
/// @code
5323
/// union {
5324
/// int i;
5325
/// float f;
5326
/// }; // InjectAnonymousStructOrUnionMembers called here to inject i and
5327
/// // f into the surrounding scope.x
5328
/// @endcode
5329
///
5330
/// This routine is recursive, injecting the names of nested anonymous
5331
/// structs/unions into the owning context and scope as well.
5332
static bool
5333
InjectAnonymousStructOrUnionMembers(Sema &SemaRef, Scope *S, DeclContext *Owner,
5334
RecordDecl *AnonRecord, AccessSpecifier AS,
5335
StorageClass SC,
5336
SmallVectorImpl<NamedDecl *> &Chaining) {
5337
bool Invalid = false;
5338
5339
// Look every FieldDecl and IndirectFieldDecl with a name.
5340
for (auto *D : AnonRecord->decls()) {
5341
if ((isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D)) &&
5342
cast<NamedDecl>(D)->getDeclName()) {
5343
ValueDecl *VD = cast<ValueDecl>(D);
5344
if (CheckAnonMemberRedeclaration(SemaRef, S, Owner, VD->getDeclName(),
5345
VD->getLocation(), AnonRecord->isUnion(),
5346
SC)) {
5347
// C++ [class.union]p2:
5348
// The names of the members of an anonymous union shall be
5349
// distinct from the names of any other entity in the
5350
// scope in which the anonymous union is declared.
5351
Invalid = true;
5352
} else {
5353
// C++ [class.union]p2:
5354
// For the purpose of name lookup, after the anonymous union
5355
// definition, the members of the anonymous union are
5356
// considered to have been defined in the scope in which the
5357
// anonymous union is declared.
5358
unsigned OldChainingSize = Chaining.size();
5359
if (IndirectFieldDecl *IF = dyn_cast<IndirectFieldDecl>(VD))
5360
Chaining.append(IF->chain_begin(), IF->chain_end());
5361
else
5362
Chaining.push_back(VD);
5363
5364
assert(Chaining.size() >= 2);
5365
NamedDecl **NamedChain =
5366
new (SemaRef.Context)NamedDecl*[Chaining.size()];
5367
for (unsigned i = 0; i < Chaining.size(); i++)
5368
NamedChain[i] = Chaining[i];
5369
5370
IndirectFieldDecl *IndirectField = IndirectFieldDecl::Create(
5371
SemaRef.Context, Owner, VD->getLocation(), VD->getIdentifier(),
5372
VD->getType(), {NamedChain, Chaining.size()});
5373
5374
for (const auto *Attr : VD->attrs())
5375
IndirectField->addAttr(Attr->clone(SemaRef.Context));
5376
5377
IndirectField->setAccess(AS);
5378
IndirectField->setImplicit();
5379
SemaRef.PushOnScopeChains(IndirectField, S);
5380
5381
// That includes picking up the appropriate access specifier.
5382
if (AS != AS_none) IndirectField->setAccess(AS);
5383
5384
Chaining.resize(OldChainingSize);
5385
}
5386
}
5387
}
5388
5389
return Invalid;
5390
}
5391
5392
/// StorageClassSpecToVarDeclStorageClass - Maps a DeclSpec::SCS to
5393
/// a VarDecl::StorageClass. Any error reporting is up to the caller:
5394
/// illegal input values are mapped to SC_None.
5395
static StorageClass
5396
StorageClassSpecToVarDeclStorageClass(const DeclSpec &DS) {
5397
DeclSpec::SCS StorageClassSpec = DS.getStorageClassSpec();
5398
assert(StorageClassSpec != DeclSpec::SCS_typedef &&
5399
"Parser allowed 'typedef' as storage class VarDecl.");
5400
switch (StorageClassSpec) {
5401
case DeclSpec::SCS_unspecified: return SC_None;
5402
case DeclSpec::SCS_extern:
5403
if (DS.isExternInLinkageSpec())
5404
return SC_None;
5405
return SC_Extern;
5406
case DeclSpec::SCS_static: return SC_Static;
5407
case DeclSpec::SCS_auto: return SC_Auto;
5408
case DeclSpec::SCS_register: return SC_Register;
5409
case DeclSpec::SCS_private_extern: return SC_PrivateExtern;
5410
// Illegal SCSs map to None: error reporting is up to the caller.
5411
case DeclSpec::SCS_mutable: // Fall through.
5412
case DeclSpec::SCS_typedef: return SC_None;
5413
}
5414
llvm_unreachable("unknown storage class specifier");
5415
}
5416
5417
static SourceLocation findDefaultInitializer(const CXXRecordDecl *Record) {
5418
assert(Record->hasInClassInitializer());
5419
5420
for (const auto *I : Record->decls()) {
5421
const auto *FD = dyn_cast<FieldDecl>(I);
5422
if (const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5423
FD = IFD->getAnonField();
5424
if (FD && FD->hasInClassInitializer())
5425
return FD->getLocation();
5426
}
5427
5428
llvm_unreachable("couldn't find in-class initializer");
5429
}
5430
5431
static void checkDuplicateDefaultInit(Sema &S, CXXRecordDecl *Parent,
5432
SourceLocation DefaultInitLoc) {
5433
if (!Parent->isUnion() || !Parent->hasInClassInitializer())
5434
return;
5435
5436
S.Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5437
S.Diag(findDefaultInitializer(Parent), diag::note_previous_initializer) << 0;
5438
}
5439
5440
static void checkDuplicateDefaultInit(Sema &S, CXXRecordDecl *Parent,
5441
CXXRecordDecl *AnonUnion) {
5442
if (!Parent->isUnion() || !Parent->hasInClassInitializer())
5443
return;
5444
5445
checkDuplicateDefaultInit(S, Parent, findDefaultInitializer(AnonUnion));
5446
}
5447
5448
Decl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
5449
AccessSpecifier AS,
5450
RecordDecl *Record,
5451
const PrintingPolicy &Policy) {
5452
DeclContext *Owner = Record->getDeclContext();
5453
5454
// Diagnose whether this anonymous struct/union is an extension.
5455
if (Record->isUnion() && !getLangOpts().CPlusPlus && !getLangOpts().C11)
5456
Diag(Record->getLocation(), diag::ext_anonymous_union);
5457
else if (!Record->isUnion() && getLangOpts().CPlusPlus)
5458
Diag(Record->getLocation(), diag::ext_gnu_anonymous_struct);
5459
else if (!Record->isUnion() && !getLangOpts().C11)
5460
Diag(Record->getLocation(), diag::ext_c11_anonymous_struct);
5461
5462
// C and C++ require different kinds of checks for anonymous
5463
// structs/unions.
5464
bool Invalid = false;
5465
if (getLangOpts().CPlusPlus) {
5466
const char *PrevSpec = nullptr;
5467
if (Record->isUnion()) {
5468
// C++ [class.union]p6:
5469
// C++17 [class.union.anon]p2:
5470
// Anonymous unions declared in a named namespace or in the
5471
// global namespace shall be declared static.
5472
unsigned DiagID;
5473
DeclContext *OwnerScope = Owner->getRedeclContext();
5474
if (DS.getStorageClassSpec() != DeclSpec::SCS_static &&
5475
(OwnerScope->isTranslationUnit() ||
5476
(OwnerScope->isNamespace() &&
5477
!cast<NamespaceDecl>(OwnerScope)->isAnonymousNamespace()))) {
5478
Diag(Record->getLocation(), diag::err_anonymous_union_not_static)
5479
<< FixItHint::CreateInsertion(Record->getLocation(), "static ");
5480
5481
// Recover by adding 'static'.
5482
DS.SetStorageClassSpec(*this, DeclSpec::SCS_static, SourceLocation(),
5483
PrevSpec, DiagID, Policy);
5484
}
5485
// C++ [class.union]p6:
5486
// A storage class is not allowed in a declaration of an
5487
// anonymous union in a class scope.
5488
else if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified &&
5489
isa<RecordDecl>(Owner)) {
5490
Diag(DS.getStorageClassSpecLoc(),
5491
diag::err_anonymous_union_with_storage_spec)
5492
<< FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());
5493
5494
// Recover by removing the storage specifier.
5495
DS.SetStorageClassSpec(*this, DeclSpec::SCS_unspecified,
5496
SourceLocation(),
5497
PrevSpec, DiagID, Context.getPrintingPolicy());
5498
}
5499
}
5500
5501
// Ignore const/volatile/restrict qualifiers.
5502
if (DS.getTypeQualifiers()) {
5503
if (DS.getTypeQualifiers() & DeclSpec::TQ_const)
5504
Diag(DS.getConstSpecLoc(), diag::ext_anonymous_struct_union_qualified)
5505
<< Record->isUnion() << "const"
5506
<< FixItHint::CreateRemoval(DS.getConstSpecLoc());
5507
if (DS.getTypeQualifiers() & DeclSpec::TQ_volatile)
5508
Diag(DS.getVolatileSpecLoc(),
5509
diag::ext_anonymous_struct_union_qualified)
5510
<< Record->isUnion() << "volatile"
5511
<< FixItHint::CreateRemoval(DS.getVolatileSpecLoc());
5512
if (DS.getTypeQualifiers() & DeclSpec::TQ_restrict)
5513
Diag(DS.getRestrictSpecLoc(),
5514
diag::ext_anonymous_struct_union_qualified)
5515
<< Record->isUnion() << "restrict"
5516
<< FixItHint::CreateRemoval(DS.getRestrictSpecLoc());
5517
if (DS.getTypeQualifiers() & DeclSpec::TQ_atomic)
5518
Diag(DS.getAtomicSpecLoc(),
5519
diag::ext_anonymous_struct_union_qualified)
5520
<< Record->isUnion() << "_Atomic"
5521
<< FixItHint::CreateRemoval(DS.getAtomicSpecLoc());
5522
if (DS.getTypeQualifiers() & DeclSpec::TQ_unaligned)
5523
Diag(DS.getUnalignedSpecLoc(),
5524
diag::ext_anonymous_struct_union_qualified)
5525
<< Record->isUnion() << "__unaligned"
5526
<< FixItHint::CreateRemoval(DS.getUnalignedSpecLoc());
5527
5528
DS.ClearTypeQualifiers();
5529
}
5530
5531
// C++ [class.union]p2:
5532
// The member-specification of an anonymous union shall only
5533
// define non-static data members. [Note: nested types and
5534
// functions cannot be declared within an anonymous union. ]
5535
for (auto *Mem : Record->decls()) {
5536
// Ignore invalid declarations; we already diagnosed them.
5537
if (Mem->isInvalidDecl())
5538
continue;
5539
5540
if (auto *FD = dyn_cast<FieldDecl>(Mem)) {
5541
// C++ [class.union]p3:
5542
// An anonymous union shall not have private or protected
5543
// members (clause 11).
5544
assert(FD->getAccess() != AS_none);
5545
if (FD->getAccess() != AS_public) {
5546
Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5547
<< Record->isUnion() << (FD->getAccess() == AS_protected);
5548
Invalid = true;
5549
}
5550
5551
// C++ [class.union]p1
5552
// An object of a class with a non-trivial constructor, a non-trivial
5553
// copy constructor, a non-trivial destructor, or a non-trivial copy
5554
// assignment operator cannot be a member of a union, nor can an
5555
// array of such objects.
5556
if (CheckNontrivialField(FD))
5557
Invalid = true;
5558
} else if (Mem->isImplicit()) {
5559
// Any implicit members are fine.
5560
} else if (isa<TagDecl>(Mem) && Mem->getDeclContext() != Record) {
5561
// This is a type that showed up in an
5562
// elaborated-type-specifier inside the anonymous struct or
5563
// union, but which actually declares a type outside of the
5564
// anonymous struct or union. It's okay.
5565
} else if (auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5566
if (!MemRecord->isAnonymousStructOrUnion() &&
5567
MemRecord->getDeclName()) {
5568
// Visual C++ allows type definition in anonymous struct or union.
5569
if (getLangOpts().MicrosoftExt)
5570
Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5571
<< Record->isUnion();
5572
else {
5573
// This is a nested type declaration.
5574
Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5575
<< Record->isUnion();
5576
Invalid = true;
5577
}
5578
} else {
5579
// This is an anonymous type definition within another anonymous type.
5580
// This is a popular extension, provided by Plan9, MSVC and GCC, but
5581
// not part of standard C++.
5582
Diag(MemRecord->getLocation(),
5583
diag::ext_anonymous_record_with_anonymous_type)
5584
<< Record->isUnion();
5585
}
5586
} else if (isa<AccessSpecDecl>(Mem)) {
5587
// Any access specifier is fine.
5588
} else if (isa<StaticAssertDecl>(Mem)) {
5589
// In C++1z, static_assert declarations are also fine.
5590
} else {
5591
// We have something that isn't a non-static data
5592
// member. Complain about it.
5593
unsigned DK = diag::err_anonymous_record_bad_member;
5594
if (isa<TypeDecl>(Mem))
5595
DK = diag::err_anonymous_record_with_type;
5596
else if (isa<FunctionDecl>(Mem))
5597
DK = diag::err_anonymous_record_with_function;
5598
else if (isa<VarDecl>(Mem))
5599
DK = diag::err_anonymous_record_with_static;
5600
5601
// Visual C++ allows type definition in anonymous struct or union.
5602
if (getLangOpts().MicrosoftExt &&
5603
DK == diag::err_anonymous_record_with_type)
5604
Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5605
<< Record->isUnion();
5606
else {
5607
Diag(Mem->getLocation(), DK) << Record->isUnion();
5608
Invalid = true;
5609
}
5610
}
5611
}
5612
5613
// C++11 [class.union]p8 (DR1460):
5614
// At most one variant member of a union may have a
5615
// brace-or-equal-initializer.
5616
if (cast<CXXRecordDecl>(Record)->hasInClassInitializer() &&
5617
Owner->isRecord())
5618
checkDuplicateDefaultInit(*this, cast<CXXRecordDecl>(Owner),
5619
cast<CXXRecordDecl>(Record));
5620
}
5621
5622
if (!Record->isUnion() && !Owner->isRecord()) {
5623
Diag(Record->getLocation(), diag::err_anonymous_struct_not_member)
5624
<< getLangOpts().CPlusPlus;
5625
Invalid = true;
5626
}
5627
5628
// C++ [dcl.dcl]p3:
5629
// [If there are no declarators], and except for the declaration of an
5630
// unnamed bit-field, the decl-specifier-seq shall introduce one or more
5631
// names into the program
5632
// C++ [class.mem]p2:
5633
// each such member-declaration shall either declare at least one member
5634
// name of the class or declare at least one unnamed bit-field
5635
//
5636
// For C this is an error even for a named struct, and is diagnosed elsewhere.
5637
if (getLangOpts().CPlusPlus && Record->field_empty())
5638
Diag(DS.getBeginLoc(), diag::ext_no_declarators) << DS.getSourceRange();
5639
5640
// Mock up a declarator.
5641
Declarator Dc(DS, ParsedAttributesView::none(), DeclaratorContext::Member);
5642
StorageClass SC = StorageClassSpecToVarDeclStorageClass(DS);
5643
TypeSourceInfo *TInfo = GetTypeForDeclarator(Dc);
5644
assert(TInfo && "couldn't build declarator info for anonymous struct/union");
5645
5646
// Create a declaration for this anonymous struct/union.
5647
NamedDecl *Anon = nullptr;
5648
if (RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5649
Anon = FieldDecl::Create(
5650
Context, OwningClass, DS.getBeginLoc(), Record->getLocation(),
5651
/*IdentifierInfo=*/nullptr, Context.getTypeDeclType(Record), TInfo,
5652
/*BitWidth=*/nullptr, /*Mutable=*/false,
5653
/*InitStyle=*/ICIS_NoInit);
5654
Anon->setAccess(AS);
5655
ProcessDeclAttributes(S, Anon, Dc);
5656
5657
if (getLangOpts().CPlusPlus)
5658
FieldCollector->Add(cast<FieldDecl>(Anon));
5659
} else {
5660
DeclSpec::SCS SCSpec = DS.getStorageClassSpec();
5661
if (SCSpec == DeclSpec::SCS_mutable) {
5662
// mutable can only appear on non-static class members, so it's always
5663
// an error here
5664
Diag(Record->getLocation(), diag::err_mutable_nonmember);
5665
Invalid = true;
5666
SC = SC_None;
5667
}
5668
5669
Anon = VarDecl::Create(Context, Owner, DS.getBeginLoc(),
5670
Record->getLocation(), /*IdentifierInfo=*/nullptr,
5671
Context.getTypeDeclType(Record), TInfo, SC);
5672
if (Invalid)
5673
Anon->setInvalidDecl();
5674
5675
ProcessDeclAttributes(S, Anon, Dc);
5676
5677
// Default-initialize the implicit variable. This initialization will be
5678
// trivial in almost all cases, except if a union member has an in-class
5679
// initializer:
5680
// union { int n = 0; };
5681
ActOnUninitializedDecl(Anon);
5682
}
5683
Anon->setImplicit();
5684
5685
// Mark this as an anonymous struct/union type.
5686
Record->setAnonymousStructOrUnion(true);
5687
5688
// Add the anonymous struct/union object to the current
5689
// context. We'll be referencing this object when we refer to one of
5690
// its members.
5691
Owner->addDecl(Anon);
5692
5693
// Inject the members of the anonymous struct/union into the owning
5694
// context and into the identifier resolver chain for name lookup
5695
// purposes.
5696
SmallVector<NamedDecl*, 2> Chain;
5697
Chain.push_back(Anon);
5698
5699
if (InjectAnonymousStructOrUnionMembers(*this, S, Owner, Record, AS, SC,
5700
Chain))
5701
Invalid = true;
5702
5703
if (VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5704
if (getLangOpts().CPlusPlus && NewVD->isStaticLocal()) {
5705
MangleNumberingContext *MCtx;
5706
Decl *ManglingContextDecl;
5707
std::tie(MCtx, ManglingContextDecl) =
5708
getCurrentMangleNumberContext(NewVD->getDeclContext());
5709
if (MCtx) {
5710
Context.setManglingNumber(
5711
NewVD, MCtx->getManglingNumber(
5712
NewVD, getMSManglingNumber(getLangOpts(), S)));
5713
Context.setStaticLocalNumber(NewVD, MCtx->getStaticLocalNumber(NewVD));
5714
}
5715
}
5716
}
5717
5718
if (Invalid)
5719
Anon->setInvalidDecl();
5720
5721
return Anon;
5722
}
5723
5724
Decl *Sema::BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
5725
RecordDecl *Record) {
5726
assert(Record && "expected a record!");
5727
5728
// Mock up a declarator.
5729
Declarator Dc(DS, ParsedAttributesView::none(), DeclaratorContext::TypeName);
5730
TypeSourceInfo *TInfo = GetTypeForDeclarator(Dc);
5731
assert(TInfo && "couldn't build declarator info for anonymous struct");
5732
5733
auto *ParentDecl = cast<RecordDecl>(CurContext);
5734
QualType RecTy = Context.getTypeDeclType(Record);
5735
5736
// Create a declaration for this anonymous struct.
5737
NamedDecl *Anon =
5738
FieldDecl::Create(Context, ParentDecl, DS.getBeginLoc(), DS.getBeginLoc(),
5739
/*IdentifierInfo=*/nullptr, RecTy, TInfo,
5740
/*BitWidth=*/nullptr, /*Mutable=*/false,
5741
/*InitStyle=*/ICIS_NoInit);
5742
Anon->setImplicit();
5743
5744
// Add the anonymous struct object to the current context.
5745
CurContext->addDecl(Anon);
5746
5747
// Inject the members of the anonymous struct into the current
5748
// context and into the identifier resolver chain for name lookup
5749
// purposes.
5750
SmallVector<NamedDecl*, 2> Chain;
5751
Chain.push_back(Anon);
5752
5753
RecordDecl *RecordDef = Record->getDefinition();
5754
if (RequireCompleteSizedType(Anon->getLocation(), RecTy,
5755
diag::err_field_incomplete_or_sizeless) ||
5756
InjectAnonymousStructOrUnionMembers(
5757
*this, S, CurContext, RecordDef, AS_none,
5758
StorageClassSpecToVarDeclStorageClass(DS), Chain)) {
5759
Anon->setInvalidDecl();
5760
ParentDecl->setInvalidDecl();
5761
}
5762
5763
return Anon;
5764
}
5765
5766
DeclarationNameInfo Sema::GetNameForDeclarator(Declarator &D) {
5767
return GetNameFromUnqualifiedId(D.getName());
5768
}
5769
5770
DeclarationNameInfo
5771
Sema::GetNameFromUnqualifiedId(const UnqualifiedId &Name) {
5772
DeclarationNameInfo NameInfo;
5773
NameInfo.setLoc(Name.StartLocation);
5774
5775
switch (Name.getKind()) {
5776
5777
case UnqualifiedIdKind::IK_ImplicitSelfParam:
5778
case UnqualifiedIdKind::IK_Identifier:
5779
NameInfo.setName(Name.Identifier);
5780
return NameInfo;
5781
5782
case UnqualifiedIdKind::IK_DeductionGuideName: {
5783
// C++ [temp.deduct.guide]p3:
5784
// The simple-template-id shall name a class template specialization.
5785
// The template-name shall be the same identifier as the template-name
5786
// of the simple-template-id.
5787
// These together intend to imply that the template-name shall name a
5788
// class template.
5789
// FIXME: template<typename T> struct X {};
5790
// template<typename T> using Y = X<T>;
5791
// Y(int) -> Y<int>;
5792
// satisfies these rules but does not name a class template.
5793
TemplateName TN = Name.TemplateName.get().get();
5794
auto *Template = TN.getAsTemplateDecl();
5795
if (!Template || !isa<ClassTemplateDecl>(Template)) {
5796
Diag(Name.StartLocation,
5797
diag::err_deduction_guide_name_not_class_template)
5798
<< (int)getTemplateNameKindForDiagnostics(TN) << TN;
5799
if (Template)
5800
NoteTemplateLocation(*Template);
5801
return DeclarationNameInfo();
5802
}
5803
5804
NameInfo.setName(
5805
Context.DeclarationNames.getCXXDeductionGuideName(Template));
5806
return NameInfo;
5807
}
5808
5809
case UnqualifiedIdKind::IK_OperatorFunctionId:
5810
NameInfo.setName(Context.DeclarationNames.getCXXOperatorName(
5811
Name.OperatorFunctionId.Operator));
5812
NameInfo.setCXXOperatorNameRange(SourceRange(
5813
Name.OperatorFunctionId.SymbolLocations[0], Name.EndLocation));
5814
return NameInfo;
5815
5816
case UnqualifiedIdKind::IK_LiteralOperatorId:
5817
NameInfo.setName(Context.DeclarationNames.getCXXLiteralOperatorName(
5818
Name.Identifier));
5819
NameInfo.setCXXLiteralOperatorNameLoc(Name.EndLocation);
5820
return NameInfo;
5821
5822
case UnqualifiedIdKind::IK_ConversionFunctionId: {
5823
TypeSourceInfo *TInfo;
5824
QualType Ty = GetTypeFromParser(Name.ConversionFunctionId, &TInfo);
5825
if (Ty.isNull())
5826
return DeclarationNameInfo();
5827
NameInfo.setName(Context.DeclarationNames.getCXXConversionFunctionName(
5828
Context.getCanonicalType(Ty)));
5829
NameInfo.setNamedTypeInfo(TInfo);
5830
return NameInfo;
5831
}
5832
5833
case UnqualifiedIdKind::IK_ConstructorName: {
5834
TypeSourceInfo *TInfo;
5835
QualType Ty = GetTypeFromParser(Name.ConstructorName, &TInfo);
5836
if (Ty.isNull())
5837
return DeclarationNameInfo();
5838
NameInfo.setName(Context.DeclarationNames.getCXXConstructorName(
5839
Context.getCanonicalType(Ty)));
5840
NameInfo.setNamedTypeInfo(TInfo);
5841
return NameInfo;
5842
}
5843
5844
case UnqualifiedIdKind::IK_ConstructorTemplateId: {
5845
// In well-formed code, we can only have a constructor
5846
// template-id that refers to the current context, so go there
5847
// to find the actual type being constructed.
5848
CXXRecordDecl *CurClass = dyn_cast<CXXRecordDecl>(CurContext);
5849
if (!CurClass || CurClass->getIdentifier() != Name.TemplateId->Name)
5850
return DeclarationNameInfo();
5851
5852
// Determine the type of the class being constructed.
5853
QualType CurClassType = Context.getTypeDeclType(CurClass);
5854
5855
// FIXME: Check two things: that the template-id names the same type as
5856
// CurClassType, and that the template-id does not occur when the name
5857
// was qualified.
5858
5859
NameInfo.setName(Context.DeclarationNames.getCXXConstructorName(
5860
Context.getCanonicalType(CurClassType)));
5861
// FIXME: should we retrieve TypeSourceInfo?
5862
NameInfo.setNamedTypeInfo(nullptr);
5863
return NameInfo;
5864
}
5865
5866
case UnqualifiedIdKind::IK_DestructorName: {
5867
TypeSourceInfo *TInfo;
5868
QualType Ty = GetTypeFromParser(Name.DestructorName, &TInfo);
5869
if (Ty.isNull())
5870
return DeclarationNameInfo();
5871
NameInfo.setName(Context.DeclarationNames.getCXXDestructorName(
5872
Context.getCanonicalType(Ty)));
5873
NameInfo.setNamedTypeInfo(TInfo);
5874
return NameInfo;
5875
}
5876
5877
case UnqualifiedIdKind::IK_TemplateId: {
5878
TemplateName TName = Name.TemplateId->Template.get();
5879
SourceLocation TNameLoc = Name.TemplateId->TemplateNameLoc;
5880
return Context.getNameForTemplate(TName, TNameLoc);
5881
}
5882
5883
} // switch (Name.getKind())
5884
5885
llvm_unreachable("Unknown name kind");
5886
}
5887
5888
static QualType getCoreType(QualType Ty) {
5889
do {
5890
if (Ty->isPointerType() || Ty->isReferenceType())
5891
Ty = Ty->getPointeeType();
5892
else if (Ty->isArrayType())
5893
Ty = Ty->castAsArrayTypeUnsafe()->getElementType();
5894
else
5895
return Ty.withoutLocalFastQualifiers();
5896
} while (true);
5897
}
5898
5899
/// hasSimilarParameters - Determine whether the C++ functions Declaration
5900
/// and Definition have "nearly" matching parameters. This heuristic is
5901
/// used to improve diagnostics in the case where an out-of-line function
5902
/// definition doesn't match any declaration within the class or namespace.
5903
/// Also sets Params to the list of indices to the parameters that differ
5904
/// between the declaration and the definition. If hasSimilarParameters
5905
/// returns true and Params is empty, then all of the parameters match.
5906
static bool hasSimilarParameters(ASTContext &Context,
5907
FunctionDecl *Declaration,
5908
FunctionDecl *Definition,
5909
SmallVectorImpl<unsigned> &Params) {
5910
Params.clear();
5911
if (Declaration->param_size() != Definition->param_size())
5912
return false;
5913
for (unsigned Idx = 0; Idx < Declaration->param_size(); ++Idx) {
5914
QualType DeclParamTy = Declaration->getParamDecl(Idx)->getType();
5915
QualType DefParamTy = Definition->getParamDecl(Idx)->getType();
5916
5917
// The parameter types are identical
5918
if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
5919
continue;
5920
5921
QualType DeclParamBaseTy = getCoreType(DeclParamTy);
5922
QualType DefParamBaseTy = getCoreType(DefParamTy);
5923
const IdentifierInfo *DeclTyName = DeclParamBaseTy.getBaseTypeIdentifier();
5924
const IdentifierInfo *DefTyName = DefParamBaseTy.getBaseTypeIdentifier();
5925
5926
if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
5927
(DeclTyName && DeclTyName == DefTyName))
5928
Params.push_back(Idx);
5929
else // The two parameters aren't even close
5930
return false;
5931
}
5932
5933
return true;
5934
}
5935
5936
/// RebuildDeclaratorInCurrentInstantiation - Checks whether the given
5937
/// declarator needs to be rebuilt in the current instantiation.
5938
/// Any bits of declarator which appear before the name are valid for
5939
/// consideration here. That's specifically the type in the decl spec
5940
/// and the base type in any member-pointer chunks.
5941
static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D,
5942
DeclarationName Name) {
5943
// The types we specifically need to rebuild are:
5944
// - typenames, typeofs, and decltypes
5945
// - types which will become injected class names
5946
// Of course, we also need to rebuild any type referencing such a
5947
// type. It's safest to just say "dependent", but we call out a
5948
// few cases here.
5949
5950
DeclSpec &DS = D.getMutableDeclSpec();
5951
switch (DS.getTypeSpecType()) {
5952
case DeclSpec::TST_typename:
5953
case DeclSpec::TST_typeofType:
5954
case DeclSpec::TST_typeof_unqualType:
5955
#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
5956
#include "clang/Basic/TransformTypeTraits.def"
5957
case DeclSpec::TST_atomic: {
5958
// Grab the type from the parser.
5959
TypeSourceInfo *TSI = nullptr;
5960
QualType T = S.GetTypeFromParser(DS.getRepAsType(), &TSI);
5961
if (T.isNull() || !T->isInstantiationDependentType()) break;
5962
5963
// Make sure there's a type source info. This isn't really much
5964
// of a waste; most dependent types should have type source info
5965
// attached already.
5966
if (!TSI)
5967
TSI = S.Context.getTrivialTypeSourceInfo(T, DS.getTypeSpecTypeLoc());
5968
5969
// Rebuild the type in the current instantiation.
5970
TSI = S.RebuildTypeInCurrentInstantiation(TSI, D.getIdentifierLoc(), Name);
5971
if (!TSI) return true;
5972
5973
// Store the new type back in the decl spec.
5974
ParsedType LocType = S.CreateParsedType(TSI->getType(), TSI);
5975
DS.UpdateTypeRep(LocType);
5976
break;
5977
}
5978
5979
case DeclSpec::TST_decltype:
5980
case DeclSpec::TST_typeof_unqualExpr:
5981
case DeclSpec::TST_typeofExpr: {
5982
Expr *E = DS.getRepAsExpr();
5983
ExprResult Result = S.RebuildExprInCurrentInstantiation(E);
5984
if (Result.isInvalid()) return true;
5985
DS.UpdateExprRep(Result.get());
5986
break;
5987
}
5988
5989
default:
5990
// Nothing to do for these decl specs.
5991
break;
5992
}
5993
5994
// It doesn't matter what order we do this in.
5995
for (unsigned I = 0, E = D.getNumTypeObjects(); I != E; ++I) {
5996
DeclaratorChunk &Chunk = D.getTypeObject(I);
5997
5998
// The only type information in the declarator which can come
5999
// before the declaration name is the base type of a member
6000
// pointer.
6001
if (Chunk.Kind != DeclaratorChunk::MemberPointer)
6002
continue;
6003
6004
// Rebuild the scope specifier in-place.
6005
CXXScopeSpec &SS = Chunk.Mem.Scope();
6006
if (S.RebuildNestedNameSpecifierInCurrentInstantiation(SS))
6007
return true;
6008
}
6009
6010
return false;
6011
}
6012
6013
/// Returns true if the declaration is declared in a system header or from a
6014
/// system macro.
6015
static bool isFromSystemHeader(SourceManager &SM, const Decl *D) {
6016
return SM.isInSystemHeader(D->getLocation()) ||
6017
SM.isInSystemMacro(D->getLocation());
6018
}
6019
6020
void Sema::warnOnReservedIdentifier(const NamedDecl *D) {
6021
// Avoid warning twice on the same identifier, and don't warn on redeclaration
6022
// of system decl.
6023
if (D->getPreviousDecl() || D->isImplicit())
6024
return;
6025
ReservedIdentifierStatus Status = D->isReserved(getLangOpts());
6026
if (Status != ReservedIdentifierStatus::NotReserved &&
6027
!isFromSystemHeader(Context.getSourceManager(), D)) {
6028
Diag(D->getLocation(), diag::warn_reserved_extern_symbol)
6029
<< D << static_cast<int>(Status);
6030
}
6031
}
6032
6033
Decl *Sema::ActOnDeclarator(Scope *S, Declarator &D) {
6034
D.setFunctionDefinitionKind(FunctionDefinitionKind::Declaration);
6035
6036
// Check if we are in an `omp begin/end declare variant` scope. Handle this
6037
// declaration only if the `bind_to_declaration` extension is set.
6038
SmallVector<FunctionDecl *, 4> Bases;
6039
if (LangOpts.OpenMP && OpenMP().isInOpenMPDeclareVariantScope())
6040
if (OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6041
llvm::omp::TraitProperty::
6042
implementation_extension_bind_to_declaration))
6043
OpenMP().ActOnStartOfFunctionDefinitionInOpenMPDeclareVariantScope(
6044
S, D, MultiTemplateParamsArg(), Bases);
6045
6046
Decl *Dcl = HandleDeclarator(S, D, MultiTemplateParamsArg());
6047
6048
if (OriginalLexicalContext && OriginalLexicalContext->isObjCContainer() &&
6049
Dcl && Dcl->getDeclContext()->isFileContext())
6050
Dcl->setTopLevelDeclInObjCContainer();
6051
6052
if (!Bases.empty())
6053
OpenMP().ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope(Dcl,
6054
Bases);
6055
6056
return Dcl;
6057
}
6058
6059
bool Sema::DiagnoseClassNameShadow(DeclContext *DC,
6060
DeclarationNameInfo NameInfo) {
6061
DeclarationName Name = NameInfo.getName();
6062
6063
CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(DC);
6064
while (Record && Record->isAnonymousStructOrUnion())
6065
Record = dyn_cast<CXXRecordDecl>(Record->getParent());
6066
if (Record && Record->getIdentifier() && Record->getDeclName() == Name) {
6067
Diag(NameInfo.getLoc(), diag::err_member_name_of_class) << Name;
6068
return true;
6069
}
6070
6071
return false;
6072
}
6073
6074
bool Sema::diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC,
6075
DeclarationName Name,
6076
SourceLocation Loc,
6077
TemplateIdAnnotation *TemplateId,
6078
bool IsMemberSpecialization) {
6079
assert(SS.isValid() && "diagnoseQualifiedDeclaration called for declaration "
6080
"without nested-name-specifier");
6081
DeclContext *Cur = CurContext;
6082
while (isa<LinkageSpecDecl>(Cur) || isa<CapturedDecl>(Cur))
6083
Cur = Cur->getParent();
6084
6085
// If the user provided a superfluous scope specifier that refers back to the
6086
// class in which the entity is already declared, diagnose and ignore it.
6087
//
6088
// class X {
6089
// void X::f();
6090
// };
6091
//
6092
// Note, it was once ill-formed to give redundant qualification in all
6093
// contexts, but that rule was removed by DR482.
6094
if (Cur->Equals(DC)) {
6095
if (Cur->isRecord()) {
6096
Diag(Loc, LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6097
: diag::err_member_extra_qualification)
6098
<< Name << FixItHint::CreateRemoval(SS.getRange());
6099
SS.clear();
6100
} else {
6101
Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6102
}
6103
return false;
6104
}
6105
6106
// Check whether the qualifying scope encloses the scope of the original
6107
// declaration. For a template-id, we perform the checks in
6108
// CheckTemplateSpecializationScope.
6109
if (!Cur->Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6110
if (Cur->isRecord())
6111
Diag(Loc, diag::err_member_qualification)
6112
<< Name << SS.getRange();
6113
else if (isa<TranslationUnitDecl>(DC))
6114
Diag(Loc, diag::err_invalid_declarator_global_scope)
6115
<< Name << SS.getRange();
6116
else if (isa<FunctionDecl>(Cur))
6117
Diag(Loc, diag::err_invalid_declarator_in_function)
6118
<< Name << SS.getRange();
6119
else if (isa<BlockDecl>(Cur))
6120
Diag(Loc, diag::err_invalid_declarator_in_block)
6121
<< Name << SS.getRange();
6122
else if (isa<ExportDecl>(Cur)) {
6123
if (!isa<NamespaceDecl>(DC))
6124
Diag(Loc, diag::err_export_non_namespace_scope_name)
6125
<< Name << SS.getRange();
6126
else
6127
// The cases that DC is not NamespaceDecl should be handled in
6128
// CheckRedeclarationExported.
6129
return false;
6130
} else
6131
Diag(Loc, diag::err_invalid_declarator_scope)
6132
<< Name << cast<NamedDecl>(Cur) << cast<NamedDecl>(DC) << SS.getRange();
6133
6134
return true;
6135
}
6136
6137
if (Cur->isRecord()) {
6138
// Cannot qualify members within a class.
6139
Diag(Loc, diag::err_member_qualification)
6140
<< Name << SS.getRange();
6141
SS.clear();
6142
6143
// C++ constructors and destructors with incorrect scopes can break
6144
// our AST invariants by having the wrong underlying types. If
6145
// that's the case, then drop this declaration entirely.
6146
if ((Name.getNameKind() == DeclarationName::CXXConstructorName ||
6147
Name.getNameKind() == DeclarationName::CXXDestructorName) &&
6148
!Context.hasSameType(Name.getCXXNameType(),
6149
Context.getTypeDeclType(cast<CXXRecordDecl>(Cur))))
6150
return true;
6151
6152
return false;
6153
}
6154
6155
// C++23 [temp.names]p5:
6156
// The keyword template shall not appear immediately after a declarative
6157
// nested-name-specifier.
6158
//
6159
// First check the template-id (if any), and then check each component of the
6160
// nested-name-specifier in reverse order.
6161
//
6162
// FIXME: nested-name-specifiers in friend declarations are declarative,
6163
// but we don't call diagnoseQualifiedDeclaration for them. We should.
6164
if (TemplateId && TemplateId->TemplateKWLoc.isValid())
6165
Diag(Loc, diag::ext_template_after_declarative_nns)
6166
<< FixItHint::CreateRemoval(TemplateId->TemplateKWLoc);
6167
6168
NestedNameSpecifierLoc SpecLoc(SS.getScopeRep(), SS.location_data());
6169
do {
6170
if (SpecLoc.getNestedNameSpecifier()->getKind() ==
6171
NestedNameSpecifier::TypeSpecWithTemplate)
6172
Diag(Loc, diag::ext_template_after_declarative_nns)
6173
<< FixItHint::CreateRemoval(
6174
SpecLoc.getTypeLoc().getTemplateKeywordLoc());
6175
6176
if (const Type *T = SpecLoc.getNestedNameSpecifier()->getAsType()) {
6177
if (const auto *TST = T->getAsAdjusted<TemplateSpecializationType>()) {
6178
// C++23 [expr.prim.id.qual]p3:
6179
// [...] If a nested-name-specifier N is declarative and has a
6180
// simple-template-id with a template argument list A that involves a
6181
// template parameter, let T be the template nominated by N without A.
6182
// T shall be a class template.
6183
if (TST->isDependentType() && TST->isTypeAlias())
6184
Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6185
<< SpecLoc.getLocalSourceRange();
6186
} else if (T->isDecltypeType() || T->getAsAdjusted<PackIndexingType>()) {
6187
// C++23 [expr.prim.id.qual]p2:
6188
// [...] A declarative nested-name-specifier shall not have a
6189
// computed-type-specifier.
6190
//
6191
// CWG2858 changed this from 'decltype-specifier' to
6192
// 'computed-type-specifier'.
6193
Diag(Loc, diag::err_computed_type_in_declarative_nns)
6194
<< T->isDecltypeType() << SpecLoc.getTypeLoc().getSourceRange();
6195
}
6196
}
6197
} while ((SpecLoc = SpecLoc.getPrefix()));
6198
6199
return false;
6200
}
6201
6202
NamedDecl *Sema::HandleDeclarator(Scope *S, Declarator &D,
6203
MultiTemplateParamsArg TemplateParamLists) {
6204
// TODO: consider using NameInfo for diagnostic.
6205
DeclarationNameInfo NameInfo = GetNameForDeclarator(D);
6206
DeclarationName Name = NameInfo.getName();
6207
6208
// All of these full declarators require an identifier. If it doesn't have
6209
// one, the ParsedFreeStandingDeclSpec action should be used.
6210
if (D.isDecompositionDeclarator()) {
6211
return ActOnDecompositionDeclarator(S, D, TemplateParamLists);
6212
} else if (!Name) {
6213
if (!D.isInvalidType()) // Reject this if we think it is valid.
6214
Diag(D.getDeclSpec().getBeginLoc(), diag::err_declarator_need_ident)
6215
<< D.getDeclSpec().getSourceRange() << D.getSourceRange();
6216
return nullptr;
6217
} else if (DiagnoseUnexpandedParameterPack(NameInfo, UPPC_DeclarationType))
6218
return nullptr;
6219
6220
DeclContext *DC = CurContext;
6221
if (D.getCXXScopeSpec().isInvalid())
6222
D.setInvalidType();
6223
else if (D.getCXXScopeSpec().isSet()) {
6224
if (DiagnoseUnexpandedParameterPack(D.getCXXScopeSpec(),
6225
UPPC_DeclarationQualifier))
6226
return nullptr;
6227
6228
bool EnteringContext = !D.getDeclSpec().isFriendSpecified();
6229
DC = computeDeclContext(D.getCXXScopeSpec(), EnteringContext);
6230
if (!DC || isa<EnumDecl>(DC)) {
6231
// If we could not compute the declaration context, it's because the
6232
// declaration context is dependent but does not refer to a class,
6233
// class template, or class template partial specialization. Complain
6234
// and return early, to avoid the coming semantic disaster.
6235
Diag(D.getIdentifierLoc(),
6236
diag::err_template_qualified_declarator_no_match)
6237
<< D.getCXXScopeSpec().getScopeRep()
6238
<< D.getCXXScopeSpec().getRange();
6239
return nullptr;
6240
}
6241
bool IsDependentContext = DC->isDependentContext();
6242
6243
if (!IsDependentContext &&
6244
RequireCompleteDeclContext(D.getCXXScopeSpec(), DC))
6245
return nullptr;
6246
6247
// If a class is incomplete, do not parse entities inside it.
6248
if (isa<CXXRecordDecl>(DC) && !cast<CXXRecordDecl>(DC)->hasDefinition()) {
6249
Diag(D.getIdentifierLoc(),
6250
diag::err_member_def_undefined_record)
6251
<< Name << DC << D.getCXXScopeSpec().getRange();
6252
return nullptr;
6253
}
6254
if (!D.getDeclSpec().isFriendSpecified()) {
6255
TemplateIdAnnotation *TemplateId =
6256
D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId
6257
? D.getName().TemplateId
6258
: nullptr;
6259
if (diagnoseQualifiedDeclaration(D.getCXXScopeSpec(), DC, Name,
6260
D.getIdentifierLoc(), TemplateId,
6261
/*IsMemberSpecialization=*/false)) {
6262
if (DC->isRecord())
6263
return nullptr;
6264
6265
D.setInvalidType();
6266
}
6267
}
6268
6269
// Check whether we need to rebuild the type of the given
6270
// declaration in the current instantiation.
6271
if (EnteringContext && IsDependentContext &&
6272
TemplateParamLists.size() != 0) {
6273
ContextRAII SavedContext(*this, DC);
6274
if (RebuildDeclaratorInCurrentInstantiation(*this, D, Name))
6275
D.setInvalidType();
6276
}
6277
}
6278
6279
TypeSourceInfo *TInfo = GetTypeForDeclarator(D);
6280
QualType R = TInfo->getType();
6281
6282
if (DiagnoseUnexpandedParameterPack(D.getIdentifierLoc(), TInfo,
6283
UPPC_DeclarationType))
6284
D.setInvalidType();
6285
6286
LookupResult Previous(*this, NameInfo, LookupOrdinaryName,
6287
forRedeclarationInCurContext());
6288
6289
// See if this is a redefinition of a variable in the same scope.
6290
if (!D.getCXXScopeSpec().isSet()) {
6291
bool IsLinkageLookup = false;
6292
bool CreateBuiltins = false;
6293
6294
// If the declaration we're planning to build will be a function
6295
// or object with linkage, then look for another declaration with
6296
// linkage (C99 6.2.2p4-5 and C++ [basic.link]p6).
6297
//
6298
// If the declaration we're planning to build will be declared with
6299
// external linkage in the translation unit, create any builtin with
6300
// the same name.
6301
if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
6302
/* Do nothing*/;
6303
else if (CurContext->isFunctionOrMethod() &&
6304
(D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_extern ||
6305
R->isFunctionType())) {
6306
IsLinkageLookup = true;
6307
CreateBuiltins =
6308
CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6309
} else if (CurContext->getRedeclContext()->isTranslationUnit() &&
6310
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static)
6311
CreateBuiltins = true;
6312
6313
if (IsLinkageLookup) {
6314
Previous.clear(LookupRedeclarationWithLinkage);
6315
Previous.setRedeclarationKind(
6316
RedeclarationKind::ForExternalRedeclaration);
6317
}
6318
6319
LookupName(Previous, S, CreateBuiltins);
6320
} else { // Something like "int foo::x;"
6321
LookupQualifiedName(Previous, DC);
6322
6323
// C++ [dcl.meaning]p1:
6324
// When the declarator-id is qualified, the declaration shall refer to a
6325
// previously declared member of the class or namespace to which the
6326
// qualifier refers (or, in the case of a namespace, of an element of the
6327
// inline namespace set of that namespace (7.3.1)) or to a specialization
6328
// thereof; [...]
6329
//
6330
// Note that we already checked the context above, and that we do not have
6331
// enough information to make sure that Previous contains the declaration
6332
// we want to match. For example, given:
6333
//
6334
// class X {
6335
// void f();
6336
// void f(float);
6337
// };
6338
//
6339
// void X::f(int) { } // ill-formed
6340
//
6341
// In this case, Previous will point to the overload set
6342
// containing the two f's declared in X, but neither of them
6343
// matches.
6344
6345
RemoveUsingDecls(Previous);
6346
}
6347
6348
if (auto *TPD = Previous.getAsSingle<NamedDecl>();
6349
TPD && TPD->isTemplateParameter()) {
6350
// Older versions of clang allowed the names of function/variable templates
6351
// to shadow the names of their template parameters. For the compatibility
6352
// purposes we detect such cases and issue a default-to-error warning that
6353
// can be disabled with -Wno-strict-primary-template-shadow.
6354
if (!D.isInvalidType()) {
6355
bool AllowForCompatibility = false;
6356
if (Scope *DeclParent = S->getDeclParent();
6357
Scope *TemplateParamParent = S->getTemplateParamParent()) {
6358
AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6359
TemplateParamParent->isDeclScope(TPD);
6360
}
6361
DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), TPD,
6362
AllowForCompatibility);
6363
}
6364
6365
// Just pretend that we didn't see the previous declaration.
6366
Previous.clear();
6367
}
6368
6369
if (!R->isFunctionType() && DiagnoseClassNameShadow(DC, NameInfo))
6370
// Forget that the previous declaration is the injected-class-name.
6371
Previous.clear();
6372
6373
// In C++, the previous declaration we find might be a tag type
6374
// (class or enum). In this case, the new declaration will hide the
6375
// tag type. Note that this applies to functions, function templates, and
6376
// variables, but not to typedefs (C++ [dcl.typedef]p4) or variable templates.
6377
if (Previous.isSingleTagDecl() &&
6378
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
6379
(TemplateParamLists.size() == 0 || R->isFunctionType()))
6380
Previous.clear();
6381
6382
// Check that there are no default arguments other than in the parameters
6383
// of a function declaration (C++ only).
6384
if (getLangOpts().CPlusPlus)
6385
CheckExtraCXXDefaultArguments(D);
6386
6387
/// Get the innermost enclosing declaration scope.
6388
S = S->getDeclParent();
6389
6390
NamedDecl *New;
6391
6392
bool AddToScope = true;
6393
if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) {
6394
if (TemplateParamLists.size()) {
6395
Diag(D.getIdentifierLoc(), diag::err_template_typedef);
6396
return nullptr;
6397
}
6398
6399
New = ActOnTypedefDeclarator(S, D, DC, TInfo, Previous);
6400
} else if (R->isFunctionType()) {
6401
New = ActOnFunctionDeclarator(S, D, DC, TInfo, Previous,
6402
TemplateParamLists,
6403
AddToScope);
6404
} else {
6405
New = ActOnVariableDeclarator(S, D, DC, TInfo, Previous, TemplateParamLists,
6406
AddToScope);
6407
}
6408
6409
if (!New)
6410
return nullptr;
6411
6412
// If this has an identifier and is not a function template specialization,
6413
// add it to the scope stack.
6414
if (New->getDeclName() && AddToScope)
6415
PushOnScopeChains(New, S);
6416
6417
if (OpenMP().isInOpenMPDeclareTargetContext())
6418
OpenMP().checkDeclIsAllowedInOpenMPTarget(nullptr, New);
6419
6420
return New;
6421
}
6422
6423
/// Helper method to turn variable array types into constant array
6424
/// types in certain situations which would otherwise be errors (for
6425
/// GCC compatibility).
6426
static QualType TryToFixInvalidVariablyModifiedType(QualType T,
6427
ASTContext &Context,
6428
bool &SizeIsNegative,
6429
llvm::APSInt &Oversized) {
6430
// This method tries to turn a variable array into a constant
6431
// array even when the size isn't an ICE. This is necessary
6432
// for compatibility with code that depends on gcc's buggy
6433
// constant expression folding, like struct {char x[(int)(char*)2];}
6434
SizeIsNegative = false;
6435
Oversized = 0;
6436
6437
if (T->isDependentType())
6438
return QualType();
6439
6440
QualifierCollector Qs;
6441
const Type *Ty = Qs.strip(T);
6442
6443
if (const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6444
QualType Pointee = PTy->getPointeeType();
6445
QualType FixedType =
6446
TryToFixInvalidVariablyModifiedType(Pointee, Context, SizeIsNegative,
6447
Oversized);
6448
if (FixedType.isNull()) return FixedType;
6449
FixedType = Context.getPointerType(FixedType);
6450
return Qs.apply(Context, FixedType);
6451
}
6452
if (const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6453
QualType Inner = PTy->getInnerType();
6454
QualType FixedType =
6455
TryToFixInvalidVariablyModifiedType(Inner, Context, SizeIsNegative,
6456
Oversized);
6457
if (FixedType.isNull()) return FixedType;
6458
FixedType = Context.getParenType(FixedType);
6459
return Qs.apply(Context, FixedType);
6460
}
6461
6462
const VariableArrayType* VLATy = dyn_cast<VariableArrayType>(T);
6463
if (!VLATy)
6464
return QualType();
6465
6466
QualType ElemTy = VLATy->getElementType();
6467
if (ElemTy->isVariablyModifiedType()) {
6468
ElemTy = TryToFixInvalidVariablyModifiedType(ElemTy, Context,
6469
SizeIsNegative, Oversized);
6470
if (ElemTy.isNull())
6471
return QualType();
6472
}
6473
6474
Expr::EvalResult Result;
6475
if (!VLATy->getSizeExpr() ||
6476
!VLATy->getSizeExpr()->EvaluateAsInt(Result, Context))
6477
return QualType();
6478
6479
llvm::APSInt Res = Result.Val.getInt();
6480
6481
// Check whether the array size is negative.
6482
if (Res.isSigned() && Res.isNegative()) {
6483
SizeIsNegative = true;
6484
return QualType();
6485
}
6486
6487
// Check whether the array is too large to be addressed.
6488
unsigned ActiveSizeBits =
6489
(!ElemTy->isDependentType() && !ElemTy->isVariablyModifiedType() &&
6490
!ElemTy->isIncompleteType() && !ElemTy->isUndeducedType())
6491
? ConstantArrayType::getNumAddressingBits(Context, ElemTy, Res)
6492
: Res.getActiveBits();
6493
if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context)) {
6494
Oversized = Res;
6495
return QualType();
6496
}
6497
6498
QualType FoldedArrayType = Context.getConstantArrayType(
6499
ElemTy, Res, VLATy->getSizeExpr(), ArraySizeModifier::Normal, 0);
6500
return Qs.apply(Context, FoldedArrayType);
6501
}
6502
6503
static void
6504
FixInvalidVariablyModifiedTypeLoc(TypeLoc SrcTL, TypeLoc DstTL) {
6505
SrcTL = SrcTL.getUnqualifiedLoc();
6506
DstTL = DstTL.getUnqualifiedLoc();
6507
if (PointerTypeLoc SrcPTL = SrcTL.getAs<PointerTypeLoc>()) {
6508
PointerTypeLoc DstPTL = DstTL.castAs<PointerTypeLoc>();
6509
FixInvalidVariablyModifiedTypeLoc(SrcPTL.getPointeeLoc(),
6510
DstPTL.getPointeeLoc());
6511
DstPTL.setStarLoc(SrcPTL.getStarLoc());
6512
return;
6513
}
6514
if (ParenTypeLoc SrcPTL = SrcTL.getAs<ParenTypeLoc>()) {
6515
ParenTypeLoc DstPTL = DstTL.castAs<ParenTypeLoc>();
6516
FixInvalidVariablyModifiedTypeLoc(SrcPTL.getInnerLoc(),
6517
DstPTL.getInnerLoc());
6518
DstPTL.setLParenLoc(SrcPTL.getLParenLoc());
6519
DstPTL.setRParenLoc(SrcPTL.getRParenLoc());
6520
return;
6521
}
6522
ArrayTypeLoc SrcATL = SrcTL.castAs<ArrayTypeLoc>();
6523
ArrayTypeLoc DstATL = DstTL.castAs<ArrayTypeLoc>();
6524
TypeLoc SrcElemTL = SrcATL.getElementLoc();
6525
TypeLoc DstElemTL = DstATL.getElementLoc();
6526
if (VariableArrayTypeLoc SrcElemATL =
6527
SrcElemTL.getAs<VariableArrayTypeLoc>()) {
6528
ConstantArrayTypeLoc DstElemATL = DstElemTL.castAs<ConstantArrayTypeLoc>();
6529
FixInvalidVariablyModifiedTypeLoc(SrcElemATL, DstElemATL);
6530
} else {
6531
DstElemTL.initializeFullCopy(SrcElemTL);
6532
}
6533
DstATL.setLBracketLoc(SrcATL.getLBracketLoc());
6534
DstATL.setSizeExpr(SrcATL.getSizeExpr());
6535
DstATL.setRBracketLoc(SrcATL.getRBracketLoc());
6536
}
6537
6538
/// Helper method to turn variable array types into constant array
6539
/// types in certain situations which would otherwise be errors (for
6540
/// GCC compatibility).
6541
static TypeSourceInfo*
6542
TryToFixInvalidVariablyModifiedTypeSourceInfo(TypeSourceInfo *TInfo,
6543
ASTContext &Context,
6544
bool &SizeIsNegative,
6545
llvm::APSInt &Oversized) {
6546
QualType FixedTy
6547
= TryToFixInvalidVariablyModifiedType(TInfo->getType(), Context,
6548
SizeIsNegative, Oversized);
6549
if (FixedTy.isNull())
6550
return nullptr;
6551
TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6552
FixInvalidVariablyModifiedTypeLoc(TInfo->getTypeLoc(),
6553
FixedTInfo->getTypeLoc());
6554
return FixedTInfo;
6555
}
6556
6557
bool Sema::tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo,
6558
QualType &T, SourceLocation Loc,
6559
unsigned FailedFoldDiagID) {
6560
bool SizeIsNegative;
6561
llvm::APSInt Oversized;
6562
TypeSourceInfo *FixedTInfo = TryToFixInvalidVariablyModifiedTypeSourceInfo(
6563
TInfo, Context, SizeIsNegative, Oversized);
6564
if (FixedTInfo) {
6565
Diag(Loc, diag::ext_vla_folded_to_constant);
6566
TInfo = FixedTInfo;
6567
T = FixedTInfo->getType();
6568
return true;
6569
}
6570
6571
if (SizeIsNegative)
6572
Diag(Loc, diag::err_typecheck_negative_array_size);
6573
else if (Oversized.getBoolValue())
6574
Diag(Loc, diag::err_array_too_large) << toString(Oversized, 10);
6575
else if (FailedFoldDiagID)
6576
Diag(Loc, FailedFoldDiagID);
6577
return false;
6578
}
6579
6580
void
6581
Sema::RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S) {
6582
if (!getLangOpts().CPlusPlus &&
6583
ND->getLexicalDeclContext()->getRedeclContext()->isTranslationUnit())
6584
// Don't need to track declarations in the TU in C.
6585
return;
6586
6587
// Note that we have a locally-scoped external with this name.
6588
Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6589
}
6590
6591
NamedDecl *Sema::findLocallyScopedExternCDecl(DeclarationName Name) {
6592
// FIXME: We can have multiple results via __attribute__((overloadable)).
6593
auto Result = Context.getExternCContextDecl()->lookup(Name);
6594
return Result.empty() ? nullptr : *Result.begin();
6595
}
6596
6597
void Sema::DiagnoseFunctionSpecifiers(const DeclSpec &DS) {
6598
// FIXME: We should probably indicate the identifier in question to avoid
6599
// confusion for constructs like "virtual int a(), b;"
6600
if (DS.isVirtualSpecified())
6601
Diag(DS.getVirtualSpecLoc(),
6602
diag::err_virtual_non_function);
6603
6604
if (DS.hasExplicitSpecifier())
6605
Diag(DS.getExplicitSpecLoc(),
6606
diag::err_explicit_non_function);
6607
6608
if (DS.isNoreturnSpecified())
6609
Diag(DS.getNoreturnSpecLoc(),
6610
diag::err_noreturn_non_function);
6611
}
6612
6613
NamedDecl*
6614
Sema::ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC,
6615
TypeSourceInfo *TInfo, LookupResult &Previous) {
6616
// Typedef declarators cannot be qualified (C++ [dcl.meaning]p1).
6617
if (D.getCXXScopeSpec().isSet()) {
6618
Diag(D.getIdentifierLoc(), diag::err_qualified_typedef_declarator)
6619
<< D.getCXXScopeSpec().getRange();
6620
D.setInvalidType();
6621
// Pretend we didn't see the scope specifier.
6622
DC = CurContext;
6623
Previous.clear();
6624
}
6625
6626
DiagnoseFunctionSpecifiers(D.getDeclSpec());
6627
6628
if (D.getDeclSpec().isInlineSpecified())
6629
Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
6630
<< getLangOpts().CPlusPlus17;
6631
if (D.getDeclSpec().hasConstexprSpecifier())
6632
Diag(D.getDeclSpec().getConstexprSpecLoc(), diag::err_invalid_constexpr)
6633
<< 1 << static_cast<int>(D.getDeclSpec().getConstexprSpecifier());
6634
6635
if (D.getName().getKind() != UnqualifiedIdKind::IK_Identifier) {
6636
if (D.getName().getKind() == UnqualifiedIdKind::IK_DeductionGuideName)
6637
Diag(D.getName().StartLocation,
6638
diag::err_deduction_guide_invalid_specifier)
6639
<< "typedef";
6640
else
6641
Diag(D.getName().StartLocation, diag::err_typedef_not_identifier)
6642
<< D.getName().getSourceRange();
6643
return nullptr;
6644
}
6645
6646
TypedefDecl *NewTD = ParseTypedefDecl(S, D, TInfo->getType(), TInfo);
6647
if (!NewTD) return nullptr;
6648
6649
// Handle attributes prior to checking for duplicates in MergeVarDecl
6650
ProcessDeclAttributes(S, NewTD, D);
6651
6652
CheckTypedefForVariablyModifiedType(S, NewTD);
6653
6654
bool Redeclaration = D.isRedeclaration();
6655
NamedDecl *ND = ActOnTypedefNameDecl(S, DC, NewTD, Previous, Redeclaration);
6656
D.setRedeclaration(Redeclaration);
6657
return ND;
6658
}
6659
6660
void
6661
Sema::CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *NewTD) {
6662
// C99 6.7.7p2: If a typedef name specifies a variably modified type
6663
// then it shall have block scope.
6664
// Note that variably modified types must be fixed before merging the decl so
6665
// that redeclarations will match.
6666
TypeSourceInfo *TInfo = NewTD->getTypeSourceInfo();
6667
QualType T = TInfo->getType();
6668
if (T->isVariablyModifiedType()) {
6669
setFunctionHasBranchProtectedScope();
6670
6671
if (S->getFnParent() == nullptr) {
6672
bool SizeIsNegative;
6673
llvm::APSInt Oversized;
6674
TypeSourceInfo *FixedTInfo =
6675
TryToFixInvalidVariablyModifiedTypeSourceInfo(TInfo, Context,
6676
SizeIsNegative,
6677
Oversized);
6678
if (FixedTInfo) {
6679
Diag(NewTD->getLocation(), diag::ext_vla_folded_to_constant);
6680
NewTD->setTypeSourceInfo(FixedTInfo);
6681
} else {
6682
if (SizeIsNegative)
6683
Diag(NewTD->getLocation(), diag::err_typecheck_negative_array_size);
6684
else if (T->isVariableArrayType())
6685
Diag(NewTD->getLocation(), diag::err_vla_decl_in_file_scope);
6686
else if (Oversized.getBoolValue())
6687
Diag(NewTD->getLocation(), diag::err_array_too_large)
6688
<< toString(Oversized, 10);
6689
else
6690
Diag(NewTD->getLocation(), diag::err_vm_decl_in_file_scope);
6691
NewTD->setInvalidDecl();
6692
}
6693
}
6694
}
6695
}
6696
6697
NamedDecl*
6698
Sema::ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *NewTD,
6699
LookupResult &Previous, bool &Redeclaration) {
6700
6701
// Find the shadowed declaration before filtering for scope.
6702
NamedDecl *ShadowedDecl = getShadowedDeclaration(NewTD, Previous);
6703
6704
// Merge the decl with the existing one if appropriate. If the decl is
6705
// in an outer scope, it isn't the same thing.
6706
FilterLookupForScope(Previous, DC, S, /*ConsiderLinkage*/false,
6707
/*AllowInlineNamespace*/false);
6708
filterNonConflictingPreviousTypedefDecls(*this, NewTD, Previous);
6709
if (!Previous.empty()) {
6710
Redeclaration = true;
6711
MergeTypedefNameDecl(S, NewTD, Previous);
6712
} else {
6713
inferGslPointerAttribute(NewTD);
6714
}
6715
6716
if (ShadowedDecl && !Redeclaration)
6717
CheckShadow(NewTD, ShadowedDecl, Previous);
6718
6719
// If this is the C FILE type, notify the AST context.
6720
if (IdentifierInfo *II = NewTD->getIdentifier())
6721
if (!NewTD->isInvalidDecl() &&
6722
NewTD->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
6723
switch (II->getNotableIdentifierID()) {
6724
case tok::NotableIdentifierKind::FILE:
6725
Context.setFILEDecl(NewTD);
6726
break;
6727
case tok::NotableIdentifierKind::jmp_buf:
6728
Context.setjmp_bufDecl(NewTD);
6729
break;
6730
case tok::NotableIdentifierKind::sigjmp_buf:
6731
Context.setsigjmp_bufDecl(NewTD);
6732
break;
6733
case tok::NotableIdentifierKind::ucontext_t:
6734
Context.setucontext_tDecl(NewTD);
6735
break;
6736
case tok::NotableIdentifierKind::float_t:
6737
case tok::NotableIdentifierKind::double_t:
6738
NewTD->addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(Context));
6739
break;
6740
default:
6741
break;
6742
}
6743
}
6744
6745
return NewTD;
6746
}
6747
6748
/// Determines whether the given declaration is an out-of-scope
6749
/// previous declaration.
6750
///
6751
/// This routine should be invoked when name lookup has found a
6752
/// previous declaration (PrevDecl) that is not in the scope where a
6753
/// new declaration by the same name is being introduced. If the new
6754
/// declaration occurs in a local scope, previous declarations with
6755
/// linkage may still be considered previous declarations (C99
6756
/// 6.2.2p4-5, C++ [basic.link]p6).
6757
///
6758
/// \param PrevDecl the previous declaration found by name
6759
/// lookup
6760
///
6761
/// \param DC the context in which the new declaration is being
6762
/// declared.
6763
///
6764
/// \returns true if PrevDecl is an out-of-scope previous declaration
6765
/// for a new delcaration with the same name.
6766
static bool
6767
isOutOfScopePreviousDeclaration(NamedDecl *PrevDecl, DeclContext *DC,
6768
ASTContext &Context) {
6769
if (!PrevDecl)
6770
return false;
6771
6772
if (!PrevDecl->hasLinkage())
6773
return false;
6774
6775
if (Context.getLangOpts().CPlusPlus) {
6776
// C++ [basic.link]p6:
6777
// If there is a visible declaration of an entity with linkage
6778
// having the same name and type, ignoring entities declared
6779
// outside the innermost enclosing namespace scope, the block
6780
// scope declaration declares that same entity and receives the
6781
// linkage of the previous declaration.
6782
DeclContext *OuterContext = DC->getRedeclContext();
6783
if (!OuterContext->isFunctionOrMethod())
6784
// This rule only applies to block-scope declarations.
6785
return false;
6786
6787
DeclContext *PrevOuterContext = PrevDecl->getDeclContext();
6788
if (PrevOuterContext->isRecord())
6789
// We found a member function: ignore it.
6790
return false;
6791
6792
// Find the innermost enclosing namespace for the new and
6793
// previous declarations.
6794
OuterContext = OuterContext->getEnclosingNamespaceContext();
6795
PrevOuterContext = PrevOuterContext->getEnclosingNamespaceContext();
6796
6797
// The previous declaration is in a different namespace, so it
6798
// isn't the same function.
6799
if (!OuterContext->Equals(PrevOuterContext))
6800
return false;
6801
}
6802
6803
return true;
6804
}
6805
6806
static void SetNestedNameSpecifier(Sema &S, DeclaratorDecl *DD, Declarator &D) {
6807
CXXScopeSpec &SS = D.getCXXScopeSpec();
6808
if (!SS.isSet()) return;
6809
DD->setQualifierInfo(SS.getWithLocInContext(S.Context));
6810
}
6811
6812
void Sema::deduceOpenCLAddressSpace(ValueDecl *Decl) {
6813
if (Decl->getType().hasAddressSpace())
6814
return;
6815
if (Decl->getType()->isDependentType())
6816
return;
6817
if (VarDecl *Var = dyn_cast<VarDecl>(Decl)) {
6818
QualType Type = Var->getType();
6819
if (Type->isSamplerT() || Type->isVoidType())
6820
return;
6821
LangAS ImplAS = LangAS::opencl_private;
6822
// OpenCL C v3.0 s6.7.8 - For OpenCL C 2.0 or with the
6823
// __opencl_c_program_scope_global_variables feature, the address space
6824
// for a variable at program scope or a static or extern variable inside
6825
// a function are inferred to be __global.
6826
if (getOpenCLOptions().areProgramScopeVariablesSupported(getLangOpts()) &&
6827
Var->hasGlobalStorage())
6828
ImplAS = LangAS::opencl_global;
6829
// If the original type from a decayed type is an array type and that array
6830
// type has no address space yet, deduce it now.
6831
if (auto DT = dyn_cast<DecayedType>(Type)) {
6832
auto OrigTy = DT->getOriginalType();
6833
if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) {
6834
// Add the address space to the original array type and then propagate
6835
// that to the element type through `getAsArrayType`.
6836
OrigTy = Context.getAddrSpaceQualType(OrigTy, ImplAS);
6837
OrigTy = QualType(Context.getAsArrayType(OrigTy), 0);
6838
// Re-generate the decayed type.
6839
Type = Context.getDecayedType(OrigTy);
6840
}
6841
}
6842
Type = Context.getAddrSpaceQualType(Type, ImplAS);
6843
// Apply any qualifiers (including address space) from the array type to
6844
// the element type. This implements C99 6.7.3p8: "If the specification of
6845
// an array type includes any type qualifiers, the element type is so
6846
// qualified, not the array type."
6847
if (Type->isArrayType())
6848
Type = QualType(Context.getAsArrayType(Type), 0);
6849
Decl->setType(Type);
6850
}
6851
}
6852
6853
static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND) {
6854
// Ensure that an auto decl is deduced otherwise the checks below might cache
6855
// the wrong linkage.
6856
assert(S.ParsingInitForAutoVars.count(&ND) == 0);
6857
6858
// 'weak' only applies to declarations with external linkage.
6859
if (WeakAttr *Attr = ND.getAttr<WeakAttr>()) {
6860
if (!ND.isExternallyVisible()) {
6861
S.Diag(Attr->getLocation(), diag::err_attribute_weak_static);
6862
ND.dropAttr<WeakAttr>();
6863
}
6864
}
6865
if (WeakRefAttr *Attr = ND.getAttr<WeakRefAttr>()) {
6866
if (ND.isExternallyVisible()) {
6867
S.Diag(Attr->getLocation(), diag::err_attribute_weakref_not_static);
6868
ND.dropAttrs<WeakRefAttr, AliasAttr>();
6869
}
6870
}
6871
6872
if (auto *VD = dyn_cast<VarDecl>(&ND)) {
6873
if (VD->hasInit()) {
6874
if (const auto *Attr = VD->getAttr<AliasAttr>()) {
6875
assert(VD->isThisDeclarationADefinition() &&
6876
!VD->isExternallyVisible() && "Broken AliasAttr handled late!");
6877
S.Diag(Attr->getLocation(), diag::err_alias_is_definition) << VD << 0;
6878
VD->dropAttr<AliasAttr>();
6879
}
6880
}
6881
}
6882
6883
// 'selectany' only applies to externally visible variable declarations.
6884
// It does not apply to functions.
6885
if (SelectAnyAttr *Attr = ND.getAttr<SelectAnyAttr>()) {
6886
if (isa<FunctionDecl>(ND) || !ND.isExternallyVisible()) {
6887
S.Diag(Attr->getLocation(),
6888
diag::err_attribute_selectany_non_extern_data);
6889
ND.dropAttr<SelectAnyAttr>();
6890
}
6891
}
6892
6893
if (HybridPatchableAttr *Attr = ND.getAttr<HybridPatchableAttr>()) {
6894
if (!ND.isExternallyVisible())
6895
S.Diag(Attr->getLocation(),
6896
diag::warn_attribute_hybrid_patchable_non_extern);
6897
}
6898
if (const InheritableAttr *Attr = getDLLAttr(&ND)) {
6899
auto *VD = dyn_cast<VarDecl>(&ND);
6900
bool IsAnonymousNS = false;
6901
bool IsMicrosoft = S.Context.getTargetInfo().getCXXABI().isMicrosoft();
6902
if (VD) {
6903
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
6904
while (NS && !IsAnonymousNS) {
6905
IsAnonymousNS = NS->isAnonymousNamespace();
6906
NS = dyn_cast<NamespaceDecl>(NS->getParent());
6907
}
6908
}
6909
// dll attributes require external linkage. Static locals may have external
6910
// linkage but still cannot be explicitly imported or exported.
6911
// In Microsoft mode, a variable defined in anonymous namespace must have
6912
// external linkage in order to be exported.
6913
bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
6914
if ((ND.isExternallyVisible() && AnonNSInMicrosoftMode) ||
6915
(!AnonNSInMicrosoftMode &&
6916
(!ND.isExternallyVisible() || (VD && VD->isStaticLocal())))) {
6917
S.Diag(ND.getLocation(), diag::err_attribute_dll_not_extern)
6918
<< &ND << Attr;
6919
ND.setInvalidDecl();
6920
}
6921
}
6922
6923
// Check the attributes on the function type, if any.
6924
if (const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
6925
// Don't declare this variable in the second operand of the for-statement;
6926
// GCC miscompiles that by ending its lifetime before evaluating the
6927
// third operand. See gcc.gnu.org/PR86769.
6928
AttributedTypeLoc ATL;
6929
for (TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
6930
(ATL = TL.getAsAdjusted<AttributedTypeLoc>());
6931
TL = ATL.getModifiedLoc()) {
6932
// The [[lifetimebound]] attribute can be applied to the implicit object
6933
// parameter of a non-static member function (other than a ctor or dtor)
6934
// by applying it to the function type.
6935
if (const auto *A = ATL.getAttrAs<LifetimeBoundAttr>()) {
6936
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
6937
if (!MD || MD->isStatic()) {
6938
S.Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
6939
<< !MD << A->getRange();
6940
} else if (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)) {
6941
S.Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
6942
<< isa<CXXDestructorDecl>(MD) << A->getRange();
6943
}
6944
}
6945
}
6946
}
6947
}
6948
6949
static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl,
6950
NamedDecl *NewDecl,
6951
bool IsSpecialization,
6952
bool IsDefinition) {
6953
if (OldDecl->isInvalidDecl() || NewDecl->isInvalidDecl())
6954
return;
6955
6956
bool IsTemplate = false;
6957
if (TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
6958
OldDecl = OldTD->getTemplatedDecl();
6959
IsTemplate = true;
6960
if (!IsSpecialization)
6961
IsDefinition = false;
6962
}
6963
if (TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
6964
NewDecl = NewTD->getTemplatedDecl();
6965
IsTemplate = true;
6966
}
6967
6968
if (!OldDecl || !NewDecl)
6969
return;
6970
6971
const DLLImportAttr *OldImportAttr = OldDecl->getAttr<DLLImportAttr>();
6972
const DLLExportAttr *OldExportAttr = OldDecl->getAttr<DLLExportAttr>();
6973
const DLLImportAttr *NewImportAttr = NewDecl->getAttr<DLLImportAttr>();
6974
const DLLExportAttr *NewExportAttr = NewDecl->getAttr<DLLExportAttr>();
6975
6976
// dllimport and dllexport are inheritable attributes so we have to exclude
6977
// inherited attribute instances.
6978
bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
6979
(NewExportAttr && !NewExportAttr->isInherited());
6980
6981
// A redeclaration is not allowed to add a dllimport or dllexport attribute,
6982
// the only exception being explicit specializations.
6983
// Implicitly generated declarations are also excluded for now because there
6984
// is no other way to switch these to use dllimport or dllexport.
6985
bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
6986
6987
if (AddsAttr && !IsSpecialization && !OldDecl->isImplicit()) {
6988
// Allow with a warning for free functions and global variables.
6989
bool JustWarn = false;
6990
if (!OldDecl->isCXXClassMember()) {
6991
auto *VD = dyn_cast<VarDecl>(OldDecl);
6992
if (VD && !VD->getDescribedVarTemplate())
6993
JustWarn = true;
6994
auto *FD = dyn_cast<FunctionDecl>(OldDecl);
6995
if (FD && FD->getTemplatedKind() == FunctionDecl::TK_NonTemplate)
6996
JustWarn = true;
6997
}
6998
6999
// We cannot change a declaration that's been used because IR has already
7000
// been emitted. Dllimported functions will still work though (modulo
7001
// address equality) as they can use the thunk.
7002
if (OldDecl->isUsed())
7003
if (!isa<FunctionDecl>(OldDecl) || !NewImportAttr)
7004
JustWarn = false;
7005
7006
unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7007
: diag::err_attribute_dll_redeclaration;
7008
S.Diag(NewDecl->getLocation(), DiagID)
7009
<< NewDecl
7010
<< (NewImportAttr ? (const Attr *)NewImportAttr : NewExportAttr);
7011
S.Diag(OldDecl->getLocation(), diag::note_previous_declaration);
7012
if (!JustWarn) {
7013
NewDecl->setInvalidDecl();
7014
return;
7015
}
7016
}
7017
7018
// A redeclaration is not allowed to drop a dllimport attribute, the only
7019
// exceptions being inline function definitions (except for function
7020
// templates), local extern declarations, qualified friend declarations or
7021
// special MSVC extension: in the last case, the declaration is treated as if
7022
// it were marked dllexport.
7023
bool IsInline = false, IsStaticDataMember = false, IsQualifiedFriend = false;
7024
bool IsMicrosoftABI = S.Context.getTargetInfo().shouldDLLImportComdatSymbols();
7025
if (const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7026
// Ignore static data because out-of-line definitions are diagnosed
7027
// separately.
7028
IsStaticDataMember = VD->isStaticDataMember();
7029
IsDefinition = VD->isThisDeclarationADefinition(S.Context) !=
7030
VarDecl::DeclarationOnly;
7031
} else if (const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7032
IsInline = FD->isInlined();
7033
IsQualifiedFriend = FD->getQualifier() &&
7034
FD->getFriendObjectKind() == Decl::FOK_Declared;
7035
}
7036
7037
if (OldImportAttr && !HasNewAttr &&
7038
(!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7039
!NewDecl->isLocalExternDecl() && !IsQualifiedFriend) {
7040
if (IsMicrosoftABI && IsDefinition) {
7041
if (IsSpecialization) {
7042
S.Diag(
7043
NewDecl->getLocation(),
7044
diag::err_attribute_dllimport_function_specialization_definition);
7045
S.Diag(OldImportAttr->getLocation(), diag::note_attribute);
7046
NewDecl->dropAttr<DLLImportAttr>();
7047
} else {
7048
S.Diag(NewDecl->getLocation(),
7049
diag::warn_redeclaration_without_import_attribute)
7050
<< NewDecl;
7051
S.Diag(OldDecl->getLocation(), diag::note_previous_declaration);
7052
NewDecl->dropAttr<DLLImportAttr>();
7053
NewDecl->addAttr(DLLExportAttr::CreateImplicit(
7054
S.Context, NewImportAttr->getRange()));
7055
}
7056
} else if (IsMicrosoftABI && IsSpecialization) {
7057
assert(!IsDefinition);
7058
// MSVC allows this. Keep the inherited attribute.
7059
} else {
7060
S.Diag(NewDecl->getLocation(),
7061
diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7062
<< NewDecl << OldImportAttr;
7063
S.Diag(OldDecl->getLocation(), diag::note_previous_declaration);
7064
S.Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7065
OldDecl->dropAttr<DLLImportAttr>();
7066
NewDecl->dropAttr<DLLImportAttr>();
7067
}
7068
} else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7069
// In MinGW, seeing a function declared inline drops the dllimport
7070
// attribute.
7071
OldDecl->dropAttr<DLLImportAttr>();
7072
NewDecl->dropAttr<DLLImportAttr>();
7073
S.Diag(NewDecl->getLocation(),
7074
diag::warn_dllimport_dropped_from_inline_function)
7075
<< NewDecl << OldImportAttr;
7076
}
7077
7078
// A specialization of a class template member function is processed here
7079
// since it's a redeclaration. If the parent class is dllexport, the
7080
// specialization inherits that attribute. This doesn't happen automatically
7081
// since the parent class isn't instantiated until later.
7082
if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7083
if (MD->getTemplatedKind() == FunctionDecl::TK_MemberSpecialization &&
7084
!NewImportAttr && !NewExportAttr) {
7085
if (const DLLExportAttr *ParentExportAttr =
7086
MD->getParent()->getAttr<DLLExportAttr>()) {
7087
DLLExportAttr *NewAttr = ParentExportAttr->clone(S.Context);
7088
NewAttr->setInherited(true);
7089
NewDecl->addAttr(NewAttr);
7090
}
7091
}
7092
}
7093
}
7094
7095
/// Given that we are within the definition of the given function,
7096
/// will that definition behave like C99's 'inline', where the
7097
/// definition is discarded except for optimization purposes?
7098
static bool isFunctionDefinitionDiscarded(Sema &S, FunctionDecl *FD) {
7099
// Try to avoid calling GetGVALinkageForFunction.
7100
7101
// All cases of this require the 'inline' keyword.
7102
if (!FD->isInlined()) return false;
7103
7104
// This is only possible in C++ with the gnu_inline attribute.
7105
if (S.getLangOpts().CPlusPlus && !FD->hasAttr<GNUInlineAttr>())
7106
return false;
7107
7108
// Okay, go ahead and call the relatively-more-expensive function.
7109
return S.Context.GetGVALinkageForFunction(FD) == GVA_AvailableExternally;
7110
}
7111
7112
/// Determine whether a variable is extern "C" prior to attaching
7113
/// an initializer. We can't just call isExternC() here, because that
7114
/// will also compute and cache whether the declaration is externally
7115
/// visible, which might change when we attach the initializer.
7116
///
7117
/// This can only be used if the declaration is known to not be a
7118
/// redeclaration of an internal linkage declaration.
7119
///
7120
/// For instance:
7121
///
7122
/// auto x = []{};
7123
///
7124
/// Attaching the initializer here makes this declaration not externally
7125
/// visible, because its type has internal linkage.
7126
///
7127
/// FIXME: This is a hack.
7128
template<typename T>
7129
static bool isIncompleteDeclExternC(Sema &S, const T *D) {
7130
if (S.getLangOpts().CPlusPlus) {
7131
// In C++, the overloadable attribute negates the effects of extern "C".
7132
if (!D->isInExternCContext() || D->template hasAttr<OverloadableAttr>())
7133
return false;
7134
7135
// So do CUDA's host/device attributes.
7136
if (S.getLangOpts().CUDA && (D->template hasAttr<CUDADeviceAttr>() ||
7137
D->template hasAttr<CUDAHostAttr>()))
7138
return false;
7139
}
7140
return D->isExternC();
7141
}
7142
7143
static bool shouldConsiderLinkage(const VarDecl *VD) {
7144
const DeclContext *DC = VD->getDeclContext()->getRedeclContext();
7145
if (DC->isFunctionOrMethod() || isa<OMPDeclareReductionDecl>(DC) ||
7146
isa<OMPDeclareMapperDecl>(DC))
7147
return VD->hasExternalStorage();
7148
if (DC->isFileContext())
7149
return true;
7150
if (DC->isRecord())
7151
return false;
7152
if (DC->getDeclKind() == Decl::HLSLBuffer)
7153
return false;
7154
7155
if (isa<RequiresExprBodyDecl>(DC))
7156
return false;
7157
llvm_unreachable("Unexpected context");
7158
}
7159
7160
static bool shouldConsiderLinkage(const FunctionDecl *FD) {
7161
const DeclContext *DC = FD->getDeclContext()->getRedeclContext();
7162
if (DC->isFileContext() || DC->isFunctionOrMethod() ||
7163
isa<OMPDeclareReductionDecl>(DC) || isa<OMPDeclareMapperDecl>(DC))
7164
return true;
7165
if (DC->isRecord())
7166
return false;
7167
llvm_unreachable("Unexpected context");
7168
}
7169
7170
static bool hasParsedAttr(Scope *S, const Declarator &PD,
7171
ParsedAttr::Kind Kind) {
7172
// Check decl attributes on the DeclSpec.
7173
if (PD.getDeclSpec().getAttributes().hasAttribute(Kind))
7174
return true;
7175
7176
// Walk the declarator structure, checking decl attributes that were in a type
7177
// position to the decl itself.
7178
for (unsigned I = 0, E = PD.getNumTypeObjects(); I != E; ++I) {
7179
if (PD.getTypeObject(I).getAttrs().hasAttribute(Kind))
7180
return true;
7181
}
7182
7183
// Finally, check attributes on the decl itself.
7184
return PD.getAttributes().hasAttribute(Kind) ||
7185
PD.getDeclarationAttributes().hasAttribute(Kind);
7186
}
7187
7188
bool Sema::adjustContextForLocalExternDecl(DeclContext *&DC) {
7189
if (!DC->isFunctionOrMethod())
7190
return false;
7191
7192
// If this is a local extern function or variable declared within a function
7193
// template, don't add it into the enclosing namespace scope until it is
7194
// instantiated; it might have a dependent type right now.
7195
if (DC->isDependentContext())
7196
return true;
7197
7198
// C++11 [basic.link]p7:
7199
// When a block scope declaration of an entity with linkage is not found to
7200
// refer to some other declaration, then that entity is a member of the
7201
// innermost enclosing namespace.
7202
//
7203
// Per C++11 [namespace.def]p6, the innermost enclosing namespace is a
7204
// semantically-enclosing namespace, not a lexically-enclosing one.
7205
while (!DC->isFileContext() && !isa<LinkageSpecDecl>(DC))
7206
DC = DC->getParent();
7207
return true;
7208
}
7209
7210
/// Returns true if given declaration has external C language linkage.
7211
static bool isDeclExternC(const Decl *D) {
7212
if (const auto *FD = dyn_cast<FunctionDecl>(D))
7213
return FD->isExternC();
7214
if (const auto *VD = dyn_cast<VarDecl>(D))
7215
return VD->isExternC();
7216
7217
llvm_unreachable("Unknown type of decl!");
7218
}
7219
7220
/// Returns true if there hasn't been any invalid type diagnosed.
7221
static bool diagnoseOpenCLTypes(Sema &Se, VarDecl *NewVD) {
7222
DeclContext *DC = NewVD->getDeclContext();
7223
QualType R = NewVD->getType();
7224
7225
// OpenCL v2.0 s6.9.b - Image type can only be used as a function argument.
7226
// OpenCL v2.0 s6.13.16.1 - Pipe type can only be used as a function
7227
// argument.
7228
if (R->isImageType() || R->isPipeType()) {
7229
Se.Diag(NewVD->getLocation(),
7230
diag::err_opencl_type_can_only_be_used_as_function_parameter)
7231
<< R;
7232
NewVD->setInvalidDecl();
7233
return false;
7234
}
7235
7236
// OpenCL v1.2 s6.9.r:
7237
// The event type cannot be used to declare a program scope variable.
7238
// OpenCL v2.0 s6.9.q:
7239
// The clk_event_t and reserve_id_t types cannot be declared in program
7240
// scope.
7241
if (NewVD->hasGlobalStorage() && !NewVD->isStaticLocal()) {
7242
if (R->isReserveIDT() || R->isClkEventT() || R->isEventT()) {
7243
Se.Diag(NewVD->getLocation(),
7244
diag::err_invalid_type_for_program_scope_var)
7245
<< R;
7246
NewVD->setInvalidDecl();
7247
return false;
7248
}
7249
}
7250
7251
// OpenCL v1.0 s6.8.a.3: Pointers to functions are not allowed.
7252
if (!Se.getOpenCLOptions().isAvailableOption("__cl_clang_function_pointers",
7253
Se.getLangOpts())) {
7254
QualType NR = R.getCanonicalType();
7255
while (NR->isPointerType() || NR->isMemberFunctionPointerType() ||
7256
NR->isReferenceType()) {
7257
if (NR->isFunctionPointerType() || NR->isMemberFunctionPointerType() ||
7258
NR->isFunctionReferenceType()) {
7259
Se.Diag(NewVD->getLocation(), diag::err_opencl_function_pointer)
7260
<< NR->isReferenceType();
7261
NewVD->setInvalidDecl();
7262
return false;
7263
}
7264
NR = NR->getPointeeType();
7265
}
7266
}
7267
7268
if (!Se.getOpenCLOptions().isAvailableOption("cl_khr_fp16",
7269
Se.getLangOpts())) {
7270
// OpenCL v1.2 s6.1.1.1: reject declaring variables of the half and
7271
// half array type (unless the cl_khr_fp16 extension is enabled).
7272
if (Se.Context.getBaseElementType(R)->isHalfType()) {
7273
Se.Diag(NewVD->getLocation(), diag::err_opencl_half_declaration) << R;
7274
NewVD->setInvalidDecl();
7275
return false;
7276
}
7277
}
7278
7279
// OpenCL v1.2 s6.9.r:
7280
// The event type cannot be used with the __local, __constant and __global
7281
// address space qualifiers.
7282
if (R->isEventT()) {
7283
if (R.getAddressSpace() != LangAS::opencl_private) {
7284
Se.Diag(NewVD->getBeginLoc(), diag::err_event_t_addr_space_qual);
7285
NewVD->setInvalidDecl();
7286
return false;
7287
}
7288
}
7289
7290
if (R->isSamplerT()) {
7291
// OpenCL v1.2 s6.9.b p4:
7292
// The sampler type cannot be used with the __local and __global address
7293
// space qualifiers.
7294
if (R.getAddressSpace() == LangAS::opencl_local ||
7295
R.getAddressSpace() == LangAS::opencl_global) {
7296
Se.Diag(NewVD->getLocation(), diag::err_wrong_sampler_addressspace);
7297
NewVD->setInvalidDecl();
7298
}
7299
7300
// OpenCL v1.2 s6.12.14.1:
7301
// A global sampler must be declared with either the constant address
7302
// space qualifier or with the const qualifier.
7303
if (DC->isTranslationUnit() &&
7304
!(R.getAddressSpace() == LangAS::opencl_constant ||
7305
R.isConstQualified())) {
7306
Se.Diag(NewVD->getLocation(), diag::err_opencl_nonconst_global_sampler);
7307
NewVD->setInvalidDecl();
7308
}
7309
if (NewVD->isInvalidDecl())
7310
return false;
7311
}
7312
7313
return true;
7314
}
7315
7316
template <typename AttrTy>
7317
static void copyAttrFromTypedefToDecl(Sema &S, Decl *D, const TypedefType *TT) {
7318
const TypedefNameDecl *TND = TT->getDecl();
7319
if (const auto *Attribute = TND->getAttr<AttrTy>()) {
7320
AttrTy *Clone = Attribute->clone(S.Context);
7321
Clone->setInherited(true);
7322
D->addAttr(Clone);
7323
}
7324
}
7325
7326
// This function emits warning and a corresponding note based on the
7327
// ReadOnlyPlacementAttr attribute. The warning checks that all global variable
7328
// declarations of an annotated type must be const qualified.
7329
void emitReadOnlyPlacementAttrWarning(Sema &S, const VarDecl *VD) {
7330
QualType VarType = VD->getType().getCanonicalType();
7331
7332
// Ignore local declarations (for now) and those with const qualification.
7333
// TODO: Local variables should not be allowed if their type declaration has
7334
// ReadOnlyPlacementAttr attribute. To be handled in follow-up patch.
7335
if (!VD || VD->hasLocalStorage() || VD->getType().isConstQualified())
7336
return;
7337
7338
if (VarType->isArrayType()) {
7339
// Retrieve element type for array declarations.
7340
VarType = S.getASTContext().getBaseElementType(VarType);
7341
}
7342
7343
const RecordDecl *RD = VarType->getAsRecordDecl();
7344
7345
// Check if the record declaration is present and if it has any attributes.
7346
if (RD == nullptr)
7347
return;
7348
7349
if (const auto *ConstDecl = RD->getAttr<ReadOnlyPlacementAttr>()) {
7350
S.Diag(VD->getLocation(), diag::warn_var_decl_not_read_only) << RD;
7351
S.Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7352
return;
7353
}
7354
}
7355
7356
NamedDecl *Sema::ActOnVariableDeclarator(
7357
Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo,
7358
LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists,
7359
bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {
7360
QualType R = TInfo->getType();
7361
DeclarationName Name = GetNameForDeclarator(D).getName();
7362
7363
IdentifierInfo *II = Name.getAsIdentifierInfo();
7364
bool IsPlaceholderVariable = false;
7365
7366
if (D.isDecompositionDeclarator()) {
7367
// Take the name of the first declarator as our name for diagnostic
7368
// purposes.
7369
auto &Decomp = D.getDecompositionDeclarator();
7370
if (!Decomp.bindings().empty()) {
7371
II = Decomp.bindings()[0].Name;
7372
Name = II;
7373
}
7374
} else if (!II) {
7375
Diag(D.getIdentifierLoc(), diag::err_bad_variable_name) << Name;
7376
return nullptr;
7377
}
7378
7379
7380
DeclSpec::SCS SCSpec = D.getDeclSpec().getStorageClassSpec();
7381
StorageClass SC = StorageClassSpecToVarDeclStorageClass(D.getDeclSpec());
7382
7383
if (LangOpts.CPlusPlus && (DC->isClosure() || DC->isFunctionOrMethod()) &&
7384
SC != SC_Static && SC != SC_Extern && II && II->isPlaceholder()) {
7385
IsPlaceholderVariable = true;
7386
if (!Previous.empty()) {
7387
NamedDecl *PrevDecl = *Previous.begin();
7388
bool SameDC = PrevDecl->getDeclContext()->getRedeclContext()->Equals(
7389
DC->getRedeclContext());
7390
if (SameDC && isDeclInScope(PrevDecl, CurContext, S, false))
7391
DiagPlaceholderVariableDefinition(D.getIdentifierLoc());
7392
}
7393
}
7394
7395
// dllimport globals without explicit storage class are treated as extern. We
7396
// have to change the storage class this early to get the right DeclContext.
7397
if (SC == SC_None && !DC->isRecord() &&
7398
hasParsedAttr(S, D, ParsedAttr::AT_DLLImport) &&
7399
!hasParsedAttr(S, D, ParsedAttr::AT_DLLExport))
7400
SC = SC_Extern;
7401
7402
DeclContext *OriginalDC = DC;
7403
bool IsLocalExternDecl = SC == SC_Extern &&
7404
adjustContextForLocalExternDecl(DC);
7405
7406
if (SCSpec == DeclSpec::SCS_mutable) {
7407
// mutable can only appear on non-static class members, so it's always
7408
// an error here
7409
Diag(D.getIdentifierLoc(), diag::err_mutable_nonmember);
7410
D.setInvalidType();
7411
SC = SC_None;
7412
}
7413
7414
if (getLangOpts().CPlusPlus11 && SCSpec == DeclSpec::SCS_register &&
7415
!D.getAsmLabel() && !getSourceManager().isInSystemMacro(
7416
D.getDeclSpec().getStorageClassSpecLoc())) {
7417
// In C++11, the 'register' storage class specifier is deprecated.
7418
// Suppress the warning in system macros, it's used in macros in some
7419
// popular C system headers, such as in glibc's htonl() macro.
7420
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
7421
getLangOpts().CPlusPlus17 ? diag::ext_register_storage_class
7422
: diag::warn_deprecated_register)
7423
<< FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
7424
}
7425
7426
DiagnoseFunctionSpecifiers(D.getDeclSpec());
7427
7428
if (!DC->isRecord() && S->getFnParent() == nullptr) {
7429
// C99 6.9p2: The storage-class specifiers auto and register shall not
7430
// appear in the declaration specifiers in an external declaration.
7431
// Global Register+Asm is a GNU extension we support.
7432
if (SC == SC_Auto || (SC == SC_Register && !D.getAsmLabel())) {
7433
Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_fscope);
7434
D.setInvalidType();
7435
}
7436
}
7437
7438
// If this variable has a VLA type and an initializer, try to
7439
// fold to a constant-sized type. This is otherwise invalid.
7440
if (D.hasInitializer() && R->isVariableArrayType())
7441
tryToFixVariablyModifiedVarType(TInfo, R, D.getIdentifierLoc(),
7442
/*DiagID=*/0);
7443
7444
if (AutoTypeLoc TL = TInfo->getTypeLoc().getContainedAutoTypeLoc()) {
7445
const AutoType *AT = TL.getTypePtr();
7446
CheckConstrainedAuto(AT, TL.getConceptNameLoc());
7447
}
7448
7449
bool IsMemberSpecialization = false;
7450
bool IsVariableTemplateSpecialization = false;
7451
bool IsPartialSpecialization = false;
7452
bool IsVariableTemplate = false;
7453
VarDecl *NewVD = nullptr;
7454
VarTemplateDecl *NewTemplate = nullptr;
7455
TemplateParameterList *TemplateParams = nullptr;
7456
if (!getLangOpts().CPlusPlus) {
7457
NewVD = VarDecl::Create(Context, DC, D.getBeginLoc(), D.getIdentifierLoc(),
7458
II, R, TInfo, SC);
7459
7460
if (R->getContainedDeducedType())
7461
ParsingInitForAutoVars.insert(NewVD);
7462
7463
if (D.isInvalidType())
7464
NewVD->setInvalidDecl();
7465
7466
if (NewVD->getType().hasNonTrivialToPrimitiveDestructCUnion() &&
7467
NewVD->hasLocalStorage())
7468
checkNonTrivialCUnion(NewVD->getType(), NewVD->getLocation(),
7469
NTCUC_AutoVar, NTCUK_Destruct);
7470
} else {
7471
bool Invalid = false;
7472
// Match up the template parameter lists with the scope specifier, then
7473
// determine whether we have a template or a template specialization.
7474
TemplateParams = MatchTemplateParametersToScopeSpecifier(
7475
D.getDeclSpec().getBeginLoc(), D.getIdentifierLoc(),
7476
D.getCXXScopeSpec(),
7477
D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId
7478
? D.getName().TemplateId
7479
: nullptr,
7480
TemplateParamLists,
7481
/*never a friend*/ false, IsMemberSpecialization, Invalid);
7482
7483
if (TemplateParams) {
7484
if (!TemplateParams->size() &&
7485
D.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) {
7486
// There is an extraneous 'template<>' for this variable. Complain
7487
// about it, but allow the declaration of the variable.
7488
Diag(TemplateParams->getTemplateLoc(),
7489
diag::err_template_variable_noparams)
7490
<< II
7491
<< SourceRange(TemplateParams->getTemplateLoc(),
7492
TemplateParams->getRAngleLoc());
7493
TemplateParams = nullptr;
7494
} else {
7495
// Check that we can declare a template here.
7496
if (CheckTemplateDeclScope(S, TemplateParams))
7497
return nullptr;
7498
7499
if (D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId) {
7500
// This is an explicit specialization or a partial specialization.
7501
IsVariableTemplateSpecialization = true;
7502
IsPartialSpecialization = TemplateParams->size() > 0;
7503
} else { // if (TemplateParams->size() > 0)
7504
// This is a template declaration.
7505
IsVariableTemplate = true;
7506
7507
// Only C++1y supports variable templates (N3651).
7508
Diag(D.getIdentifierLoc(),
7509
getLangOpts().CPlusPlus14
7510
? diag::warn_cxx11_compat_variable_template
7511
: diag::ext_variable_template);
7512
}
7513
}
7514
} else {
7515
// Check that we can declare a member specialization here.
7516
if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7517
CheckTemplateDeclScope(S, TemplateParamLists.back()))
7518
return nullptr;
7519
assert((Invalid ||
7520
D.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) &&
7521
"should have a 'template<>' for this decl");
7522
}
7523
7524
bool IsExplicitSpecialization =
7525
IsVariableTemplateSpecialization && !IsPartialSpecialization;
7526
7527
// C++ [temp.expl.spec]p2:
7528
// The declaration in an explicit-specialization shall not be an
7529
// export-declaration. An explicit specialization shall not use a
7530
// storage-class-specifier other than thread_local.
7531
//
7532
// We use the storage-class-specifier from DeclSpec because we may have
7533
// added implicit 'extern' for declarations with __declspec(dllimport)!
7534
if (SCSpec != DeclSpec::SCS_unspecified &&
7535
(IsExplicitSpecialization || IsMemberSpecialization)) {
7536
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
7537
diag::ext_explicit_specialization_storage_class)
7538
<< FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
7539
}
7540
7541
if (CurContext->isRecord()) {
7542
if (SC == SC_Static) {
7543
if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7544
// Walk up the enclosing DeclContexts to check for any that are
7545
// incompatible with static data members.
7546
const DeclContext *FunctionOrMethod = nullptr;
7547
const CXXRecordDecl *AnonStruct = nullptr;
7548
for (DeclContext *Ctxt = DC; Ctxt; Ctxt = Ctxt->getParent()) {
7549
if (Ctxt->isFunctionOrMethod()) {
7550
FunctionOrMethod = Ctxt;
7551
break;
7552
}
7553
const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7554
if (ParentDecl && !ParentDecl->getDeclName()) {
7555
AnonStruct = ParentDecl;
7556
break;
7557
}
7558
}
7559
if (FunctionOrMethod) {
7560
// C++ [class.static.data]p5: A local class shall not have static
7561
// data members.
7562
Diag(D.getIdentifierLoc(),
7563
diag::err_static_data_member_not_allowed_in_local_class)
7564
<< Name << RD->getDeclName()
7565
<< llvm::to_underlying(RD->getTagKind());
7566
} else if (AnonStruct) {
7567
// C++ [class.static.data]p4: Unnamed classes and classes contained
7568
// directly or indirectly within unnamed classes shall not contain
7569
// static data members.
7570
Diag(D.getIdentifierLoc(),
7571
diag::err_static_data_member_not_allowed_in_anon_struct)
7572
<< Name << llvm::to_underlying(AnonStruct->getTagKind());
7573
Invalid = true;
7574
} else if (RD->isUnion()) {
7575
// C++98 [class.union]p1: If a union contains a static data member,
7576
// the program is ill-formed. C++11 drops this restriction.
7577
Diag(D.getIdentifierLoc(),
7578
getLangOpts().CPlusPlus11
7579
? diag::warn_cxx98_compat_static_data_member_in_union
7580
: diag::ext_static_data_member_in_union)
7581
<< Name;
7582
}
7583
}
7584
} else if (IsVariableTemplate || IsPartialSpecialization) {
7585
// There is no such thing as a member field template.
7586
Diag(D.getIdentifierLoc(), diag::err_template_member)
7587
<< II << TemplateParams->getSourceRange();
7588
// Recover by pretending this is a static data member template.
7589
SC = SC_Static;
7590
}
7591
} else if (DC->isRecord()) {
7592
// This is an out-of-line definition of a static data member.
7593
switch (SC) {
7594
case SC_None:
7595
break;
7596
case SC_Static:
7597
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
7598
diag::err_static_out_of_line)
7599
<< FixItHint::CreateRemoval(
7600
D.getDeclSpec().getStorageClassSpecLoc());
7601
break;
7602
case SC_Auto:
7603
case SC_Register:
7604
case SC_Extern:
7605
// [dcl.stc] p2: The auto or register specifiers shall be applied only
7606
// to names of variables declared in a block or to function parameters.
7607
// [dcl.stc] p6: The extern specifier cannot be used in the declaration
7608
// of class members
7609
7610
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
7611
diag::err_storage_class_for_static_member)
7612
<< FixItHint::CreateRemoval(
7613
D.getDeclSpec().getStorageClassSpecLoc());
7614
break;
7615
case SC_PrivateExtern:
7616
llvm_unreachable("C storage class in c++!");
7617
}
7618
}
7619
7620
if (IsVariableTemplateSpecialization) {
7621
SourceLocation TemplateKWLoc =
7622
TemplateParamLists.size() > 0
7623
? TemplateParamLists[0]->getTemplateLoc()
7624
: SourceLocation();
7625
DeclResult Res = ActOnVarTemplateSpecialization(
7626
S, D, TInfo, Previous, TemplateKWLoc, TemplateParams, SC,
7627
IsPartialSpecialization);
7628
if (Res.isInvalid())
7629
return nullptr;
7630
NewVD = cast<VarDecl>(Res.get());
7631
AddToScope = false;
7632
} else if (D.isDecompositionDeclarator()) {
7633
NewVD = DecompositionDecl::Create(Context, DC, D.getBeginLoc(),
7634
D.getIdentifierLoc(), R, TInfo, SC,
7635
Bindings);
7636
} else
7637
NewVD = VarDecl::Create(Context, DC, D.getBeginLoc(),
7638
D.getIdentifierLoc(), II, R, TInfo, SC);
7639
7640
// If this is supposed to be a variable template, create it as such.
7641
if (IsVariableTemplate) {
7642
NewTemplate =
7643
VarTemplateDecl::Create(Context, DC, D.getIdentifierLoc(), Name,
7644
TemplateParams, NewVD);
7645
NewVD->setDescribedVarTemplate(NewTemplate);
7646
}
7647
7648
// If this decl has an auto type in need of deduction, make a note of the
7649
// Decl so we can diagnose uses of it in its own initializer.
7650
if (R->getContainedDeducedType())
7651
ParsingInitForAutoVars.insert(NewVD);
7652
7653
if (D.isInvalidType() || Invalid) {
7654
NewVD->setInvalidDecl();
7655
if (NewTemplate)
7656
NewTemplate->setInvalidDecl();
7657
}
7658
7659
SetNestedNameSpecifier(*this, NewVD, D);
7660
7661
// If we have any template parameter lists that don't directly belong to
7662
// the variable (matching the scope specifier), store them.
7663
// An explicit variable template specialization does not own any template
7664
// parameter lists.
7665
unsigned VDTemplateParamLists =
7666
(TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
7667
if (TemplateParamLists.size() > VDTemplateParamLists)
7668
NewVD->setTemplateParameterListsInfo(
7669
Context, TemplateParamLists.drop_back(VDTemplateParamLists));
7670
}
7671
7672
if (D.getDeclSpec().isInlineSpecified()) {
7673
if (!getLangOpts().CPlusPlus) {
7674
Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
7675
<< 0;
7676
} else if (CurContext->isFunctionOrMethod()) {
7677
// 'inline' is not allowed on block scope variable declaration.
7678
Diag(D.getDeclSpec().getInlineSpecLoc(),
7679
diag::err_inline_declaration_block_scope) << Name
7680
<< FixItHint::CreateRemoval(D.getDeclSpec().getInlineSpecLoc());
7681
} else {
7682
Diag(D.getDeclSpec().getInlineSpecLoc(),
7683
getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_inline_variable
7684
: diag::ext_inline_variable);
7685
NewVD->setInlineSpecified();
7686
}
7687
}
7688
7689
// Set the lexical context. If the declarator has a C++ scope specifier, the
7690
// lexical context will be different from the semantic context.
7691
NewVD->setLexicalDeclContext(CurContext);
7692
if (NewTemplate)
7693
NewTemplate->setLexicalDeclContext(CurContext);
7694
7695
if (IsLocalExternDecl) {
7696
if (D.isDecompositionDeclarator())
7697
for (auto *B : Bindings)
7698
B->setLocalExternDecl();
7699
else
7700
NewVD->setLocalExternDecl();
7701
}
7702
7703
bool EmitTLSUnsupportedError = false;
7704
if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec()) {
7705
// C++11 [dcl.stc]p4:
7706
// When thread_local is applied to a variable of block scope the
7707
// storage-class-specifier static is implied if it does not appear
7708
// explicitly.
7709
// Core issue: 'static' is not implied if the variable is declared
7710
// 'extern'.
7711
if (NewVD->hasLocalStorage() &&
7712
(SCSpec != DeclSpec::SCS_unspecified ||
7713
TSCS != DeclSpec::TSCS_thread_local ||
7714
!DC->isFunctionOrMethod()))
7715
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
7716
diag::err_thread_non_global)
7717
<< DeclSpec::getSpecifierName(TSCS);
7718
else if (!Context.getTargetInfo().isTLSSupported()) {
7719
if (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice ||
7720
getLangOpts().SYCLIsDevice) {
7721
// Postpone error emission until we've collected attributes required to
7722
// figure out whether it's a host or device variable and whether the
7723
// error should be ignored.
7724
EmitTLSUnsupportedError = true;
7725
// We still need to mark the variable as TLS so it shows up in AST with
7726
// proper storage class for other tools to use even if we're not going
7727
// to emit any code for it.
7728
NewVD->setTSCSpec(TSCS);
7729
} else
7730
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
7731
diag::err_thread_unsupported);
7732
} else
7733
NewVD->setTSCSpec(TSCS);
7734
}
7735
7736
switch (D.getDeclSpec().getConstexprSpecifier()) {
7737
case ConstexprSpecKind::Unspecified:
7738
break;
7739
7740
case ConstexprSpecKind::Consteval:
7741
Diag(D.getDeclSpec().getConstexprSpecLoc(),
7742
diag::err_constexpr_wrong_decl_kind)
7743
<< static_cast<int>(D.getDeclSpec().getConstexprSpecifier());
7744
[[fallthrough]];
7745
7746
case ConstexprSpecKind::Constexpr:
7747
NewVD->setConstexpr(true);
7748
// C++1z [dcl.spec.constexpr]p1:
7749
// A static data member declared with the constexpr specifier is
7750
// implicitly an inline variable.
7751
if (NewVD->isStaticDataMember() &&
7752
(getLangOpts().CPlusPlus17 ||
7753
Context.getTargetInfo().getCXXABI().isMicrosoft()))
7754
NewVD->setImplicitlyInline();
7755
break;
7756
7757
case ConstexprSpecKind::Constinit:
7758
if (!NewVD->hasGlobalStorage())
7759
Diag(D.getDeclSpec().getConstexprSpecLoc(),
7760
diag::err_constinit_local_variable);
7761
else
7762
NewVD->addAttr(
7763
ConstInitAttr::Create(Context, D.getDeclSpec().getConstexprSpecLoc(),
7764
ConstInitAttr::Keyword_constinit));
7765
break;
7766
}
7767
7768
// C99 6.7.4p3
7769
// An inline definition of a function with external linkage shall
7770
// not contain a definition of a modifiable object with static or
7771
// thread storage duration...
7772
// We only apply this when the function is required to be defined
7773
// elsewhere, i.e. when the function is not 'extern inline'. Note
7774
// that a local variable with thread storage duration still has to
7775
// be marked 'static'. Also note that it's possible to get these
7776
// semantics in C++ using __attribute__((gnu_inline)).
7777
if (SC == SC_Static && S->getFnParent() != nullptr &&
7778
!NewVD->getType().isConstQualified()) {
7779
FunctionDecl *CurFD = getCurFunctionDecl();
7780
if (CurFD && isFunctionDefinitionDiscarded(*this, CurFD)) {
7781
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
7782
diag::warn_static_local_in_extern_inline);
7783
MaybeSuggestAddingStaticToDecl(CurFD);
7784
}
7785
}
7786
7787
if (D.getDeclSpec().isModulePrivateSpecified()) {
7788
if (IsVariableTemplateSpecialization)
7789
Diag(NewVD->getLocation(), diag::err_module_private_specialization)
7790
<< (IsPartialSpecialization ? 1 : 0)
7791
<< FixItHint::CreateRemoval(
7792
D.getDeclSpec().getModulePrivateSpecLoc());
7793
else if (IsMemberSpecialization)
7794
Diag(NewVD->getLocation(), diag::err_module_private_specialization)
7795
<< 2
7796
<< FixItHint::CreateRemoval(D.getDeclSpec().getModulePrivateSpecLoc());
7797
else if (NewVD->hasLocalStorage())
7798
Diag(NewVD->getLocation(), diag::err_module_private_local)
7799
<< 0 << NewVD
7800
<< SourceRange(D.getDeclSpec().getModulePrivateSpecLoc())
7801
<< FixItHint::CreateRemoval(
7802
D.getDeclSpec().getModulePrivateSpecLoc());
7803
else {
7804
NewVD->setModulePrivate();
7805
if (NewTemplate)
7806
NewTemplate->setModulePrivate();
7807
for (auto *B : Bindings)
7808
B->setModulePrivate();
7809
}
7810
}
7811
7812
if (getLangOpts().OpenCL) {
7813
deduceOpenCLAddressSpace(NewVD);
7814
7815
DeclSpec::TSCS TSC = D.getDeclSpec().getThreadStorageClassSpec();
7816
if (TSC != TSCS_unspecified) {
7817
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
7818
diag::err_opencl_unknown_type_specifier)
7819
<< getLangOpts().getOpenCLVersionString()
7820
<< DeclSpec::getSpecifierName(TSC) << 1;
7821
NewVD->setInvalidDecl();
7822
}
7823
}
7824
7825
// WebAssembly tables are always in address space 1 (wasm_var). Don't apply
7826
// address space if the table has local storage (semantic checks elsewhere
7827
// will produce an error anyway).
7828
if (const auto *ATy = dyn_cast<ArrayType>(NewVD->getType())) {
7829
if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
7830
!NewVD->hasLocalStorage()) {
7831
QualType Type = Context.getAddrSpaceQualType(
7832
NewVD->getType(), Context.getLangASForBuiltinAddressSpace(1));
7833
NewVD->setType(Type);
7834
}
7835
}
7836
7837
// Handle attributes prior to checking for duplicates in MergeVarDecl
7838
ProcessDeclAttributes(S, NewVD, D);
7839
7840
// FIXME: This is probably the wrong location to be doing this and we should
7841
// probably be doing this for more attributes (especially for function
7842
// pointer attributes such as format, warn_unused_result, etc.). Ideally
7843
// the code to copy attributes would be generated by TableGen.
7844
if (R->isFunctionPointerType())
7845
if (const auto *TT = R->getAs<TypedefType>())
7846
copyAttrFromTypedefToDecl<AllocSizeAttr>(*this, NewVD, TT);
7847
7848
if (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice ||
7849
getLangOpts().SYCLIsDevice) {
7850
if (EmitTLSUnsupportedError &&
7851
((getLangOpts().CUDA && DeclAttrsMatchCUDAMode(getLangOpts(), NewVD)) ||
7852
(getLangOpts().OpenMPIsTargetDevice &&
7853
OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
7854
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
7855
diag::err_thread_unsupported);
7856
7857
if (EmitTLSUnsupportedError &&
7858
(LangOpts.SYCLIsDevice ||
7859
(LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice)))
7860
targetDiag(D.getIdentifierLoc(), diag::err_thread_unsupported);
7861
// CUDA B.2.5: "__shared__ and __constant__ variables have implied static
7862
// storage [duration]."
7863
if (SC == SC_None && S->getFnParent() != nullptr &&
7864
(NewVD->hasAttr<CUDASharedAttr>() ||
7865
NewVD->hasAttr<CUDAConstantAttr>())) {
7866
NewVD->setStorageClass(SC_Static);
7867
}
7868
}
7869
7870
// Ensure that dllimport globals without explicit storage class are treated as
7871
// extern. The storage class is set above using parsed attributes. Now we can
7872
// check the VarDecl itself.
7873
assert(!NewVD->hasAttr<DLLImportAttr>() ||
7874
NewVD->getAttr<DLLImportAttr>()->isInherited() ||
7875
NewVD->isStaticDataMember() || NewVD->getStorageClass() != SC_None);
7876
7877
// In auto-retain/release, infer strong retension for variables of
7878
// retainable type.
7879
if (getLangOpts().ObjCAutoRefCount && ObjC().inferObjCARCLifetime(NewVD))
7880
NewVD->setInvalidDecl();
7881
7882
// Handle GNU asm-label extension (encoded as an attribute).
7883
if (Expr *E = (Expr*)D.getAsmLabel()) {
7884
// The parser guarantees this is a string.
7885
StringLiteral *SE = cast<StringLiteral>(E);
7886
StringRef Label = SE->getString();
7887
if (S->getFnParent() != nullptr) {
7888
switch (SC) {
7889
case SC_None:
7890
case SC_Auto:
7891
Diag(E->getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7892
break;
7893
case SC_Register:
7894
// Local Named register
7895
if (!Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7896
DeclAttrsMatchCUDAMode(getLangOpts(), getCurFunctionDecl()))
7897
Diag(E->getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7898
break;
7899
case SC_Static:
7900
case SC_Extern:
7901
case SC_PrivateExtern:
7902
break;
7903
}
7904
} else if (SC == SC_Register) {
7905
// Global Named register
7906
if (DeclAttrsMatchCUDAMode(getLangOpts(), NewVD)) {
7907
const auto &TI = Context.getTargetInfo();
7908
bool HasSizeMismatch;
7909
7910
if (!TI.isValidGCCRegisterName(Label))
7911
Diag(E->getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7912
else if (!TI.validateGlobalRegisterVariable(Label,
7913
Context.getTypeSize(R),
7914
HasSizeMismatch))
7915
Diag(E->getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7916
else if (HasSizeMismatch)
7917
Diag(E->getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7918
}
7919
7920
if (!R->isIntegralType(Context) && !R->isPointerType()) {
7921
Diag(D.getBeginLoc(), diag::err_asm_bad_register_type);
7922
NewVD->setInvalidDecl(true);
7923
}
7924
}
7925
7926
NewVD->addAttr(AsmLabelAttr::Create(Context, Label,
7927
/*IsLiteralLabel=*/true,
7928
SE->getStrTokenLoc(0)));
7929
} else if (!ExtnameUndeclaredIdentifiers.empty()) {
7930
llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
7931
ExtnameUndeclaredIdentifiers.find(NewVD->getIdentifier());
7932
if (I != ExtnameUndeclaredIdentifiers.end()) {
7933
if (isDeclExternC(NewVD)) {
7934
NewVD->addAttr(I->second);
7935
ExtnameUndeclaredIdentifiers.erase(I);
7936
} else
7937
Diag(NewVD->getLocation(), diag::warn_redefine_extname_not_applied)
7938
<< /*Variable*/1 << NewVD;
7939
}
7940
}
7941
7942
// Find the shadowed declaration before filtering for scope.
7943
NamedDecl *ShadowedDecl = D.getCXXScopeSpec().isEmpty()
7944
? getShadowedDeclaration(NewVD, Previous)
7945
: nullptr;
7946
7947
// Don't consider existing declarations that are in a different
7948
// scope and are out-of-semantic-context declarations (if the new
7949
// declaration has linkage).
7950
FilterLookupForScope(Previous, OriginalDC, S, shouldConsiderLinkage(NewVD),
7951
D.getCXXScopeSpec().isNotEmpty() ||
7952
IsMemberSpecialization ||
7953
IsVariableTemplateSpecialization);
7954
7955
// Check whether the previous declaration is in the same block scope. This
7956
// affects whether we merge types with it, per C++11 [dcl.array]p3.
7957
if (getLangOpts().CPlusPlus &&
7958
NewVD->isLocalVarDecl() && NewVD->hasExternalStorage())
7959
NewVD->setPreviousDeclInSameBlockScope(
7960
Previous.isSingleResult() && !Previous.isShadowed() &&
7961
isDeclInScope(Previous.getFoundDecl(), OriginalDC, S, false));
7962
7963
if (!getLangOpts().CPlusPlus) {
7964
D.setRedeclaration(CheckVariableDeclaration(NewVD, Previous));
7965
} else {
7966
// If this is an explicit specialization of a static data member, check it.
7967
if (IsMemberSpecialization && !IsVariableTemplateSpecialization &&
7968
!NewVD->isInvalidDecl() && CheckMemberSpecialization(NewVD, Previous))
7969
NewVD->setInvalidDecl();
7970
7971
// Merge the decl with the existing one if appropriate.
7972
if (!Previous.empty()) {
7973
if (Previous.isSingleResult() &&
7974
isa<FieldDecl>(Previous.getFoundDecl()) &&
7975
D.getCXXScopeSpec().isSet()) {
7976
// The user tried to define a non-static data member
7977
// out-of-line (C++ [dcl.meaning]p1).
7978
Diag(NewVD->getLocation(), diag::err_nonstatic_member_out_of_line)
7979
<< D.getCXXScopeSpec().getRange();
7980
Previous.clear();
7981
NewVD->setInvalidDecl();
7982
}
7983
} else if (D.getCXXScopeSpec().isSet() &&
7984
!IsVariableTemplateSpecialization) {
7985
// No previous declaration in the qualifying scope.
7986
Diag(D.getIdentifierLoc(), diag::err_no_member)
7987
<< Name << computeDeclContext(D.getCXXScopeSpec(), true)
7988
<< D.getCXXScopeSpec().getRange();
7989
NewVD->setInvalidDecl();
7990
}
7991
7992
if (!IsPlaceholderVariable)
7993
D.setRedeclaration(CheckVariableDeclaration(NewVD, Previous));
7994
7995
// CheckVariableDeclaration will set NewVD as invalid if something is in
7996
// error like WebAssembly tables being declared as arrays with a non-zero
7997
// size, but then parsing continues and emits further errors on that line.
7998
// To avoid that we check here if it happened and return nullptr.
7999
if (NewVD->getType()->isWebAssemblyTableType() && NewVD->isInvalidDecl())
8000
return nullptr;
8001
8002
if (NewTemplate) {
8003
VarTemplateDecl *PrevVarTemplate =
8004
NewVD->getPreviousDecl()
8005
? NewVD->getPreviousDecl()->getDescribedVarTemplate()
8006
: nullptr;
8007
8008
// Check the template parameter list of this declaration, possibly
8009
// merging in the template parameter list from the previous variable
8010
// template declaration.
8011
if (CheckTemplateParameterList(
8012
TemplateParams,
8013
PrevVarTemplate ? PrevVarTemplate->getTemplateParameters()
8014
: nullptr,
8015
(D.getCXXScopeSpec().isSet() && DC && DC->isRecord() &&
8016
DC->isDependentContext())
8017
? TPC_ClassTemplateMember
8018
: TPC_VarTemplate))
8019
NewVD->setInvalidDecl();
8020
8021
// If we are providing an explicit specialization of a static variable
8022
// template, make a note of that.
8023
if (PrevVarTemplate &&
8024
PrevVarTemplate->getInstantiatedFromMemberTemplate())
8025
PrevVarTemplate->setMemberSpecialization();
8026
}
8027
}
8028
8029
// Diagnose shadowed variables iff this isn't a redeclaration.
8030
if (!IsPlaceholderVariable && ShadowedDecl && !D.isRedeclaration())
8031
CheckShadow(NewVD, ShadowedDecl, Previous);
8032
8033
ProcessPragmaWeak(S, NewVD);
8034
8035
// If this is the first declaration of an extern C variable, update
8036
// the map of such variables.
8037
if (NewVD->isFirstDecl() && !NewVD->isInvalidDecl() &&
8038
isIncompleteDeclExternC(*this, NewVD))
8039
RegisterLocallyScopedExternCDecl(NewVD, S);
8040
8041
if (getLangOpts().CPlusPlus && NewVD->isStaticLocal()) {
8042
MangleNumberingContext *MCtx;
8043
Decl *ManglingContextDecl;
8044
std::tie(MCtx, ManglingContextDecl) =
8045
getCurrentMangleNumberContext(NewVD->getDeclContext());
8046
if (MCtx) {
8047
Context.setManglingNumber(
8048
NewVD, MCtx->getManglingNumber(
8049
NewVD, getMSManglingNumber(getLangOpts(), S)));
8050
Context.setStaticLocalNumber(NewVD, MCtx->getStaticLocalNumber(NewVD));
8051
}
8052
}
8053
8054
// Special handling of variable named 'main'.
8055
if (Name.getAsIdentifierInfo() && Name.getAsIdentifierInfo()->isStr("main") &&
8056
NewVD->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
8057
!getLangOpts().Freestanding && !NewVD->getDescribedVarTemplate()) {
8058
8059
// C++ [basic.start.main]p3
8060
// A program that declares a variable main at global scope is ill-formed.
8061
if (getLangOpts().CPlusPlus)
8062
Diag(D.getBeginLoc(), diag::err_main_global_variable);
8063
8064
// In C, and external-linkage variable named main results in undefined
8065
// behavior.
8066
else if (NewVD->hasExternalFormalLinkage())
8067
Diag(D.getBeginLoc(), diag::warn_main_redefined);
8068
}
8069
8070
if (D.isRedeclaration() && !Previous.empty()) {
8071
NamedDecl *Prev = Previous.getRepresentativeDecl();
8072
checkDLLAttributeRedeclaration(*this, Prev, NewVD, IsMemberSpecialization,
8073
D.isFunctionDefinition());
8074
}
8075
8076
if (NewTemplate) {
8077
if (NewVD->isInvalidDecl())
8078
NewTemplate->setInvalidDecl();
8079
ActOnDocumentableDecl(NewTemplate);
8080
return NewTemplate;
8081
}
8082
8083
if (IsMemberSpecialization && !NewVD->isInvalidDecl())
8084
CompleteMemberSpecialization(NewVD, Previous);
8085
8086
emitReadOnlyPlacementAttrWarning(*this, NewVD);
8087
8088
return NewVD;
8089
}
8090
8091
/// Enum describing the %select options in diag::warn_decl_shadow.
8092
enum ShadowedDeclKind {
8093
SDK_Local,
8094
SDK_Global,
8095
SDK_StaticMember,
8096
SDK_Field,
8097
SDK_Typedef,
8098
SDK_Using,
8099
SDK_StructuredBinding
8100
};
8101
8102
/// Determine what kind of declaration we're shadowing.
8103
static ShadowedDeclKind computeShadowedDeclKind(const NamedDecl *ShadowedDecl,
8104
const DeclContext *OldDC) {
8105
if (isa<TypeAliasDecl>(ShadowedDecl))
8106
return SDK_Using;
8107
else if (isa<TypedefDecl>(ShadowedDecl))
8108
return SDK_Typedef;
8109
else if (isa<BindingDecl>(ShadowedDecl))
8110
return SDK_StructuredBinding;
8111
else if (isa<RecordDecl>(OldDC))
8112
return isa<FieldDecl>(ShadowedDecl) ? SDK_Field : SDK_StaticMember;
8113
8114
return OldDC->isFileContext() ? SDK_Global : SDK_Local;
8115
}
8116
8117
/// Return the location of the capture if the given lambda captures the given
8118
/// variable \p VD, or an invalid source location otherwise.
8119
static SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI,
8120
const VarDecl *VD) {
8121
for (const Capture &Capture : LSI->Captures) {
8122
if (Capture.isVariableCapture() && Capture.getVariable() == VD)
8123
return Capture.getLocation();
8124
}
8125
return SourceLocation();
8126
}
8127
8128
static bool shouldWarnIfShadowedDecl(const DiagnosticsEngine &Diags,
8129
const LookupResult &R) {
8130
// Only diagnose if we're shadowing an unambiguous field or variable.
8131
if (R.getResultKind() != LookupResult::Found)
8132
return false;
8133
8134
// Return false if warning is ignored.
8135
return !Diags.isIgnored(diag::warn_decl_shadow, R.getNameLoc());
8136
}
8137
8138
NamedDecl *Sema::getShadowedDeclaration(const VarDecl *D,
8139
const LookupResult &R) {
8140
if (!shouldWarnIfShadowedDecl(Diags, R))
8141
return nullptr;
8142
8143
// Don't diagnose declarations at file scope.
8144
if (D->hasGlobalStorage() && !D->isStaticLocal())
8145
return nullptr;
8146
8147
NamedDecl *ShadowedDecl = R.getFoundDecl();
8148
return isa<VarDecl, FieldDecl, BindingDecl>(ShadowedDecl) ? ShadowedDecl
8149
: nullptr;
8150
}
8151
8152
NamedDecl *Sema::getShadowedDeclaration(const TypedefNameDecl *D,
8153
const LookupResult &R) {
8154
// Don't warn if typedef declaration is part of a class
8155
if (D->getDeclContext()->isRecord())
8156
return nullptr;
8157
8158
if (!shouldWarnIfShadowedDecl(Diags, R))
8159
return nullptr;
8160
8161
NamedDecl *ShadowedDecl = R.getFoundDecl();
8162
return isa<TypedefNameDecl>(ShadowedDecl) ? ShadowedDecl : nullptr;
8163
}
8164
8165
NamedDecl *Sema::getShadowedDeclaration(const BindingDecl *D,
8166
const LookupResult &R) {
8167
if (!shouldWarnIfShadowedDecl(Diags, R))
8168
return nullptr;
8169
8170
NamedDecl *ShadowedDecl = R.getFoundDecl();
8171
return isa<VarDecl, FieldDecl, BindingDecl>(ShadowedDecl) ? ShadowedDecl
8172
: nullptr;
8173
}
8174
8175
void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
8176
const LookupResult &R) {
8177
DeclContext *NewDC = D->getDeclContext();
8178
8179
if (FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8180
// Fields are not shadowed by variables in C++ static methods.
8181
if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDC))
8182
if (MD->isStatic())
8183
return;
8184
8185
// Fields shadowed by constructor parameters are a special case. Usually
8186
// the constructor initializes the field with the parameter.
8187
if (isa<CXXConstructorDecl>(NewDC))
8188
if (const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8189
// Remember that this was shadowed so we can either warn about its
8190
// modification or its existence depending on warning settings.
8191
ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8192
return;
8193
}
8194
}
8195
8196
if (VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8197
if (shadowedVar->isExternC()) {
8198
// For shadowing external vars, make sure that we point to the global
8199
// declaration, not a locally scoped extern declaration.
8200
for (auto *I : shadowedVar->redecls())
8201
if (I->isFileVarDecl()) {
8202
ShadowedDecl = I;
8203
break;
8204
}
8205
}
8206
8207
DeclContext *OldDC = ShadowedDecl->getDeclContext()->getRedeclContext();
8208
8209
unsigned WarningDiag = diag::warn_decl_shadow;
8210
SourceLocation CaptureLoc;
8211
if (isa<VarDecl>(D) && NewDC && isa<CXXMethodDecl>(NewDC)) {
8212
if (const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->getParent())) {
8213
if (RD->isLambda() && OldDC->Encloses(NewDC->getLexicalParent())) {
8214
if (const auto *VD = dyn_cast<VarDecl>(ShadowedDecl)) {
8215
const auto *LSI = cast<LambdaScopeInfo>(getCurFunction());
8216
if (RD->getLambdaCaptureDefault() == LCD_None) {
8217
// Try to avoid warnings for lambdas with an explicit capture
8218
// list. Warn only when the lambda captures the shadowed decl
8219
// explicitly.
8220
CaptureLoc = getCaptureLocation(LSI, VD);
8221
if (CaptureLoc.isInvalid())
8222
WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8223
} else {
8224
// Remember that this was shadowed so we can avoid the warning if
8225
// the shadowed decl isn't captured and the warning settings allow
8226
// it.
8227
cast<LambdaScopeInfo>(getCurFunction())
8228
->ShadowingDecls.push_back({D, VD});
8229
return;
8230
}
8231
}
8232
if (isa<FieldDecl>(ShadowedDecl)) {
8233
// If lambda can capture this, then emit default shadowing warning,
8234
// Otherwise it is not really a shadowing case since field is not
8235
// available in lambda's body.
8236
// At this point we don't know that lambda can capture this, so
8237
// remember that this was shadowed and delay until we know.
8238
cast<LambdaScopeInfo>(getCurFunction())
8239
->ShadowingDecls.push_back({D, ShadowedDecl});
8240
return;
8241
}
8242
}
8243
if (const auto *VD = dyn_cast<VarDecl>(ShadowedDecl);
8244
VD && VD->hasLocalStorage()) {
8245
// A variable can't shadow a local variable in an enclosing scope, if
8246
// they are separated by a non-capturing declaration context.
8247
for (DeclContext *ParentDC = NewDC;
8248
ParentDC && !ParentDC->Equals(OldDC);
8249
ParentDC = getLambdaAwareParentOfDeclContext(ParentDC)) {
8250
// Only block literals, captured statements, and lambda expressions
8251
// can capture; other scopes don't.
8252
if (!isa<BlockDecl>(ParentDC) && !isa<CapturedDecl>(ParentDC) &&
8253
!isLambdaCallOperator(ParentDC)) {
8254
return;
8255
}
8256
}
8257
}
8258
}
8259
}
8260
8261
// Never warn about shadowing a placeholder variable.
8262
if (ShadowedDecl->isPlaceholderVar(getLangOpts()))
8263
return;
8264
8265
// Only warn about certain kinds of shadowing for class members.
8266
if (NewDC && NewDC->isRecord()) {
8267
// In particular, don't warn about shadowing non-class members.
8268
if (!OldDC->isRecord())
8269
return;
8270
8271
// TODO: should we warn about static data members shadowing
8272
// static data members from base classes?
8273
8274
// TODO: don't diagnose for inaccessible shadowed members.
8275
// This is hard to do perfectly because we might friend the
8276
// shadowing context, but that's just a false negative.
8277
}
8278
8279
8280
DeclarationName Name = R.getLookupName();
8281
8282
// Emit warning and note.
8283
ShadowedDeclKind Kind = computeShadowedDeclKind(ShadowedDecl, OldDC);
8284
Diag(R.getNameLoc(), WarningDiag) << Name << Kind << OldDC;
8285
if (!CaptureLoc.isInvalid())
8286
Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8287
<< Name << /*explicitly*/ 1;
8288
Diag(ShadowedDecl->getLocation(), diag::note_previous_declaration);
8289
}
8290
8291
void Sema::DiagnoseShadowingLambdaDecls(const LambdaScopeInfo *LSI) {
8292
for (const auto &Shadow : LSI->ShadowingDecls) {
8293
const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8294
// Try to avoid the warning when the shadowed decl isn't captured.
8295
const DeclContext *OldDC = ShadowedDecl->getDeclContext();
8296
if (const auto *VD = dyn_cast<VarDecl>(ShadowedDecl)) {
8297
SourceLocation CaptureLoc = getCaptureLocation(LSI, VD);
8298
Diag(Shadow.VD->getLocation(),
8299
CaptureLoc.isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8300
: diag::warn_decl_shadow)
8301
<< Shadow.VD->getDeclName()
8302
<< computeShadowedDeclKind(ShadowedDecl, OldDC) << OldDC;
8303
if (CaptureLoc.isValid())
8304
Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8305
<< Shadow.VD->getDeclName() << /*explicitly*/ 0;
8306
Diag(ShadowedDecl->getLocation(), diag::note_previous_declaration);
8307
} else if (isa<FieldDecl>(ShadowedDecl)) {
8308
Diag(Shadow.VD->getLocation(),
8309
LSI->isCXXThisCaptured() ? diag::warn_decl_shadow
8310
: diag::warn_decl_shadow_uncaptured_local)
8311
<< Shadow.VD->getDeclName()
8312
<< computeShadowedDeclKind(ShadowedDecl, OldDC) << OldDC;
8313
Diag(ShadowedDecl->getLocation(), diag::note_previous_declaration);
8314
}
8315
}
8316
}
8317
8318
void Sema::CheckShadow(Scope *S, VarDecl *D) {
8319
if (Diags.isIgnored(diag::warn_decl_shadow, D->getLocation()))
8320
return;
8321
8322
LookupResult R(*this, D->getDeclName(), D->getLocation(),
8323
Sema::LookupOrdinaryName,
8324
RedeclarationKind::ForVisibleRedeclaration);
8325
LookupName(R, S);
8326
if (NamedDecl *ShadowedDecl = getShadowedDeclaration(D, R))
8327
CheckShadow(D, ShadowedDecl, R);
8328
}
8329
8330
/// Check if 'E', which is an expression that is about to be modified, refers
8331
/// to a constructor parameter that shadows a field.
8332
void Sema::CheckShadowingDeclModification(Expr *E, SourceLocation Loc) {
8333
// Quickly ignore expressions that can't be shadowing ctor parameters.
8334
if (!getLangOpts().CPlusPlus || ShadowingDecls.empty())
8335
return;
8336
E = E->IgnoreParenImpCasts();
8337
auto *DRE = dyn_cast<DeclRefExpr>(E);
8338
if (!DRE)
8339
return;
8340
const NamedDecl *D = cast<NamedDecl>(DRE->getDecl()->getCanonicalDecl());
8341
auto I = ShadowingDecls.find(D);
8342
if (I == ShadowingDecls.end())
8343
return;
8344
const NamedDecl *ShadowedDecl = I->second;
8345
const DeclContext *OldDC = ShadowedDecl->getDeclContext();
8346
Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8347
Diag(D->getLocation(), diag::note_var_declared_here) << D;
8348
Diag(ShadowedDecl->getLocation(), diag::note_previous_declaration);
8349
8350
// Avoid issuing multiple warnings about the same decl.
8351
ShadowingDecls.erase(I);
8352
}
8353
8354
/// Check for conflict between this global or extern "C" declaration and
8355
/// previous global or extern "C" declarations. This is only used in C++.
8356
template<typename T>
8357
static bool checkGlobalOrExternCConflict(
8358
Sema &S, const T *ND, bool IsGlobal, LookupResult &Previous) {
8359
assert(S.getLangOpts().CPlusPlus && "only C++ has extern \"C\"");
8360
NamedDecl *Prev = S.findLocallyScopedExternCDecl(ND->getDeclName());
8361
8362
if (!Prev && IsGlobal && !isIncompleteDeclExternC(S, ND)) {
8363
// The common case: this global doesn't conflict with any extern "C"
8364
// declaration.
8365
return false;
8366
}
8367
8368
if (Prev) {
8369
if (!IsGlobal || isIncompleteDeclExternC(S, ND)) {
8370
// Both the old and new declarations have C language linkage. This is a
8371
// redeclaration.
8372
Previous.clear();
8373
Previous.addDecl(Prev);
8374
return true;
8375
}
8376
8377
// This is a global, non-extern "C" declaration, and there is a previous
8378
// non-global extern "C" declaration. Diagnose if this is a variable
8379
// declaration.
8380
if (!isa<VarDecl>(ND))
8381
return false;
8382
} else {
8383
// The declaration is extern "C". Check for any declaration in the
8384
// translation unit which might conflict.
8385
if (IsGlobal) {
8386
// We have already performed the lookup into the translation unit.
8387
IsGlobal = false;
8388
for (LookupResult::iterator I = Previous.begin(), E = Previous.end();
8389
I != E; ++I) {
8390
if (isa<VarDecl>(*I)) {
8391
Prev = *I;
8392
break;
8393
}
8394
}
8395
} else {
8396
DeclContext::lookup_result R =
8397
S.Context.getTranslationUnitDecl()->lookup(ND->getDeclName());
8398
for (DeclContext::lookup_result::iterator I = R.begin(), E = R.end();
8399
I != E; ++I) {
8400
if (isa<VarDecl>(*I)) {
8401
Prev = *I;
8402
break;
8403
}
8404
// FIXME: If we have any other entity with this name in global scope,
8405
// the declaration is ill-formed, but that is a defect: it breaks the
8406
// 'stat' hack, for instance. Only variables can have mangled name
8407
// clashes with extern "C" declarations, so only they deserve a
8408
// diagnostic.
8409
}
8410
}
8411
8412
if (!Prev)
8413
return false;
8414
}
8415
8416
// Use the first declaration's location to ensure we point at something which
8417
// is lexically inside an extern "C" linkage-spec.
8418
assert(Prev && "should have found a previous declaration to diagnose");
8419
if (FunctionDecl *FD = dyn_cast<FunctionDecl>(Prev))
8420
Prev = FD->getFirstDecl();
8421
else
8422
Prev = cast<VarDecl>(Prev)->getFirstDecl();
8423
8424
S.Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8425
<< IsGlobal << ND;
8426
S.Diag(Prev->getLocation(), diag::note_extern_c_global_conflict)
8427
<< IsGlobal;
8428
return false;
8429
}
8430
8431
/// Apply special rules for handling extern "C" declarations. Returns \c true
8432
/// if we have found that this is a redeclaration of some prior entity.
8433
///
8434
/// Per C++ [dcl.link]p6:
8435
/// Two declarations [for a function or variable] with C language linkage
8436
/// with the same name that appear in different scopes refer to the same
8437
/// [entity]. An entity with C language linkage shall not be declared with
8438
/// the same name as an entity in global scope.
8439
template<typename T>
8440
static bool checkForConflictWithNonVisibleExternC(Sema &S, const T *ND,
8441
LookupResult &Previous) {
8442
if (!S.getLangOpts().CPlusPlus) {
8443
// In C, when declaring a global variable, look for a corresponding 'extern'
8444
// variable declared in function scope. We don't need this in C++, because
8445
// we find local extern decls in the surrounding file-scope DeclContext.
8446
if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8447
if (NamedDecl *Prev = S.findLocallyScopedExternCDecl(ND->getDeclName())) {
8448
Previous.clear();
8449
Previous.addDecl(Prev);
8450
return true;
8451
}
8452
}
8453
return false;
8454
}
8455
8456
// A declaration in the translation unit can conflict with an extern "C"
8457
// declaration.
8458
if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8459
return checkGlobalOrExternCConflict(S, ND, /*IsGlobal*/true, Previous);
8460
8461
// An extern "C" declaration can conflict with a declaration in the
8462
// translation unit or can be a redeclaration of an extern "C" declaration
8463
// in another scope.
8464
if (isIncompleteDeclExternC(S,ND))
8465
return checkGlobalOrExternCConflict(S, ND, /*IsGlobal*/false, Previous);
8466
8467
// Neither global nor extern "C": nothing to do.
8468
return false;
8469
}
8470
8471
static bool CheckC23ConstexprVarType(Sema &SemaRef, SourceLocation VarLoc,
8472
QualType T) {
8473
QualType CanonT = SemaRef.Context.getCanonicalType(T);
8474
// C23 6.7.1p5: An object declared with storage-class specifier constexpr or
8475
// any of its members, even recursively, shall not have an atomic type, or a
8476
// variably modified type, or a type that is volatile or restrict qualified.
8477
if (CanonT->isVariablyModifiedType()) {
8478
SemaRef.Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8479
return true;
8480
}
8481
8482
// Arrays are qualified by their element type, so get the base type (this
8483
// works on non-arrays as well).
8484
CanonT = SemaRef.Context.getBaseElementType(CanonT);
8485
8486
if (CanonT->isAtomicType() || CanonT.isVolatileQualified() ||
8487
CanonT.isRestrictQualified()) {
8488
SemaRef.Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8489
return true;
8490
}
8491
8492
if (CanonT->isRecordType()) {
8493
const RecordDecl *RD = CanonT->getAsRecordDecl();
8494
if (llvm::any_of(RD->fields(), [&SemaRef, VarLoc](const FieldDecl *F) {
8495
return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8496
}))
8497
return true;
8498
}
8499
8500
return false;
8501
}
8502
8503
void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {
8504
// If the decl is already known invalid, don't check it.
8505
if (NewVD->isInvalidDecl())
8506
return;
8507
8508
QualType T = NewVD->getType();
8509
8510
// Defer checking an 'auto' type until its initializer is attached.
8511
if (T->isUndeducedType())
8512
return;
8513
8514
if (NewVD->hasAttrs())
8515
CheckAlignasUnderalignment(NewVD);
8516
8517
if (T->isObjCObjectType()) {
8518
Diag(NewVD->getLocation(), diag::err_statically_allocated_object)
8519
<< FixItHint::CreateInsertion(NewVD->getLocation(), "*");
8520
T = Context.getObjCObjectPointerType(T);
8521
NewVD->setType(T);
8522
}
8523
8524
// Emit an error if an address space was applied to decl with local storage.
8525
// This includes arrays of objects with address space qualifiers, but not
8526
// automatic variables that point to other address spaces.
8527
// ISO/IEC TR 18037 S5.1.2
8528
if (!getLangOpts().OpenCL && NewVD->hasLocalStorage() &&
8529
T.getAddressSpace() != LangAS::Default) {
8530
Diag(NewVD->getLocation(), diag::err_as_qualified_auto_decl) << 0;
8531
NewVD->setInvalidDecl();
8532
return;
8533
}
8534
8535
// OpenCL v1.2 s6.8 - The static qualifier is valid only in program
8536
// scope.
8537
if (getLangOpts().OpenCLVersion == 120 &&
8538
!getOpenCLOptions().isAvailableOption("cl_clang_storage_class_specifiers",
8539
getLangOpts()) &&
8540
NewVD->isStaticLocal()) {
8541
Diag(NewVD->getLocation(), diag::err_static_function_scope);
8542
NewVD->setInvalidDecl();
8543
return;
8544
}
8545
8546
if (getLangOpts().OpenCL) {
8547
if (!diagnoseOpenCLTypes(*this, NewVD))
8548
return;
8549
8550
// OpenCL v2.0 s6.12.5 - The __block storage type is not supported.
8551
if (NewVD->hasAttr<BlocksAttr>()) {
8552
Diag(NewVD->getLocation(), diag::err_opencl_block_storage_type);
8553
return;
8554
}
8555
8556
if (T->isBlockPointerType()) {
8557
// OpenCL v2.0 s6.12.5 - Any block declaration must be const qualified and
8558
// can't use 'extern' storage class.
8559
if (!T.isConstQualified()) {
8560
Diag(NewVD->getLocation(), diag::err_opencl_invalid_block_declaration)
8561
<< 0 /*const*/;
8562
NewVD->setInvalidDecl();
8563
return;
8564
}
8565
if (NewVD->hasExternalStorage()) {
8566
Diag(NewVD->getLocation(), diag::err_opencl_extern_block_declaration);
8567
NewVD->setInvalidDecl();
8568
return;
8569
}
8570
}
8571
8572
// FIXME: Adding local AS in C++ for OpenCL might make sense.
8573
if (NewVD->isFileVarDecl() || NewVD->isStaticLocal() ||
8574
NewVD->hasExternalStorage()) {
8575
if (!T->isSamplerT() && !T->isDependentType() &&
8576
!(T.getAddressSpace() == LangAS::opencl_constant ||
8577
(T.getAddressSpace() == LangAS::opencl_global &&
8578
getOpenCLOptions().areProgramScopeVariablesSupported(
8579
getLangOpts())))) {
8580
int Scope = NewVD->isStaticLocal() | NewVD->hasExternalStorage() << 1;
8581
if (getOpenCLOptions().areProgramScopeVariablesSupported(getLangOpts()))
8582
Diag(NewVD->getLocation(), diag::err_opencl_global_invalid_addr_space)
8583
<< Scope << "global or constant";
8584
else
8585
Diag(NewVD->getLocation(), diag::err_opencl_global_invalid_addr_space)
8586
<< Scope << "constant";
8587
NewVD->setInvalidDecl();
8588
return;
8589
}
8590
} else {
8591
if (T.getAddressSpace() == LangAS::opencl_global) {
8592
Diag(NewVD->getLocation(), diag::err_opencl_function_variable)
8593
<< 1 /*is any function*/ << "global";
8594
NewVD->setInvalidDecl();
8595
return;
8596
}
8597
if (T.getAddressSpace() == LangAS::opencl_constant ||
8598
T.getAddressSpace() == LangAS::opencl_local) {
8599
FunctionDecl *FD = getCurFunctionDecl();
8600
// OpenCL v1.1 s6.5.2 and s6.5.3: no local or constant variables
8601
// in functions.
8602
if (FD && !FD->hasAttr<OpenCLKernelAttr>()) {
8603
if (T.getAddressSpace() == LangAS::opencl_constant)
8604
Diag(NewVD->getLocation(), diag::err_opencl_function_variable)
8605
<< 0 /*non-kernel only*/ << "constant";
8606
else
8607
Diag(NewVD->getLocation(), diag::err_opencl_function_variable)
8608
<< 0 /*non-kernel only*/ << "local";
8609
NewVD->setInvalidDecl();
8610
return;
8611
}
8612
// OpenCL v2.0 s6.5.2 and s6.5.3: local and constant variables must be
8613
// in the outermost scope of a kernel function.
8614
if (FD && FD->hasAttr<OpenCLKernelAttr>()) {
8615
if (!getCurScope()->isFunctionScope()) {
8616
if (T.getAddressSpace() == LangAS::opencl_constant)
8617
Diag(NewVD->getLocation(), diag::err_opencl_addrspace_scope)
8618
<< "constant";
8619
else
8620
Diag(NewVD->getLocation(), diag::err_opencl_addrspace_scope)
8621
<< "local";
8622
NewVD->setInvalidDecl();
8623
return;
8624
}
8625
}
8626
} else if (T.getAddressSpace() != LangAS::opencl_private &&
8627
// If we are parsing a template we didn't deduce an addr
8628
// space yet.
8629
T.getAddressSpace() != LangAS::Default) {
8630
// Do not allow other address spaces on automatic variable.
8631
Diag(NewVD->getLocation(), diag::err_as_qualified_auto_decl) << 1;
8632
NewVD->setInvalidDecl();
8633
return;
8634
}
8635
}
8636
}
8637
8638
if (NewVD->hasLocalStorage() && T.isObjCGCWeak()
8639
&& !NewVD->hasAttr<BlocksAttr>()) {
8640
if (getLangOpts().getGC() != LangOptions::NonGC)
8641
Diag(NewVD->getLocation(), diag::warn_gc_attribute_weak_on_local);
8642
else {
8643
assert(!getLangOpts().ObjCAutoRefCount);
8644
Diag(NewVD->getLocation(), diag::warn_attribute_weak_on_local);
8645
}
8646
}
8647
8648
// WebAssembly tables must be static with a zero length and can't be
8649
// declared within functions.
8650
if (T->isWebAssemblyTableType()) {
8651
if (getCurScope()->getParent()) { // Parent is null at top-level
8652
Diag(NewVD->getLocation(), diag::err_wasm_table_in_function);
8653
NewVD->setInvalidDecl();
8654
return;
8655
}
8656
if (NewVD->getStorageClass() != SC_Static) {
8657
Diag(NewVD->getLocation(), diag::err_wasm_table_must_be_static);
8658
NewVD->setInvalidDecl();
8659
return;
8660
}
8661
const auto *ATy = dyn_cast<ConstantArrayType>(T.getTypePtr());
8662
if (!ATy || ATy->getZExtSize() != 0) {
8663
Diag(NewVD->getLocation(),
8664
diag::err_typecheck_wasm_table_must_have_zero_length);
8665
NewVD->setInvalidDecl();
8666
return;
8667
}
8668
}
8669
8670
bool isVM = T->isVariablyModifiedType();
8671
if (isVM || NewVD->hasAttr<CleanupAttr>() ||
8672
NewVD->hasAttr<BlocksAttr>())
8673
setFunctionHasBranchProtectedScope();
8674
8675
if ((isVM && NewVD->hasLinkage()) ||
8676
(T->isVariableArrayType() && NewVD->hasGlobalStorage())) {
8677
bool SizeIsNegative;
8678
llvm::APSInt Oversized;
8679
TypeSourceInfo *FixedTInfo = TryToFixInvalidVariablyModifiedTypeSourceInfo(
8680
NewVD->getTypeSourceInfo(), Context, SizeIsNegative, Oversized);
8681
QualType FixedT;
8682
if (FixedTInfo && T == NewVD->getTypeSourceInfo()->getType())
8683
FixedT = FixedTInfo->getType();
8684
else if (FixedTInfo) {
8685
// Type and type-as-written are canonically different. We need to fix up
8686
// both types separately.
8687
FixedT = TryToFixInvalidVariablyModifiedType(T, Context, SizeIsNegative,
8688
Oversized);
8689
}
8690
if ((!FixedTInfo || FixedT.isNull()) && T->isVariableArrayType()) {
8691
const VariableArrayType *VAT = Context.getAsVariableArrayType(T);
8692
// FIXME: This won't give the correct result for
8693
// int a[10][n];
8694
SourceRange SizeRange = VAT->getSizeExpr()->getSourceRange();
8695
8696
if (NewVD->isFileVarDecl())
8697
Diag(NewVD->getLocation(), diag::err_vla_decl_in_file_scope)
8698
<< SizeRange;
8699
else if (NewVD->isStaticLocal())
8700
Diag(NewVD->getLocation(), diag::err_vla_decl_has_static_storage)
8701
<< SizeRange;
8702
else
8703
Diag(NewVD->getLocation(), diag::err_vla_decl_has_extern_linkage)
8704
<< SizeRange;
8705
NewVD->setInvalidDecl();
8706
return;
8707
}
8708
8709
if (!FixedTInfo) {
8710
if (NewVD->isFileVarDecl())
8711
Diag(NewVD->getLocation(), diag::err_vm_decl_in_file_scope);
8712
else
8713
Diag(NewVD->getLocation(), diag::err_vm_decl_has_extern_linkage);
8714
NewVD->setInvalidDecl();
8715
return;
8716
}
8717
8718
Diag(NewVD->getLocation(), diag::ext_vla_folded_to_constant);
8719
NewVD->setType(FixedT);
8720
NewVD->setTypeSourceInfo(FixedTInfo);
8721
}
8722
8723
if (T->isVoidType()) {
8724
// C++98 [dcl.stc]p5: The extern specifier can be applied only to the names
8725
// of objects and functions.
8726
if (NewVD->isThisDeclarationADefinition() || getLangOpts().CPlusPlus) {
8727
Diag(NewVD->getLocation(), diag::err_typecheck_decl_incomplete_type)
8728
<< T;
8729
NewVD->setInvalidDecl();
8730
return;
8731
}
8732
}
8733
8734
if (!NewVD->hasLocalStorage() && NewVD->hasAttr<BlocksAttr>()) {
8735
Diag(NewVD->getLocation(), diag::err_block_on_nonlocal);
8736
NewVD->setInvalidDecl();
8737
return;
8738
}
8739
8740
if (!NewVD->hasLocalStorage() && T->isSizelessType() &&
8741
!T.isWebAssemblyReferenceType()) {
8742
Diag(NewVD->getLocation(), diag::err_sizeless_nonlocal) << T;
8743
NewVD->setInvalidDecl();
8744
return;
8745
}
8746
8747
if (isVM && NewVD->hasAttr<BlocksAttr>()) {
8748
Diag(NewVD->getLocation(), diag::err_block_on_vm);
8749
NewVD->setInvalidDecl();
8750
return;
8751
}
8752
8753
if (getLangOpts().C23 && NewVD->isConstexpr() &&
8754
CheckC23ConstexprVarType(*this, NewVD->getLocation(), T)) {
8755
NewVD->setInvalidDecl();
8756
return;
8757
}
8758
8759
if (NewVD->isConstexpr() && !T->isDependentType() &&
8760
RequireLiteralType(NewVD->getLocation(), T,
8761
diag::err_constexpr_var_non_literal)) {
8762
NewVD->setInvalidDecl();
8763
return;
8764
}
8765
8766
// PPC MMA non-pointer types are not allowed as non-local variable types.
8767
if (Context.getTargetInfo().getTriple().isPPC64() &&
8768
!NewVD->isLocalVarDecl() &&
8769
PPC().CheckPPCMMAType(T, NewVD->getLocation())) {
8770
NewVD->setInvalidDecl();
8771
return;
8772
}
8773
8774
// Check that SVE types are only used in functions with SVE available.
8775
if (T->isSVESizelessBuiltinType() && isa<FunctionDecl>(CurContext)) {
8776
const FunctionDecl *FD = cast<FunctionDecl>(CurContext);
8777
llvm::StringMap<bool> CallerFeatureMap;
8778
Context.getFunctionFeatureMap(CallerFeatureMap, FD);
8779
8780
if (!Builtin::evaluateRequiredTargetFeatures("sve", CallerFeatureMap)) {
8781
if (!Builtin::evaluateRequiredTargetFeatures("sme", CallerFeatureMap)) {
8782
Diag(NewVD->getLocation(), diag::err_sve_vector_in_non_sve_target) << T;
8783
NewVD->setInvalidDecl();
8784
return;
8785
} else if (!IsArmStreamingFunction(FD,
8786
/*IncludeLocallyStreaming=*/true)) {
8787
Diag(NewVD->getLocation(),
8788
diag::err_sve_vector_in_non_streaming_function)
8789
<< T;
8790
NewVD->setInvalidDecl();
8791
return;
8792
}
8793
}
8794
}
8795
8796
if (T->isRVVSizelessBuiltinType() && isa<FunctionDecl>(CurContext)) {
8797
const FunctionDecl *FD = cast<FunctionDecl>(CurContext);
8798
llvm::StringMap<bool> CallerFeatureMap;
8799
Context.getFunctionFeatureMap(CallerFeatureMap, FD);
8800
RISCV().checkRVVTypeSupport(T, NewVD->getLocation(), cast<Decl>(CurContext),
8801
CallerFeatureMap);
8802
}
8803
}
8804
8805
bool Sema::CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous) {
8806
CheckVariableDeclarationType(NewVD);
8807
8808
// If the decl is already known invalid, don't check it.
8809
if (NewVD->isInvalidDecl())
8810
return false;
8811
8812
// If we did not find anything by this name, look for a non-visible
8813
// extern "C" declaration with the same name.
8814
if (Previous.empty() &&
8815
checkForConflictWithNonVisibleExternC(*this, NewVD, Previous))
8816
Previous.setShadowed();
8817
8818
if (!Previous.empty()) {
8819
MergeVarDecl(NewVD, Previous);
8820
return true;
8821
}
8822
return false;
8823
}
8824
8825
bool Sema::AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) {
8826
llvm::SmallPtrSet<const CXXMethodDecl*, 4> Overridden;
8827
8828
// Look for methods in base classes that this method might override.
8829
CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/false,
8830
/*DetectVirtual=*/false);
8831
auto VisitBase = [&] (const CXXBaseSpecifier *Specifier, CXXBasePath &Path) {
8832
CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
8833
DeclarationName Name = MD->getDeclName();
8834
8835
if (Name.getNameKind() == DeclarationName::CXXDestructorName) {
8836
// We really want to find the base class destructor here.
8837
QualType T = Context.getTypeDeclType(BaseRecord);
8838
CanQualType CT = Context.getCanonicalType(T);
8839
Name = Context.DeclarationNames.getCXXDestructorName(CT);
8840
}
8841
8842
for (NamedDecl *BaseND : BaseRecord->lookup(Name)) {
8843
CXXMethodDecl *BaseMD =
8844
dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
8845
if (!BaseMD || !BaseMD->isVirtual() ||
8846
IsOverride(MD, BaseMD, /*UseMemberUsingDeclRules=*/false,
8847
/*ConsiderCudaAttrs=*/true))
8848
continue;
8849
if (!CheckExplicitObjectOverride(MD, BaseMD))
8850
continue;
8851
if (Overridden.insert(BaseMD).second) {
8852
MD->addOverriddenMethod(BaseMD);
8853
CheckOverridingFunctionReturnType(MD, BaseMD);
8854
CheckOverridingFunctionAttributes(MD, BaseMD);
8855
CheckOverridingFunctionExceptionSpec(MD, BaseMD);
8856
CheckIfOverriddenFunctionIsMarkedFinal(MD, BaseMD);
8857
}
8858
8859
// A method can only override one function from each base class. We
8860
// don't track indirectly overridden methods from bases of bases.
8861
return true;
8862
}
8863
8864
return false;
8865
};
8866
8867
DC->lookupInBases(VisitBase, Paths);
8868
return !Overridden.empty();
8869
}
8870
8871
namespace {
8872
// Struct for holding all of the extra arguments needed by
8873
// DiagnoseInvalidRedeclaration to call Sema::ActOnFunctionDeclarator.
8874
struct ActOnFDArgs {
8875
Scope *S;
8876
Declarator &D;
8877
MultiTemplateParamsArg TemplateParamLists;
8878
bool AddToScope;
8879
};
8880
} // end anonymous namespace
8881
8882
namespace {
8883
8884
// Callback to only accept typo corrections that have a non-zero edit distance.
8885
// Also only accept corrections that have the same parent decl.
8886
class DifferentNameValidatorCCC final : public CorrectionCandidateCallback {
8887
public:
8888
DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
8889
CXXRecordDecl *Parent)
8890
: Context(Context), OriginalFD(TypoFD),
8891
ExpectedParent(Parent ? Parent->getCanonicalDecl() : nullptr) {}
8892
8893
bool ValidateCandidate(const TypoCorrection &candidate) override {
8894
if (candidate.getEditDistance() == 0)
8895
return false;
8896
8897
SmallVector<unsigned, 1> MismatchedParams;
8898
for (TypoCorrection::const_decl_iterator CDecl = candidate.begin(),
8899
CDeclEnd = candidate.end();
8900
CDecl != CDeclEnd; ++CDecl) {
8901
FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
8902
8903
if (FD && !FD->hasBody() &&
8904
hasSimilarParameters(Context, FD, OriginalFD, MismatchedParams)) {
8905
if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
8906
CXXRecordDecl *Parent = MD->getParent();
8907
if (Parent && Parent->getCanonicalDecl() == ExpectedParent)
8908
return true;
8909
} else if (!ExpectedParent) {
8910
return true;
8911
}
8912
}
8913
}
8914
8915
return false;
8916
}
8917
8918
std::unique_ptr<CorrectionCandidateCallback> clone() override {
8919
return std::make_unique<DifferentNameValidatorCCC>(*this);
8920
}
8921
8922
private:
8923
ASTContext &Context;
8924
FunctionDecl *OriginalFD;
8925
CXXRecordDecl *ExpectedParent;
8926
};
8927
8928
} // end anonymous namespace
8929
8930
void Sema::MarkTypoCorrectedFunctionDefinition(const NamedDecl *F) {
8931
TypoCorrectedFunctionDefinitions.insert(F);
8932
}
8933
8934
/// Generate diagnostics for an invalid function redeclaration.
8935
///
8936
/// This routine handles generating the diagnostic messages for an invalid
8937
/// function redeclaration, including finding possible similar declarations
8938
/// or performing typo correction if there are no previous declarations with
8939
/// the same name.
8940
///
8941
/// Returns a NamedDecl iff typo correction was performed and substituting in
8942
/// the new declaration name does not cause new errors.
8943
static NamedDecl *DiagnoseInvalidRedeclaration(
8944
Sema &SemaRef, LookupResult &Previous, FunctionDecl *NewFD,
8945
ActOnFDArgs &ExtraArgs, bool IsLocalFriend, Scope *S) {
8946
DeclarationName Name = NewFD->getDeclName();
8947
DeclContext *NewDC = NewFD->getDeclContext();
8948
SmallVector<unsigned, 1> MismatchedParams;
8949
SmallVector<std::pair<FunctionDecl *, unsigned>, 1> NearMatches;
8950
TypoCorrection Correction;
8951
bool IsDefinition = ExtraArgs.D.isFunctionDefinition();
8952
unsigned DiagMsg =
8953
IsLocalFriend ? diag::err_no_matching_local_friend :
8954
NewFD->getFriendObjectKind() ? diag::err_qualified_friend_no_match :
8955
diag::err_member_decl_does_not_match;
8956
LookupResult Prev(SemaRef, Name, NewFD->getLocation(),
8957
IsLocalFriend ? Sema::LookupLocalFriendName
8958
: Sema::LookupOrdinaryName,
8959
RedeclarationKind::ForVisibleRedeclaration);
8960
8961
NewFD->setInvalidDecl();
8962
if (IsLocalFriend)
8963
SemaRef.LookupName(Prev, S);
8964
else
8965
SemaRef.LookupQualifiedName(Prev, NewDC);
8966
assert(!Prev.isAmbiguous() &&
8967
"Cannot have an ambiguity in previous-declaration lookup");
8968
CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD);
8969
DifferentNameValidatorCCC CCC(SemaRef.Context, NewFD,
8970
MD ? MD->getParent() : nullptr);
8971
if (!Prev.empty()) {
8972
for (LookupResult::iterator Func = Prev.begin(), FuncEnd = Prev.end();
8973
Func != FuncEnd; ++Func) {
8974
FunctionDecl *FD = dyn_cast<FunctionDecl>(*Func);
8975
if (FD &&
8976
hasSimilarParameters(SemaRef.Context, FD, NewFD, MismatchedParams)) {
8977
// Add 1 to the index so that 0 can mean the mismatch didn't
8978
// involve a parameter
8979
unsigned ParamNum =
8980
MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
8981
NearMatches.push_back(std::make_pair(FD, ParamNum));
8982
}
8983
}
8984
// If the qualified name lookup yielded nothing, try typo correction
8985
} else if ((Correction = SemaRef.CorrectTypo(
8986
Prev.getLookupNameInfo(), Prev.getLookupKind(), S,
8987
&ExtraArgs.D.getCXXScopeSpec(), CCC, Sema::CTK_ErrorRecovery,
8988
IsLocalFriend ? nullptr : NewDC))) {
8989
// Set up everything for the call to ActOnFunctionDeclarator
8990
ExtraArgs.D.SetIdentifier(Correction.getCorrectionAsIdentifierInfo(),
8991
ExtraArgs.D.getIdentifierLoc());
8992
Previous.clear();
8993
Previous.setLookupName(Correction.getCorrection());
8994
for (TypoCorrection::decl_iterator CDecl = Correction.begin(),
8995
CDeclEnd = Correction.end();
8996
CDecl != CDeclEnd; ++CDecl) {
8997
FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
8998
if (FD && !FD->hasBody() &&
8999
hasSimilarParameters(SemaRef.Context, FD, NewFD, MismatchedParams)) {
9000
Previous.addDecl(FD);
9001
}
9002
}
9003
bool wasRedeclaration = ExtraArgs.D.isRedeclaration();
9004
9005
NamedDecl *Result;
9006
// Retry building the function declaration with the new previous
9007
// declarations, and with errors suppressed.
9008
{
9009
// Trap errors.
9010
Sema::SFINAETrap Trap(SemaRef);
9011
9012
// TODO: Refactor ActOnFunctionDeclarator so that we can call only the
9013
// pieces need to verify the typo-corrected C++ declaration and hopefully
9014
// eliminate the need for the parameter pack ExtraArgs.
9015
Result = SemaRef.ActOnFunctionDeclarator(
9016
ExtraArgs.S, ExtraArgs.D,
9017
Correction.getCorrectionDecl()->getDeclContext(),
9018
NewFD->getTypeSourceInfo(), Previous, ExtraArgs.TemplateParamLists,
9019
ExtraArgs.AddToScope);
9020
9021
if (Trap.hasErrorOccurred())
9022
Result = nullptr;
9023
}
9024
9025
if (Result) {
9026
// Determine which correction we picked.
9027
Decl *Canonical = Result->getCanonicalDecl();
9028
for (LookupResult::iterator I = Previous.begin(), E = Previous.end();
9029
I != E; ++I)
9030
if ((*I)->getCanonicalDecl() == Canonical)
9031
Correction.setCorrectionDecl(*I);
9032
9033
// Let Sema know about the correction.
9034
SemaRef.MarkTypoCorrectedFunctionDefinition(Result);
9035
SemaRef.diagnoseTypo(
9036
Correction,
9037
SemaRef.PDiag(IsLocalFriend
9038
? diag::err_no_matching_local_friend_suggest
9039
: diag::err_member_decl_does_not_match_suggest)
9040
<< Name << NewDC << IsDefinition);
9041
return Result;
9042
}
9043
9044
// Pretend the typo correction never occurred
9045
ExtraArgs.D.SetIdentifier(Name.getAsIdentifierInfo(),
9046
ExtraArgs.D.getIdentifierLoc());
9047
ExtraArgs.D.setRedeclaration(wasRedeclaration);
9048
Previous.clear();
9049
Previous.setLookupName(Name);
9050
}
9051
9052
SemaRef.Diag(NewFD->getLocation(), DiagMsg)
9053
<< Name << NewDC << IsDefinition << NewFD->getLocation();
9054
9055
bool NewFDisConst = false;
9056
if (CXXMethodDecl *NewMD = dyn_cast<CXXMethodDecl>(NewFD))
9057
NewFDisConst = NewMD->isConst();
9058
9059
for (SmallVectorImpl<std::pair<FunctionDecl *, unsigned> >::iterator
9060
NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9061
NearMatch != NearMatchEnd; ++NearMatch) {
9062
FunctionDecl *FD = NearMatch->first;
9063
CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
9064
bool FDisConst = MD && MD->isConst();
9065
bool IsMember = MD || !IsLocalFriend;
9066
9067
// FIXME: These notes are poorly worded for the local friend case.
9068
if (unsigned Idx = NearMatch->second) {
9069
ParmVarDecl *FDParam = FD->getParamDecl(Idx-1);
9070
SourceLocation Loc = FDParam->getTypeSpecStartLoc();
9071
if (Loc.isInvalid()) Loc = FD->getLocation();
9072
SemaRef.Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9073
: diag::note_local_decl_close_param_match)
9074
<< Idx << FDParam->getType()
9075
<< NewFD->getParamDecl(Idx - 1)->getType();
9076
} else if (FDisConst != NewFDisConst) {
9077
auto DB = SemaRef.Diag(FD->getLocation(),
9078
diag::note_member_def_close_const_match)
9079
<< NewFDisConst << FD->getSourceRange().getEnd();
9080
if (const auto &FTI = ExtraArgs.D.getFunctionTypeInfo(); !NewFDisConst)
9081
DB << FixItHint::CreateInsertion(FTI.getRParenLoc().getLocWithOffset(1),
9082
" const");
9083
else if (FTI.hasMethodTypeQualifiers() &&
9084
FTI.getConstQualifierLoc().isValid())
9085
DB << FixItHint::CreateRemoval(FTI.getConstQualifierLoc());
9086
} else {
9087
SemaRef.Diag(FD->getLocation(),
9088
IsMember ? diag::note_member_def_close_match
9089
: diag::note_local_decl_close_match);
9090
}
9091
}
9092
return nullptr;
9093
}
9094
9095
static StorageClass getFunctionStorageClass(Sema &SemaRef, Declarator &D) {
9096
switch (D.getDeclSpec().getStorageClassSpec()) {
9097
default: llvm_unreachable("Unknown storage class!");
9098
case DeclSpec::SCS_auto:
9099
case DeclSpec::SCS_register:
9100
case DeclSpec::SCS_mutable:
9101
SemaRef.Diag(D.getDeclSpec().getStorageClassSpecLoc(),
9102
diag::err_typecheck_sclass_func);
9103
D.getMutableDeclSpec().ClearStorageClassSpecs();
9104
D.setInvalidType();
9105
break;
9106
case DeclSpec::SCS_unspecified: break;
9107
case DeclSpec::SCS_extern:
9108
if (D.getDeclSpec().isExternInLinkageSpec())
9109
return SC_None;
9110
return SC_Extern;
9111
case DeclSpec::SCS_static: {
9112
if (SemaRef.CurContext->getRedeclContext()->isFunctionOrMethod()) {
9113
// C99 6.7.1p5:
9114
// The declaration of an identifier for a function that has
9115
// block scope shall have no explicit storage-class specifier
9116
// other than extern
9117
// See also (C++ [dcl.stc]p4).
9118
SemaRef.Diag(D.getDeclSpec().getStorageClassSpecLoc(),
9119
diag::err_static_block_func);
9120
break;
9121
} else
9122
return SC_Static;
9123
}
9124
case DeclSpec::SCS_private_extern: return SC_PrivateExtern;
9125
}
9126
9127
// No explicit storage class has already been returned
9128
return SC_None;
9129
}
9130
9131
static FunctionDecl *CreateNewFunctionDecl(Sema &SemaRef, Declarator &D,
9132
DeclContext *DC, QualType &R,
9133
TypeSourceInfo *TInfo,
9134
StorageClass SC,
9135
bool &IsVirtualOkay) {
9136
DeclarationNameInfo NameInfo = SemaRef.GetNameForDeclarator(D);
9137
DeclarationName Name = NameInfo.getName();
9138
9139
FunctionDecl *NewFD = nullptr;
9140
bool isInline = D.getDeclSpec().isInlineSpecified();
9141
9142
ConstexprSpecKind ConstexprKind = D.getDeclSpec().getConstexprSpecifier();
9143
if (ConstexprKind == ConstexprSpecKind::Constinit ||
9144
(SemaRef.getLangOpts().C23 &&
9145
ConstexprKind == ConstexprSpecKind::Constexpr)) {
9146
9147
if (SemaRef.getLangOpts().C23)
9148
SemaRef.Diag(D.getDeclSpec().getConstexprSpecLoc(),
9149
diag::err_c23_constexpr_not_variable);
9150
else
9151
SemaRef.Diag(D.getDeclSpec().getConstexprSpecLoc(),
9152
diag::err_constexpr_wrong_decl_kind)
9153
<< static_cast<int>(ConstexprKind);
9154
ConstexprKind = ConstexprSpecKind::Unspecified;
9155
D.getMutableDeclSpec().ClearConstexprSpec();
9156
}
9157
9158
if (!SemaRef.getLangOpts().CPlusPlus) {
9159
// Determine whether the function was written with a prototype. This is
9160
// true when:
9161
// - there is a prototype in the declarator, or
9162
// - the type R of the function is some kind of typedef or other non-
9163
// attributed reference to a type name (which eventually refers to a
9164
// function type). Note, we can't always look at the adjusted type to
9165
// check this case because attributes may cause a non-function
9166
// declarator to still have a function type. e.g.,
9167
// typedef void func(int a);
9168
// __attribute__((noreturn)) func other_func; // This has a prototype
9169
bool HasPrototype =
9170
(D.isFunctionDeclarator() && D.getFunctionTypeInfo().hasPrototype) ||
9171
(D.getDeclSpec().isTypeRep() &&
9172
SemaRef.GetTypeFromParser(D.getDeclSpec().getRepAsType(), nullptr)
9173
->isFunctionProtoType()) ||
9174
(!R->getAsAdjusted<FunctionType>() && R->isFunctionProtoType());
9175
assert(
9176
(HasPrototype || !SemaRef.getLangOpts().requiresStrictPrototypes()) &&
9177
"Strict prototypes are required");
9178
9179
NewFD = FunctionDecl::Create(
9180
SemaRef.Context, DC, D.getBeginLoc(), NameInfo, R, TInfo, SC,
9181
SemaRef.getCurFPFeatures().isFPConstrained(), isInline, HasPrototype,
9182
ConstexprSpecKind::Unspecified,
9183
/*TrailingRequiresClause=*/nullptr);
9184
if (D.isInvalidType())
9185
NewFD->setInvalidDecl();
9186
9187
return NewFD;
9188
}
9189
9190
ExplicitSpecifier ExplicitSpecifier = D.getDeclSpec().getExplicitSpecifier();
9191
Expr *TrailingRequiresClause = D.getTrailingRequiresClause();
9192
9193
SemaRef.CheckExplicitObjectMemberFunction(DC, D, Name, R);
9194
9195
if (Name.getNameKind() == DeclarationName::CXXConstructorName) {
9196
// This is a C++ constructor declaration.
9197
assert(DC->isRecord() &&
9198
"Constructors can only be declared in a member context");
9199
9200
R = SemaRef.CheckConstructorDeclarator(D, R, SC);
9201
return CXXConstructorDecl::Create(
9202
SemaRef.Context, cast<CXXRecordDecl>(DC), D.getBeginLoc(), NameInfo, R,
9203
TInfo, ExplicitSpecifier, SemaRef.getCurFPFeatures().isFPConstrained(),
9204
isInline, /*isImplicitlyDeclared=*/false, ConstexprKind,
9205
InheritedConstructor(), TrailingRequiresClause);
9206
9207
} else if (Name.getNameKind() == DeclarationName::CXXDestructorName) {
9208
// This is a C++ destructor declaration.
9209
if (DC->isRecord()) {
9210
R = SemaRef.CheckDestructorDeclarator(D, R, SC);
9211
CXXRecordDecl *Record = cast<CXXRecordDecl>(DC);
9212
CXXDestructorDecl *NewDD = CXXDestructorDecl::Create(
9213
SemaRef.Context, Record, D.getBeginLoc(), NameInfo, R, TInfo,
9214
SemaRef.getCurFPFeatures().isFPConstrained(), isInline,
9215
/*isImplicitlyDeclared=*/false, ConstexprKind,
9216
TrailingRequiresClause);
9217
// User defined destructors start as not selected if the class definition is still
9218
// not done.
9219
if (Record->isBeingDefined())
9220
NewDD->setIneligibleOrNotSelected(true);
9221
9222
// If the destructor needs an implicit exception specification, set it
9223
// now. FIXME: It'd be nice to be able to create the right type to start
9224
// with, but the type needs to reference the destructor declaration.
9225
if (SemaRef.getLangOpts().CPlusPlus11)
9226
SemaRef.AdjustDestructorExceptionSpec(NewDD);
9227
9228
IsVirtualOkay = true;
9229
return NewDD;
9230
9231
} else {
9232
SemaRef.Diag(D.getIdentifierLoc(), diag::err_destructor_not_member);
9233
D.setInvalidType();
9234
9235
// Create a FunctionDecl to satisfy the function definition parsing
9236
// code path.
9237
return FunctionDecl::Create(
9238
SemaRef.Context, DC, D.getBeginLoc(), D.getIdentifierLoc(), Name, R,
9239
TInfo, SC, SemaRef.getCurFPFeatures().isFPConstrained(), isInline,
9240
/*hasPrototype=*/true, ConstexprKind, TrailingRequiresClause);
9241
}
9242
9243
} else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName) {
9244
if (!DC->isRecord()) {
9245
SemaRef.Diag(D.getIdentifierLoc(),
9246
diag::err_conv_function_not_member);
9247
return nullptr;
9248
}
9249
9250
SemaRef.CheckConversionDeclarator(D, R, SC);
9251
if (D.isInvalidType())
9252
return nullptr;
9253
9254
IsVirtualOkay = true;
9255
return CXXConversionDecl::Create(
9256
SemaRef.Context, cast<CXXRecordDecl>(DC), D.getBeginLoc(), NameInfo, R,
9257
TInfo, SemaRef.getCurFPFeatures().isFPConstrained(), isInline,
9258
ExplicitSpecifier, ConstexprKind, SourceLocation(),
9259
TrailingRequiresClause);
9260
9261
} else if (Name.getNameKind() == DeclarationName::CXXDeductionGuideName) {
9262
if (TrailingRequiresClause)
9263
SemaRef.Diag(TrailingRequiresClause->getBeginLoc(),
9264
diag::err_trailing_requires_clause_on_deduction_guide)
9265
<< TrailingRequiresClause->getSourceRange();
9266
if (SemaRef.CheckDeductionGuideDeclarator(D, R, SC))
9267
return nullptr;
9268
return CXXDeductionGuideDecl::Create(SemaRef.Context, DC, D.getBeginLoc(),
9269
ExplicitSpecifier, NameInfo, R, TInfo,
9270
D.getEndLoc());
9271
} else if (DC->isRecord()) {
9272
// If the name of the function is the same as the name of the record,
9273
// then this must be an invalid constructor that has a return type.
9274
// (The parser checks for a return type and makes the declarator a
9275
// constructor if it has no return type).
9276
if (Name.getAsIdentifierInfo() &&
9277
Name.getAsIdentifierInfo() == cast<CXXRecordDecl>(DC)->getIdentifier()){
9278
SemaRef.Diag(D.getIdentifierLoc(), diag::err_constructor_return_type)
9279
<< SourceRange(D.getDeclSpec().getTypeSpecTypeLoc())
9280
<< SourceRange(D.getIdentifierLoc());
9281
return nullptr;
9282
}
9283
9284
// This is a C++ method declaration.
9285
CXXMethodDecl *Ret = CXXMethodDecl::Create(
9286
SemaRef.Context, cast<CXXRecordDecl>(DC), D.getBeginLoc(), NameInfo, R,
9287
TInfo, SC, SemaRef.getCurFPFeatures().isFPConstrained(), isInline,
9288
ConstexprKind, SourceLocation(), TrailingRequiresClause);
9289
IsVirtualOkay = !Ret->isStatic();
9290
return Ret;
9291
} else {
9292
bool isFriend =
9293
SemaRef.getLangOpts().CPlusPlus && D.getDeclSpec().isFriendSpecified();
9294
if (!isFriend && SemaRef.CurContext->isRecord())
9295
return nullptr;
9296
9297
// Determine whether the function was written with a
9298
// prototype. This true when:
9299
// - we're in C++ (where every function has a prototype),
9300
return FunctionDecl::Create(
9301
SemaRef.Context, DC, D.getBeginLoc(), NameInfo, R, TInfo, SC,
9302
SemaRef.getCurFPFeatures().isFPConstrained(), isInline,
9303
true /*HasPrototype*/, ConstexprKind, TrailingRequiresClause);
9304
}
9305
}
9306
9307
enum OpenCLParamType {
9308
ValidKernelParam,
9309
PtrPtrKernelParam,
9310
PtrKernelParam,
9311
InvalidAddrSpacePtrKernelParam,
9312
InvalidKernelParam,
9313
RecordKernelParam
9314
};
9315
9316
static bool isOpenCLSizeDependentType(ASTContext &C, QualType Ty) {
9317
// Size dependent types are just typedefs to normal integer types
9318
// (e.g. unsigned long), so we cannot distinguish them from other typedefs to
9319
// integers other than by their names.
9320
StringRef SizeTypeNames[] = {"size_t", "intptr_t", "uintptr_t", "ptrdiff_t"};
9321
9322
// Remove typedefs one by one until we reach a typedef
9323
// for a size dependent type.
9324
QualType DesugaredTy = Ty;
9325
do {
9326
ArrayRef<StringRef> Names(SizeTypeNames);
9327
auto Match = llvm::find(Names, DesugaredTy.getUnqualifiedType().getAsString());
9328
if (Names.end() != Match)
9329
return true;
9330
9331
Ty = DesugaredTy;
9332
DesugaredTy = Ty.getSingleStepDesugaredType(C);
9333
} while (DesugaredTy != Ty);
9334
9335
return false;
9336
}
9337
9338
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT) {
9339
if (PT->isDependentType())
9340
return InvalidKernelParam;
9341
9342
if (PT->isPointerType() || PT->isReferenceType()) {
9343
QualType PointeeType = PT->getPointeeType();
9344
if (PointeeType.getAddressSpace() == LangAS::opencl_generic ||
9345
PointeeType.getAddressSpace() == LangAS::opencl_private ||
9346
PointeeType.getAddressSpace() == LangAS::Default)
9347
return InvalidAddrSpacePtrKernelParam;
9348
9349
if (PointeeType->isPointerType()) {
9350
// This is a pointer to pointer parameter.
9351
// Recursively check inner type.
9352
OpenCLParamType ParamKind = getOpenCLKernelParameterType(S, PointeeType);
9353
if (ParamKind == InvalidAddrSpacePtrKernelParam ||
9354
ParamKind == InvalidKernelParam)
9355
return ParamKind;
9356
9357
// OpenCL v3.0 s6.11.a:
9358
// A restriction to pass pointers to pointers only applies to OpenCL C
9359
// v1.2 or below.
9360
if (S.getLangOpts().getOpenCLCompatibleVersion() > 120)
9361
return ValidKernelParam;
9362
9363
return PtrPtrKernelParam;
9364
}
9365
9366
// C++ for OpenCL v1.0 s2.4:
9367
// Moreover the types used in parameters of the kernel functions must be:
9368
// Standard layout types for pointer parameters. The same applies to
9369
// reference if an implementation supports them in kernel parameters.
9370
if (S.getLangOpts().OpenCLCPlusPlus &&
9371
!S.getOpenCLOptions().isAvailableOption(
9372
"__cl_clang_non_portable_kernel_param_types", S.getLangOpts())) {
9373
auto CXXRec = PointeeType.getCanonicalType()->getAsCXXRecordDecl();
9374
bool IsStandardLayoutType = true;
9375
if (CXXRec) {
9376
// If template type is not ODR-used its definition is only available
9377
// in the template definition not its instantiation.
9378
// FIXME: This logic doesn't work for types that depend on template
9379
// parameter (PR58590).
9380
if (!CXXRec->hasDefinition())
9381
CXXRec = CXXRec->getTemplateInstantiationPattern();
9382
if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9383
IsStandardLayoutType = false;
9384
}
9385
if (!PointeeType->isAtomicType() && !PointeeType->isVoidType() &&
9386
!IsStandardLayoutType)
9387
return InvalidKernelParam;
9388
}
9389
9390
// OpenCL v1.2 s6.9.p:
9391
// A restriction to pass pointers only applies to OpenCL C v1.2 or below.
9392
if (S.getLangOpts().getOpenCLCompatibleVersion() > 120)
9393
return ValidKernelParam;
9394
9395
return PtrKernelParam;
9396
}
9397
9398
// OpenCL v1.2 s6.9.k:
9399
// Arguments to kernel functions in a program cannot be declared with the
9400
// built-in scalar types bool, half, size_t, ptrdiff_t, intptr_t, and
9401
// uintptr_t or a struct and/or union that contain fields declared to be one
9402
// of these built-in scalar types.
9403
if (isOpenCLSizeDependentType(S.getASTContext(), PT))
9404
return InvalidKernelParam;
9405
9406
if (PT->isImageType())
9407
return PtrKernelParam;
9408
9409
if (PT->isBooleanType() || PT->isEventT() || PT->isReserveIDT())
9410
return InvalidKernelParam;
9411
9412
// OpenCL extension spec v1.2 s9.5:
9413
// This extension adds support for half scalar and vector types as built-in
9414
// types that can be used for arithmetic operations, conversions etc.
9415
if (!S.getOpenCLOptions().isAvailableOption("cl_khr_fp16", S.getLangOpts()) &&
9416
PT->isHalfType())
9417
return InvalidKernelParam;
9418
9419
// Look into an array argument to check if it has a forbidden type.
9420
if (PT->isArrayType()) {
9421
const Type *UnderlyingTy = PT->getPointeeOrArrayElementType();
9422
// Call ourself to check an underlying type of an array. Since the
9423
// getPointeeOrArrayElementType returns an innermost type which is not an
9424
// array, this recursive call only happens once.
9425
return getOpenCLKernelParameterType(S, QualType(UnderlyingTy, 0));
9426
}
9427
9428
// C++ for OpenCL v1.0 s2.4:
9429
// Moreover the types used in parameters of the kernel functions must be:
9430
// Trivial and standard-layout types C++17 [basic.types] (plain old data
9431
// types) for parameters passed by value;
9432
if (S.getLangOpts().OpenCLCPlusPlus &&
9433
!S.getOpenCLOptions().isAvailableOption(
9434
"__cl_clang_non_portable_kernel_param_types", S.getLangOpts()) &&
9435
!PT->isOpenCLSpecificType() && !PT.isPODType(S.Context))
9436
return InvalidKernelParam;
9437
9438
if (PT->isRecordType())
9439
return RecordKernelParam;
9440
9441
return ValidKernelParam;
9442
}
9443
9444
static void checkIsValidOpenCLKernelParameter(
9445
Sema &S,
9446
Declarator &D,
9447
ParmVarDecl *Param,
9448
llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9449
QualType PT = Param->getType();
9450
9451
// Cache the valid types we encounter to avoid rechecking structs that are
9452
// used again
9453
if (ValidTypes.count(PT.getTypePtr()))
9454
return;
9455
9456
switch (getOpenCLKernelParameterType(S, PT)) {
9457
case PtrPtrKernelParam:
9458
// OpenCL v3.0 s6.11.a:
9459
// A kernel function argument cannot be declared as a pointer to a pointer
9460
// type. [...] This restriction only applies to OpenCL C 1.2 or below.
9461
S.Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9462
D.setInvalidType();
9463
return;
9464
9465
case InvalidAddrSpacePtrKernelParam:
9466
// OpenCL v1.0 s6.5:
9467
// __kernel function arguments declared to be a pointer of a type can point
9468
// to one of the following address spaces only : __global, __local or
9469
// __constant.
9470
S.Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9471
D.setInvalidType();
9472
return;
9473
9474
// OpenCL v1.2 s6.9.k:
9475
// Arguments to kernel functions in a program cannot be declared with the
9476
// built-in scalar types bool, half, size_t, ptrdiff_t, intptr_t, and
9477
// uintptr_t or a struct and/or union that contain fields declared to be
9478
// one of these built-in scalar types.
9479
9480
case InvalidKernelParam:
9481
// OpenCL v1.2 s6.8 n:
9482
// A kernel function argument cannot be declared
9483
// of event_t type.
9484
// Do not diagnose half type since it is diagnosed as invalid argument
9485
// type for any function elsewhere.
9486
if (!PT->isHalfType()) {
9487
S.Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9488
9489
// Explain what typedefs are involved.
9490
const TypedefType *Typedef = nullptr;
9491
while ((Typedef = PT->getAs<TypedefType>())) {
9492
SourceLocation Loc = Typedef->getDecl()->getLocation();
9493
// SourceLocation may be invalid for a built-in type.
9494
if (Loc.isValid())
9495
S.Diag(Loc, diag::note_entity_declared_at) << PT;
9496
PT = Typedef->desugar();
9497
}
9498
}
9499
9500
D.setInvalidType();
9501
return;
9502
9503
case PtrKernelParam:
9504
case ValidKernelParam:
9505
ValidTypes.insert(PT.getTypePtr());
9506
return;
9507
9508
case RecordKernelParam:
9509
break;
9510
}
9511
9512
// Track nested structs we will inspect
9513
SmallVector<const Decl *, 4> VisitStack;
9514
9515
// Track where we are in the nested structs. Items will migrate from
9516
// VisitStack to HistoryStack as we do the DFS for bad field.
9517
SmallVector<const FieldDecl *, 4> HistoryStack;
9518
HistoryStack.push_back(nullptr);
9519
9520
// At this point we already handled everything except of a RecordType or
9521
// an ArrayType of a RecordType.
9522
assert((PT->isArrayType() || PT->isRecordType()) && "Unexpected type.");
9523
const RecordType *RecTy =
9524
PT->getPointeeOrArrayElementType()->getAs<RecordType>();
9525
const RecordDecl *OrigRecDecl = RecTy->getDecl();
9526
9527
VisitStack.push_back(RecTy->getDecl());
9528
assert(VisitStack.back() && "First decl null?");
9529
9530
do {
9531
const Decl *Next = VisitStack.pop_back_val();
9532
if (!Next) {
9533
assert(!HistoryStack.empty());
9534
// Found a marker, we have gone up a level
9535
if (const FieldDecl *Hist = HistoryStack.pop_back_val())
9536
ValidTypes.insert(Hist->getType().getTypePtr());
9537
9538
continue;
9539
}
9540
9541
// Adds everything except the original parameter declaration (which is not a
9542
// field itself) to the history stack.
9543
const RecordDecl *RD;
9544
if (const FieldDecl *Field = dyn_cast<FieldDecl>(Next)) {
9545
HistoryStack.push_back(Field);
9546
9547
QualType FieldTy = Field->getType();
9548
// Other field types (known to be valid or invalid) are handled while we
9549
// walk around RecordDecl::fields().
9550
assert((FieldTy->isArrayType() || FieldTy->isRecordType()) &&
9551
"Unexpected type.");
9552
const Type *FieldRecTy = FieldTy->getPointeeOrArrayElementType();
9553
9554
RD = FieldRecTy->castAs<RecordType>()->getDecl();
9555
} else {
9556
RD = cast<RecordDecl>(Next);
9557
}
9558
9559
// Add a null marker so we know when we've gone back up a level
9560
VisitStack.push_back(nullptr);
9561
9562
for (const auto *FD : RD->fields()) {
9563
QualType QT = FD->getType();
9564
9565
if (ValidTypes.count(QT.getTypePtr()))
9566
continue;
9567
9568
OpenCLParamType ParamType = getOpenCLKernelParameterType(S, QT);
9569
if (ParamType == ValidKernelParam)
9570
continue;
9571
9572
if (ParamType == RecordKernelParam) {
9573
VisitStack.push_back(FD);
9574
continue;
9575
}
9576
9577
// OpenCL v1.2 s6.9.p:
9578
// Arguments to kernel functions that are declared to be a struct or union
9579
// do not allow OpenCL objects to be passed as elements of the struct or
9580
// union. This restriction was lifted in OpenCL v2.0 with the introduction
9581
// of SVM.
9582
if (ParamType == PtrKernelParam || ParamType == PtrPtrKernelParam ||
9583
ParamType == InvalidAddrSpacePtrKernelParam) {
9584
S.Diag(Param->getLocation(),
9585
diag::err_record_with_pointers_kernel_param)
9586
<< PT->isUnionType()
9587
<< PT;
9588
} else {
9589
S.Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9590
}
9591
9592
S.Diag(OrigRecDecl->getLocation(), diag::note_within_field_of_type)
9593
<< OrigRecDecl->getDeclName();
9594
9595
// We have an error, now let's go back up through history and show where
9596
// the offending field came from
9597
for (ArrayRef<const FieldDecl *>::const_iterator
9598
I = HistoryStack.begin() + 1,
9599
E = HistoryStack.end();
9600
I != E; ++I) {
9601
const FieldDecl *OuterField = *I;
9602
S.Diag(OuterField->getLocation(), diag::note_within_field_of_type)
9603
<< OuterField->getType();
9604
}
9605
9606
S.Diag(FD->getLocation(), diag::note_illegal_field_declared_here)
9607
<< QT->isPointerType()
9608
<< QT;
9609
D.setInvalidType();
9610
return;
9611
}
9612
} while (!VisitStack.empty());
9613
}
9614
9615
/// Find the DeclContext in which a tag is implicitly declared if we see an
9616
/// elaborated type specifier in the specified context, and lookup finds
9617
/// nothing.
9618
static DeclContext *getTagInjectionContext(DeclContext *DC) {
9619
while (!DC->isFileContext() && !DC->isFunctionOrMethod())
9620
DC = DC->getParent();
9621
return DC;
9622
}
9623
9624
/// Find the Scope in which a tag is implicitly declared if we see an
9625
/// elaborated type specifier in the specified context, and lookup finds
9626
/// nothing.
9627
static Scope *getTagInjectionScope(Scope *S, const LangOptions &LangOpts) {
9628
while (S->isClassScope() ||
9629
(LangOpts.CPlusPlus &&
9630
S->isFunctionPrototypeScope()) ||
9631
((S->getFlags() & Scope::DeclScope) == 0) ||
9632
(S->getEntity() && S->getEntity()->isTransparentContext()))
9633
S = S->getParent();
9634
return S;
9635
}
9636
9637
/// Determine whether a declaration matches a known function in namespace std.
9638
static bool isStdBuiltin(ASTContext &Ctx, FunctionDecl *FD,
9639
unsigned BuiltinID) {
9640
switch (BuiltinID) {
9641
case Builtin::BI__GetExceptionInfo:
9642
// No type checking whatsoever.
9643
return Ctx.getTargetInfo().getCXXABI().isMicrosoft();
9644
9645
case Builtin::BIaddressof:
9646
case Builtin::BI__addressof:
9647
case Builtin::BIforward:
9648
case Builtin::BIforward_like:
9649
case Builtin::BImove:
9650
case Builtin::BImove_if_noexcept:
9651
case Builtin::BIas_const: {
9652
// Ensure that we don't treat the algorithm
9653
// OutputIt std::move(InputIt, InputIt, OutputIt)
9654
// as the builtin std::move.
9655
const auto *FPT = FD->getType()->castAs<FunctionProtoType>();
9656
return FPT->getNumParams() == 1 && !FPT->isVariadic();
9657
}
9658
9659
default:
9660
return false;
9661
}
9662
}
9663
9664
NamedDecl*
9665
Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
9666
TypeSourceInfo *TInfo, LookupResult &Previous,
9667
MultiTemplateParamsArg TemplateParamListsRef,
9668
bool &AddToScope) {
9669
QualType R = TInfo->getType();
9670
9671
assert(R->isFunctionType());
9672
if (R.getCanonicalType()->castAs<FunctionType>()->getCmseNSCallAttr())
9673
Diag(D.getIdentifierLoc(), diag::err_function_decl_cmse_ns_call);
9674
9675
SmallVector<TemplateParameterList *, 4> TemplateParamLists;
9676
llvm::append_range(TemplateParamLists, TemplateParamListsRef);
9677
if (TemplateParameterList *Invented = D.getInventedTemplateParameterList()) {
9678
if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
9679
Invented->getDepth() == TemplateParamLists.back()->getDepth())
9680
TemplateParamLists.back() = Invented;
9681
else
9682
TemplateParamLists.push_back(Invented);
9683
}
9684
9685
// TODO: consider using NameInfo for diagnostic.
9686
DeclarationNameInfo NameInfo = GetNameForDeclarator(D);
9687
DeclarationName Name = NameInfo.getName();
9688
StorageClass SC = getFunctionStorageClass(*this, D);
9689
9690
if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec())
9691
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
9692
diag::err_invalid_thread)
9693
<< DeclSpec::getSpecifierName(TSCS);
9694
9695
if (D.isFirstDeclarationOfMember())
9696
adjustMemberFunctionCC(
9697
R, !(D.isStaticMember() || D.isExplicitObjectMemberFunction()),
9698
D.isCtorOrDtor(), D.getIdentifierLoc());
9699
9700
bool isFriend = false;
9701
FunctionTemplateDecl *FunctionTemplate = nullptr;
9702
bool isMemberSpecialization = false;
9703
bool isFunctionTemplateSpecialization = false;
9704
9705
bool HasExplicitTemplateArgs = false;
9706
TemplateArgumentListInfo TemplateArgs;
9707
9708
bool isVirtualOkay = false;
9709
9710
DeclContext *OriginalDC = DC;
9711
bool IsLocalExternDecl = adjustContextForLocalExternDecl(DC);
9712
9713
FunctionDecl *NewFD = CreateNewFunctionDecl(*this, D, DC, R, TInfo, SC,
9714
isVirtualOkay);
9715
if (!NewFD) return nullptr;
9716
9717
if (OriginalLexicalContext && OriginalLexicalContext->isObjCContainer())
9718
NewFD->setTopLevelDeclInObjCContainer();
9719
9720
// Set the lexical context. If this is a function-scope declaration, or has a
9721
// C++ scope specifier, or is the object of a friend declaration, the lexical
9722
// context will be different from the semantic context.
9723
NewFD->setLexicalDeclContext(CurContext);
9724
9725
if (IsLocalExternDecl)
9726
NewFD->setLocalExternDecl();
9727
9728
if (getLangOpts().CPlusPlus) {
9729
// The rules for implicit inlines changed in C++20 for methods and friends
9730
// with an in-class definition (when such a definition is not attached to
9731
// the global module). User-specified 'inline' overrides this (set when
9732
// the function decl is created above).
9733
// FIXME: We need a better way to separate C++ standard and clang modules.
9734
bool ImplicitInlineCXX20 = !getLangOpts().CPlusPlusModules ||
9735
NewFD->isConstexpr() || NewFD->isConsteval() ||
9736
!NewFD->getOwningModule() ||
9737
NewFD->isFromGlobalModule() ||
9738
NewFD->getOwningModule()->isHeaderLikeModule();
9739
bool isInline = D.getDeclSpec().isInlineSpecified();
9740
bool isVirtual = D.getDeclSpec().isVirtualSpecified();
9741
bool hasExplicit = D.getDeclSpec().hasExplicitSpecifier();
9742
isFriend = D.getDeclSpec().isFriendSpecified();
9743
if (isFriend && !isInline && D.isFunctionDefinition()) {
9744
// Pre-C++20 [class.friend]p5
9745
// A function can be defined in a friend declaration of a
9746
// class . . . . Such a function is implicitly inline.
9747
// Post C++20 [class.friend]p7
9748
// Such a function is implicitly an inline function if it is attached
9749
// to the global module.
9750
NewFD->setImplicitlyInline(ImplicitInlineCXX20);
9751
}
9752
9753
// If this is a method defined in an __interface, and is not a constructor
9754
// or an overloaded operator, then set the pure flag (isVirtual will already
9755
// return true).
9756
if (const CXXRecordDecl *Parent =
9757
dyn_cast<CXXRecordDecl>(NewFD->getDeclContext())) {
9758
if (Parent->isInterface() && cast<CXXMethodDecl>(NewFD)->isUserProvided())
9759
NewFD->setIsPureVirtual(true);
9760
9761
// C++ [class.union]p2
9762
// A union can have member functions, but not virtual functions.
9763
if (isVirtual && Parent->isUnion()) {
9764
Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_in_union);
9765
NewFD->setInvalidDecl();
9766
}
9767
if ((Parent->isClass() || Parent->isStruct()) &&
9768
Parent->hasAttr<SYCLSpecialClassAttr>() &&
9769
NewFD->getKind() == Decl::Kind::CXXMethod && NewFD->getIdentifier() &&
9770
NewFD->getName() == "__init" && D.isFunctionDefinition()) {
9771
if (auto *Def = Parent->getDefinition())
9772
Def->setInitMethod(true);
9773
}
9774
}
9775
9776
SetNestedNameSpecifier(*this, NewFD, D);
9777
isMemberSpecialization = false;
9778
isFunctionTemplateSpecialization = false;
9779
if (D.isInvalidType())
9780
NewFD->setInvalidDecl();
9781
9782
// Match up the template parameter lists with the scope specifier, then
9783
// determine whether we have a template or a template specialization.
9784
bool Invalid = false;
9785
TemplateIdAnnotation *TemplateId =
9786
D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId
9787
? D.getName().TemplateId
9788
: nullptr;
9789
TemplateParameterList *TemplateParams =
9790
MatchTemplateParametersToScopeSpecifier(
9791
D.getDeclSpec().getBeginLoc(), D.getIdentifierLoc(),
9792
D.getCXXScopeSpec(), TemplateId, TemplateParamLists, isFriend,
9793
isMemberSpecialization, Invalid);
9794
if (TemplateParams) {
9795
// Check that we can declare a template here.
9796
if (CheckTemplateDeclScope(S, TemplateParams))
9797
NewFD->setInvalidDecl();
9798
9799
if (TemplateParams->size() > 0) {
9800
// This is a function template
9801
9802
// A destructor cannot be a template.
9803
if (Name.getNameKind() == DeclarationName::CXXDestructorName) {
9804
Diag(NewFD->getLocation(), diag::err_destructor_template);
9805
NewFD->setInvalidDecl();
9806
// Function template with explicit template arguments.
9807
} else if (TemplateId) {
9808
Diag(D.getIdentifierLoc(), diag::err_function_template_partial_spec)
9809
<< SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc);
9810
NewFD->setInvalidDecl();
9811
}
9812
9813
// If we're adding a template to a dependent context, we may need to
9814
// rebuilding some of the types used within the template parameter list,
9815
// now that we know what the current instantiation is.
9816
if (DC->isDependentContext()) {
9817
ContextRAII SavedContext(*this, DC);
9818
if (RebuildTemplateParamsInCurrentInstantiation(TemplateParams))
9819
Invalid = true;
9820
}
9821
9822
FunctionTemplate = FunctionTemplateDecl::Create(Context, DC,
9823
NewFD->getLocation(),
9824
Name, TemplateParams,
9825
NewFD);
9826
FunctionTemplate->setLexicalDeclContext(CurContext);
9827
NewFD->setDescribedFunctionTemplate(FunctionTemplate);
9828
9829
// For source fidelity, store the other template param lists.
9830
if (TemplateParamLists.size() > 1) {
9831
NewFD->setTemplateParameterListsInfo(Context,
9832
ArrayRef<TemplateParameterList *>(TemplateParamLists)
9833
.drop_back(1));
9834
}
9835
} else {
9836
// This is a function template specialization.
9837
isFunctionTemplateSpecialization = true;
9838
// For source fidelity, store all the template param lists.
9839
if (TemplateParamLists.size() > 0)
9840
NewFD->setTemplateParameterListsInfo(Context, TemplateParamLists);
9841
9842
// C++0x [temp.expl.spec]p20 forbids "template<> friend void foo(int);".
9843
if (isFriend) {
9844
// We want to remove the "template<>", found here.
9845
SourceRange RemoveRange = TemplateParams->getSourceRange();
9846
9847
// If we remove the template<> and the name is not a
9848
// template-id, we're actually silently creating a problem:
9849
// the friend declaration will refer to an untemplated decl,
9850
// and clearly the user wants a template specialization. So
9851
// we need to insert '<>' after the name.
9852
SourceLocation InsertLoc;
9853
if (D.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) {
9854
InsertLoc = D.getName().getSourceRange().getEnd();
9855
InsertLoc = getLocForEndOfToken(InsertLoc);
9856
}
9857
9858
Diag(D.getIdentifierLoc(), diag::err_template_spec_decl_friend)
9859
<< Name << RemoveRange
9860
<< FixItHint::CreateRemoval(RemoveRange)
9861
<< FixItHint::CreateInsertion(InsertLoc, "<>");
9862
Invalid = true;
9863
9864
// Recover by faking up an empty template argument list.
9865
HasExplicitTemplateArgs = true;
9866
TemplateArgs.setLAngleLoc(InsertLoc);
9867
TemplateArgs.setRAngleLoc(InsertLoc);
9868
}
9869
}
9870
} else {
9871
// Check that we can declare a template here.
9872
if (!TemplateParamLists.empty() && isMemberSpecialization &&
9873
CheckTemplateDeclScope(S, TemplateParamLists.back()))
9874
NewFD->setInvalidDecl();
9875
9876
// All template param lists were matched against the scope specifier:
9877
// this is NOT (an explicit specialization of) a template.
9878
if (TemplateParamLists.size() > 0)
9879
// For source fidelity, store all the template param lists.
9880
NewFD->setTemplateParameterListsInfo(Context, TemplateParamLists);
9881
9882
// "friend void foo<>(int);" is an implicit specialization decl.
9883
if (isFriend && TemplateId)
9884
isFunctionTemplateSpecialization = true;
9885
}
9886
9887
// If this is a function template specialization and the unqualified-id of
9888
// the declarator-id is a template-id, convert the template argument list
9889
// into our AST format and check for unexpanded packs.
9890
if (isFunctionTemplateSpecialization && TemplateId) {
9891
HasExplicitTemplateArgs = true;
9892
9893
TemplateArgs.setLAngleLoc(TemplateId->LAngleLoc);
9894
TemplateArgs.setRAngleLoc(TemplateId->RAngleLoc);
9895
ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
9896
TemplateId->NumArgs);
9897
translateTemplateArguments(TemplateArgsPtr, TemplateArgs);
9898
9899
// FIXME: Should we check for unexpanded packs if this was an (invalid)
9900
// declaration of a function template partial specialization? Should we
9901
// consider the unexpanded pack context to be a partial specialization?
9902
for (const TemplateArgumentLoc &ArgLoc : TemplateArgs.arguments()) {
9903
if (DiagnoseUnexpandedParameterPack(
9904
ArgLoc, isFriend ? UPPC_FriendDeclaration
9905
: UPPC_ExplicitSpecialization))
9906
NewFD->setInvalidDecl();
9907
}
9908
}
9909
9910
if (Invalid) {
9911
NewFD->setInvalidDecl();
9912
if (FunctionTemplate)
9913
FunctionTemplate->setInvalidDecl();
9914
}
9915
9916
// C++ [dcl.fct.spec]p5:
9917
// The virtual specifier shall only be used in declarations of
9918
// nonstatic class member functions that appear within a
9919
// member-specification of a class declaration; see 10.3.
9920
//
9921
if (isVirtual && !NewFD->isInvalidDecl()) {
9922
if (!isVirtualOkay) {
9923
Diag(D.getDeclSpec().getVirtualSpecLoc(),
9924
diag::err_virtual_non_function);
9925
} else if (!CurContext->isRecord()) {
9926
// 'virtual' was specified outside of the class.
9927
Diag(D.getDeclSpec().getVirtualSpecLoc(),
9928
diag::err_virtual_out_of_class)
9929
<< FixItHint::CreateRemoval(D.getDeclSpec().getVirtualSpecLoc());
9930
} else if (NewFD->getDescribedFunctionTemplate()) {
9931
// C++ [temp.mem]p3:
9932
// A member function template shall not be virtual.
9933
Diag(D.getDeclSpec().getVirtualSpecLoc(),
9934
diag::err_virtual_member_function_template)
9935
<< FixItHint::CreateRemoval(D.getDeclSpec().getVirtualSpecLoc());
9936
} else {
9937
// Okay: Add virtual to the method.
9938
NewFD->setVirtualAsWritten(true);
9939
}
9940
9941
if (getLangOpts().CPlusPlus14 &&
9942
NewFD->getReturnType()->isUndeducedType())
9943
Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_auto_fn_virtual);
9944
}
9945
9946
// C++ [dcl.fct.spec]p3:
9947
// The inline specifier shall not appear on a block scope function
9948
// declaration.
9949
if (isInline && !NewFD->isInvalidDecl()) {
9950
if (CurContext->isFunctionOrMethod()) {
9951
// 'inline' is not allowed on block scope function declaration.
9952
Diag(D.getDeclSpec().getInlineSpecLoc(),
9953
diag::err_inline_declaration_block_scope) << Name
9954
<< FixItHint::CreateRemoval(D.getDeclSpec().getInlineSpecLoc());
9955
}
9956
}
9957
9958
// C++ [dcl.fct.spec]p6:
9959
// The explicit specifier shall be used only in the declaration of a
9960
// constructor or conversion function within its class definition;
9961
// see 12.3.1 and 12.3.2.
9962
if (hasExplicit && !NewFD->isInvalidDecl() &&
9963
!isa<CXXDeductionGuideDecl>(NewFD)) {
9964
if (!CurContext->isRecord()) {
9965
// 'explicit' was specified outside of the class.
9966
Diag(D.getDeclSpec().getExplicitSpecLoc(),
9967
diag::err_explicit_out_of_class)
9968
<< FixItHint::CreateRemoval(D.getDeclSpec().getExplicitSpecRange());
9969
} else if (!isa<CXXConstructorDecl>(NewFD) &&
9970
!isa<CXXConversionDecl>(NewFD)) {
9971
// 'explicit' was specified on a function that wasn't a constructor
9972
// or conversion function.
9973
Diag(D.getDeclSpec().getExplicitSpecLoc(),
9974
diag::err_explicit_non_ctor_or_conv_function)
9975
<< FixItHint::CreateRemoval(D.getDeclSpec().getExplicitSpecRange());
9976
}
9977
}
9978
9979
ConstexprSpecKind ConstexprKind = D.getDeclSpec().getConstexprSpecifier();
9980
if (ConstexprKind != ConstexprSpecKind::Unspecified) {
9981
// C++11 [dcl.constexpr]p2: constexpr functions and constexpr constructors
9982
// are implicitly inline.
9983
NewFD->setImplicitlyInline();
9984
9985
// C++11 [dcl.constexpr]p3: functions declared constexpr are required to
9986
// be either constructors or to return a literal type. Therefore,
9987
// destructors cannot be declared constexpr.
9988
if (isa<CXXDestructorDecl>(NewFD) &&
9989
(!getLangOpts().CPlusPlus20 ||
9990
ConstexprKind == ConstexprSpecKind::Consteval)) {
9991
Diag(D.getDeclSpec().getConstexprSpecLoc(), diag::err_constexpr_dtor)
9992
<< static_cast<int>(ConstexprKind);
9993
NewFD->setConstexprKind(getLangOpts().CPlusPlus20
9994
? ConstexprSpecKind::Unspecified
9995
: ConstexprSpecKind::Constexpr);
9996
}
9997
// C++20 [dcl.constexpr]p2: An allocation function, or a
9998
// deallocation function shall not be declared with the consteval
9999
// specifier.
10000
if (ConstexprKind == ConstexprSpecKind::Consteval &&
10001
(NewFD->getOverloadedOperator() == OO_New ||
10002
NewFD->getOverloadedOperator() == OO_Array_New ||
10003
NewFD->getOverloadedOperator() == OO_Delete ||
10004
NewFD->getOverloadedOperator() == OO_Array_Delete)) {
10005
Diag(D.getDeclSpec().getConstexprSpecLoc(),
10006
diag::err_invalid_consteval_decl_kind)
10007
<< NewFD;
10008
NewFD->setConstexprKind(ConstexprSpecKind::Constexpr);
10009
}
10010
}
10011
10012
// If __module_private__ was specified, mark the function accordingly.
10013
if (D.getDeclSpec().isModulePrivateSpecified()) {
10014
if (isFunctionTemplateSpecialization) {
10015
SourceLocation ModulePrivateLoc
10016
= D.getDeclSpec().getModulePrivateSpecLoc();
10017
Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10018
<< 0
10019
<< FixItHint::CreateRemoval(ModulePrivateLoc);
10020
} else {
10021
NewFD->setModulePrivate();
10022
if (FunctionTemplate)
10023
FunctionTemplate->setModulePrivate();
10024
}
10025
}
10026
10027
if (isFriend) {
10028
if (FunctionTemplate) {
10029
FunctionTemplate->setObjectOfFriendDecl();
10030
FunctionTemplate->setAccess(AS_public);
10031
}
10032
NewFD->setObjectOfFriendDecl();
10033
NewFD->setAccess(AS_public);
10034
}
10035
10036
// If a function is defined as defaulted or deleted, mark it as such now.
10037
// We'll do the relevant checks on defaulted / deleted functions later.
10038
switch (D.getFunctionDefinitionKind()) {
10039
case FunctionDefinitionKind::Declaration:
10040
case FunctionDefinitionKind::Definition:
10041
break;
10042
10043
case FunctionDefinitionKind::Defaulted:
10044
NewFD->setDefaulted();
10045
break;
10046
10047
case FunctionDefinitionKind::Deleted:
10048
NewFD->setDeletedAsWritten();
10049
break;
10050
}
10051
10052
if (isa<CXXMethodDecl>(NewFD) && DC == CurContext &&
10053
D.isFunctionDefinition() && !isInline) {
10054
// Pre C++20 [class.mfct]p2:
10055
// A member function may be defined (8.4) in its class definition, in
10056
// which case it is an inline member function (7.1.2)
10057
// Post C++20 [class.mfct]p1:
10058
// If a member function is attached to the global module and is defined
10059
// in its class definition, it is inline.
10060
NewFD->setImplicitlyInline(ImplicitInlineCXX20);
10061
}
10062
10063
if (!isFriend && SC != SC_None) {
10064
// C++ [temp.expl.spec]p2:
10065
// The declaration in an explicit-specialization shall not be an
10066
// export-declaration. An explicit specialization shall not use a
10067
// storage-class-specifier other than thread_local.
10068
//
10069
// We diagnose friend declarations with storage-class-specifiers
10070
// elsewhere.
10071
if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10072
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
10073
diag::ext_explicit_specialization_storage_class)
10074
<< FixItHint::CreateRemoval(
10075
D.getDeclSpec().getStorageClassSpecLoc());
10076
}
10077
10078
if (SC == SC_Static && !CurContext->isRecord() && DC->isRecord()) {
10079
assert(isa<CXXMethodDecl>(NewFD) &&
10080
"Out-of-line member function should be a CXXMethodDecl");
10081
// C++ [class.static]p1:
10082
// A data or function member of a class may be declared static
10083
// in a class definition, in which case it is a static member of
10084
// the class.
10085
10086
// Complain about the 'static' specifier if it's on an out-of-line
10087
// member function definition.
10088
10089
// MSVC permits the use of a 'static' storage specifier on an
10090
// out-of-line member function template declaration and class member
10091
// template declaration (MSVC versions before 2015), warn about this.
10092
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
10093
((!getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015) &&
10094
cast<CXXRecordDecl>(DC)->getDescribedClassTemplate()) ||
10095
(getLangOpts().MSVCCompat &&
10096
NewFD->getDescribedFunctionTemplate()))
10097
? diag::ext_static_out_of_line
10098
: diag::err_static_out_of_line)
10099
<< FixItHint::CreateRemoval(
10100
D.getDeclSpec().getStorageClassSpecLoc());
10101
}
10102
}
10103
10104
// C++11 [except.spec]p15:
10105
// A deallocation function with no exception-specification is treated
10106
// as if it were specified with noexcept(true).
10107
const FunctionProtoType *FPT = R->getAs<FunctionProtoType>();
10108
if ((Name.getCXXOverloadedOperator() == OO_Delete ||
10109
Name.getCXXOverloadedOperator() == OO_Array_Delete) &&
10110
getLangOpts().CPlusPlus11 && FPT && !FPT->hasExceptionSpec())
10111
NewFD->setType(Context.getFunctionType(
10112
FPT->getReturnType(), FPT->getParamTypes(),
10113
FPT->getExtProtoInfo().withExceptionSpec(EST_BasicNoexcept)));
10114
10115
// C++20 [dcl.inline]/7
10116
// If an inline function or variable that is attached to a named module
10117
// is declared in a definition domain, it shall be defined in that
10118
// domain.
10119
// So, if the current declaration does not have a definition, we must
10120
// check at the end of the TU (or when the PMF starts) to see that we
10121
// have a definition at that point.
10122
if (isInline && !D.isFunctionDefinition() && getLangOpts().CPlusPlus20 &&
10123
NewFD->isInNamedModule()) {
10124
PendingInlineFuncDecls.insert(NewFD);
10125
}
10126
}
10127
10128
// Filter out previous declarations that don't match the scope.
10129
FilterLookupForScope(Previous, OriginalDC, S, shouldConsiderLinkage(NewFD),
10130
D.getCXXScopeSpec().isNotEmpty() ||
10131
isMemberSpecialization ||
10132
isFunctionTemplateSpecialization);
10133
10134
// Handle GNU asm-label extension (encoded as an attribute).
10135
if (Expr *E = (Expr*) D.getAsmLabel()) {
10136
// The parser guarantees this is a string.
10137
StringLiteral *SE = cast<StringLiteral>(E);
10138
NewFD->addAttr(AsmLabelAttr::Create(Context, SE->getString(),
10139
/*IsLiteralLabel=*/true,
10140
SE->getStrTokenLoc(0)));
10141
} else if (!ExtnameUndeclaredIdentifiers.empty()) {
10142
llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
10143
ExtnameUndeclaredIdentifiers.find(NewFD->getIdentifier());
10144
if (I != ExtnameUndeclaredIdentifiers.end()) {
10145
if (isDeclExternC(NewFD)) {
10146
NewFD->addAttr(I->second);
10147
ExtnameUndeclaredIdentifiers.erase(I);
10148
} else
10149
Diag(NewFD->getLocation(), diag::warn_redefine_extname_not_applied)
10150
<< /*Variable*/0 << NewFD;
10151
}
10152
}
10153
10154
// Copy the parameter declarations from the declarator D to the function
10155
// declaration NewFD, if they are available. First scavenge them into Params.
10156
SmallVector<ParmVarDecl*, 16> Params;
10157
unsigned FTIIdx;
10158
if (D.isFunctionDeclarator(FTIIdx)) {
10159
DeclaratorChunk::FunctionTypeInfo &FTI = D.getTypeObject(FTIIdx).Fun;
10160
10161
// Check for C99 6.7.5.3p10 - foo(void) is a non-varargs
10162
// function that takes no arguments, not a function that takes a
10163
// single void argument.
10164
// We let through "const void" here because Sema::GetTypeForDeclarator
10165
// already checks for that case.
10166
if (FTIHasNonVoidParameters(FTI) && FTI.Params[0].Param) {
10167
for (unsigned i = 0, e = FTI.NumParams; i != e; ++i) {
10168
ParmVarDecl *Param = cast<ParmVarDecl>(FTI.Params[i].Param);
10169
assert(Param->getDeclContext() != NewFD && "Was set before ?");
10170
Param->setDeclContext(NewFD);
10171
Params.push_back(Param);
10172
10173
if (Param->isInvalidDecl())
10174
NewFD->setInvalidDecl();
10175
}
10176
}
10177
10178
if (!getLangOpts().CPlusPlus) {
10179
// In C, find all the tag declarations from the prototype and move them
10180
// into the function DeclContext. Remove them from the surrounding tag
10181
// injection context of the function, which is typically but not always
10182
// the TU.
10183
DeclContext *PrototypeTagContext =
10184
getTagInjectionContext(NewFD->getLexicalDeclContext());
10185
for (NamedDecl *NonParmDecl : FTI.getDeclsInPrototype()) {
10186
auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10187
10188
// We don't want to reparent enumerators. Look at their parent enum
10189
// instead.
10190
if (!TD) {
10191
if (auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10192
TD = cast<EnumDecl>(ECD->getDeclContext());
10193
}
10194
if (!TD)
10195
continue;
10196
DeclContext *TagDC = TD->getLexicalDeclContext();
10197
if (!TagDC->containsDecl(TD))
10198
continue;
10199
TagDC->removeDecl(TD);
10200
TD->setDeclContext(NewFD);
10201
NewFD->addDecl(TD);
10202
10203
// Preserve the lexical DeclContext if it is not the surrounding tag
10204
// injection context of the FD. In this example, the semantic context of
10205
// E will be f and the lexical context will be S, while both the
10206
// semantic and lexical contexts of S will be f:
10207
// void f(struct S { enum E { a } f; } s);
10208
if (TagDC != PrototypeTagContext)
10209
TD->setLexicalDeclContext(TagDC);
10210
}
10211
}
10212
} else if (const FunctionProtoType *FT = R->getAs<FunctionProtoType>()) {
10213
// When we're declaring a function with a typedef, typeof, etc as in the
10214
// following example, we'll need to synthesize (unnamed)
10215
// parameters for use in the declaration.
10216
//
10217
// @code
10218
// typedef void fn(int);
10219
// fn f;
10220
// @endcode
10221
10222
// Synthesize a parameter for each argument type.
10223
for (const auto &AI : FT->param_types()) {
10224
ParmVarDecl *Param =
10225
BuildParmVarDeclForTypedef(NewFD, D.getIdentifierLoc(), AI);
10226
Param->setScopeInfo(0, Params.size());
10227
Params.push_back(Param);
10228
}
10229
} else {
10230
assert(R->isFunctionNoProtoType() && NewFD->getNumParams() == 0 &&
10231
"Should not need args for typedef of non-prototype fn");
10232
}
10233
10234
// Finally, we know we have the right number of parameters, install them.
10235
NewFD->setParams(Params);
10236
10237
if (D.getDeclSpec().isNoreturnSpecified())
10238
NewFD->addAttr(
10239
C11NoReturnAttr::Create(Context, D.getDeclSpec().getNoreturnSpecLoc()));
10240
10241
// Functions returning a variably modified type violate C99 6.7.5.2p2
10242
// because all functions have linkage.
10243
if (!NewFD->isInvalidDecl() &&
10244
NewFD->getReturnType()->isVariablyModifiedType()) {
10245
Diag(NewFD->getLocation(), diag::err_vm_func_decl);
10246
NewFD->setInvalidDecl();
10247
}
10248
10249
// Apply an implicit SectionAttr if '#pragma clang section text' is active
10250
if (PragmaClangTextSection.Valid && D.isFunctionDefinition() &&
10251
!NewFD->hasAttr<SectionAttr>())
10252
NewFD->addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10253
Context, PragmaClangTextSection.SectionName,
10254
PragmaClangTextSection.PragmaLocation));
10255
10256
// Apply an implicit SectionAttr if #pragma code_seg is active.
10257
if (CodeSegStack.CurrentValue && D.isFunctionDefinition() &&
10258
!NewFD->hasAttr<SectionAttr>()) {
10259
NewFD->addAttr(SectionAttr::CreateImplicit(
10260
Context, CodeSegStack.CurrentValue->getString(),
10261
CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10262
if (UnifySection(CodeSegStack.CurrentValue->getString(),
10263
ASTContext::PSF_Implicit | ASTContext::PSF_Execute |
10264
ASTContext::PSF_Read,
10265
NewFD))
10266
NewFD->dropAttr<SectionAttr>();
10267
}
10268
10269
// Apply an implicit StrictGuardStackCheckAttr if #pragma strict_gs_check is
10270
// active.
10271
if (StrictGuardStackCheckStack.CurrentValue && D.isFunctionDefinition() &&
10272
!NewFD->hasAttr<StrictGuardStackCheckAttr>())
10273
NewFD->addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10274
Context, PragmaClangTextSection.PragmaLocation));
10275
10276
// Apply an implicit CodeSegAttr from class declspec or
10277
// apply an implicit SectionAttr from #pragma code_seg if active.
10278
if (!NewFD->hasAttr<CodeSegAttr>()) {
10279
if (Attr *SAttr = getImplicitCodeSegOrSectionAttrForFunction(NewFD,
10280
D.isFunctionDefinition())) {
10281
NewFD->addAttr(SAttr);
10282
}
10283
}
10284
10285
// Handle attributes.
10286
ProcessDeclAttributes(S, NewFD, D);
10287
const auto *NewTVA = NewFD->getAttr<TargetVersionAttr>();
10288
if (NewTVA && !NewTVA->isDefaultVersion() &&
10289
!Context.getTargetInfo().hasFeature("fmv")) {
10290
// Don't add to scope fmv functions declarations if fmv disabled
10291
AddToScope = false;
10292
return NewFD;
10293
}
10294
10295
if (getLangOpts().OpenCL || getLangOpts().HLSL) {
10296
// Neither OpenCL nor HLSL allow an address space qualifyer on a return
10297
// type.
10298
//
10299
// OpenCL v1.1 s6.5: Using an address space qualifier in a function return
10300
// type declaration will generate a compilation error.
10301
LangAS AddressSpace = NewFD->getReturnType().getAddressSpace();
10302
if (AddressSpace != LangAS::Default) {
10303
Diag(NewFD->getLocation(), diag::err_return_value_with_address_space);
10304
NewFD->setInvalidDecl();
10305
}
10306
}
10307
10308
if (!getLangOpts().CPlusPlus) {
10309
// Perform semantic checking on the function declaration.
10310
if (!NewFD->isInvalidDecl() && NewFD->isMain())
10311
CheckMain(NewFD, D.getDeclSpec());
10312
10313
if (!NewFD->isInvalidDecl() && NewFD->isMSVCRTEntryPoint())
10314
CheckMSVCRTEntryPoint(NewFD);
10315
10316
if (!NewFD->isInvalidDecl())
10317
D.setRedeclaration(CheckFunctionDeclaration(S, NewFD, Previous,
10318
isMemberSpecialization,
10319
D.isFunctionDefinition()));
10320
else if (!Previous.empty())
10321
// Recover gracefully from an invalid redeclaration.
10322
D.setRedeclaration(true);
10323
assert((NewFD->isInvalidDecl() || !D.isRedeclaration() ||
10324
Previous.getResultKind() != LookupResult::FoundOverloaded) &&
10325
"previous declaration set still overloaded");
10326
10327
// Diagnose no-prototype function declarations with calling conventions that
10328
// don't support variadic calls. Only do this in C and do it after merging
10329
// possibly prototyped redeclarations.
10330
const FunctionType *FT = NewFD->getType()->castAs<FunctionType>();
10331
if (isa<FunctionNoProtoType>(FT) && !D.isFunctionDefinition()) {
10332
CallingConv CC = FT->getExtInfo().getCC();
10333
if (!supportsVariadicCall(CC)) {
10334
// Windows system headers sometimes accidentally use stdcall without
10335
// (void) parameters, so we relax this to a warning.
10336
int DiagID =
10337
CC == CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10338
Diag(NewFD->getLocation(), DiagID)
10339
<< FunctionType::getNameForCallConv(CC);
10340
}
10341
}
10342
10343
if (NewFD->getReturnType().hasNonTrivialToPrimitiveDestructCUnion() ||
10344
NewFD->getReturnType().hasNonTrivialToPrimitiveCopyCUnion())
10345
checkNonTrivialCUnion(NewFD->getReturnType(),
10346
NewFD->getReturnTypeSourceRange().getBegin(),
10347
NTCUC_FunctionReturn, NTCUK_Destruct|NTCUK_Copy);
10348
} else {
10349
// C++11 [replacement.functions]p3:
10350
// The program's definitions shall not be specified as inline.
10351
//
10352
// N.B. We diagnose declarations instead of definitions per LWG issue 2340.
10353
//
10354
// Suppress the diagnostic if the function is __attribute__((used)), since
10355
// that forces an external definition to be emitted.
10356
if (D.getDeclSpec().isInlineSpecified() &&
10357
NewFD->isReplaceableGlobalAllocationFunction() &&
10358
!NewFD->hasAttr<UsedAttr>())
10359
Diag(D.getDeclSpec().getInlineSpecLoc(),
10360
diag::ext_operator_new_delete_declared_inline)
10361
<< NewFD->getDeclName();
10362
10363
if (Expr *TRC = NewFD->getTrailingRequiresClause()) {
10364
// C++20 [dcl.decl.general]p4:
10365
// The optional requires-clause in an init-declarator or
10366
// member-declarator shall be present only if the declarator declares a
10367
// templated function.
10368
//
10369
// C++20 [temp.pre]p8:
10370
// An entity is templated if it is
10371
// - a template,
10372
// - an entity defined or created in a templated entity,
10373
// - a member of a templated entity,
10374
// - an enumerator for an enumeration that is a templated entity, or
10375
// - the closure type of a lambda-expression appearing in the
10376
// declaration of a templated entity.
10377
//
10378
// [Note 6: A local class, a local or block variable, or a friend
10379
// function defined in a templated entity is a templated entity.
10380
// — end note]
10381
//
10382
// A templated function is a function template or a function that is
10383
// templated. A templated class is a class template or a class that is
10384
// templated. A templated variable is a variable template or a variable
10385
// that is templated.
10386
if (!FunctionTemplate) {
10387
if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10388
// C++ [temp.expl.spec]p8 (proposed resolution for CWG2847):
10389
// An explicit specialization shall not have a trailing
10390
// requires-clause unless it declares a function template.
10391
//
10392
// Since a friend function template specialization cannot be
10393
// definition, and since a non-template friend declaration with a
10394
// trailing requires-clause must be a definition, we diagnose
10395
// friend function template specializations with trailing
10396
// requires-clauses on the same path as explicit specializations
10397
// even though they aren't necessarily prohibited by the same
10398
// language rule.
10399
Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10400
<< isFriend;
10401
} else if (isFriend && NewFD->isTemplated() &&
10402
!D.isFunctionDefinition()) {
10403
// C++ [temp.friend]p9:
10404
// A non-template friend declaration with a requires-clause shall be
10405
// a definition.
10406
Diag(NewFD->getBeginLoc(),
10407
diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10408
NewFD->setInvalidDecl();
10409
} else if (!NewFD->isTemplated() ||
10410
!(isa<CXXMethodDecl>(NewFD) || D.isFunctionDefinition())) {
10411
Diag(TRC->getBeginLoc(),
10412
diag::err_constrained_non_templated_function);
10413
}
10414
}
10415
}
10416
10417
// We do not add HD attributes to specializations here because
10418
// they may have different constexpr-ness compared to their
10419
// templates and, after maybeAddHostDeviceAttrs() is applied,
10420
// may end up with different effective targets. Instead, a
10421
// specialization inherits its target attributes from its template
10422
// in the CheckFunctionTemplateSpecialization() call below.
10423
if (getLangOpts().CUDA && !isFunctionTemplateSpecialization)
10424
CUDA().maybeAddHostDeviceAttrs(NewFD, Previous);
10425
10426
// Handle explicit specializations of function templates
10427
// and friend function declarations with an explicit
10428
// template argument list.
10429
if (isFunctionTemplateSpecialization) {
10430
bool isDependentSpecialization = false;
10431
if (isFriend) {
10432
// For friend function specializations, this is a dependent
10433
// specialization if its semantic context is dependent, its
10434
// type is dependent, or if its template-id is dependent.
10435
isDependentSpecialization =
10436
DC->isDependentContext() || NewFD->getType()->isDependentType() ||
10437
(HasExplicitTemplateArgs &&
10438
TemplateSpecializationType::
10439
anyInstantiationDependentTemplateArguments(
10440
TemplateArgs.arguments()));
10441
assert((!isDependentSpecialization ||
10442
(HasExplicitTemplateArgs == isDependentSpecialization)) &&
10443
"dependent friend function specialization without template "
10444
"args");
10445
} else {
10446
// For class-scope explicit specializations of function templates,
10447
// if the lexical context is dependent, then the specialization
10448
// is dependent.
10449
isDependentSpecialization =
10450
CurContext->isRecord() && CurContext->isDependentContext();
10451
}
10452
10453
TemplateArgumentListInfo *ExplicitTemplateArgs =
10454
HasExplicitTemplateArgs ? &TemplateArgs : nullptr;
10455
if (isDependentSpecialization) {
10456
// If it's a dependent specialization, it may not be possible
10457
// to determine the primary template (for explicit specializations)
10458
// or befriended declaration (for friends) until the enclosing
10459
// template is instantiated. In such cases, we store the declarations
10460
// found by name lookup and defer resolution until instantiation.
10461
if (CheckDependentFunctionTemplateSpecialization(
10462
NewFD, ExplicitTemplateArgs, Previous))
10463
NewFD->setInvalidDecl();
10464
} else if (!NewFD->isInvalidDecl()) {
10465
if (CheckFunctionTemplateSpecialization(NewFD, ExplicitTemplateArgs,
10466
Previous))
10467
NewFD->setInvalidDecl();
10468
}
10469
} else if (isMemberSpecialization && isa<CXXMethodDecl>(NewFD)) {
10470
if (CheckMemberSpecialization(NewFD, Previous))
10471
NewFD->setInvalidDecl();
10472
}
10473
10474
// Perform semantic checking on the function declaration.
10475
if (!NewFD->isInvalidDecl() && NewFD->isMain())
10476
CheckMain(NewFD, D.getDeclSpec());
10477
10478
if (!NewFD->isInvalidDecl() && NewFD->isMSVCRTEntryPoint())
10479
CheckMSVCRTEntryPoint(NewFD);
10480
10481
if (!NewFD->isInvalidDecl())
10482
D.setRedeclaration(CheckFunctionDeclaration(S, NewFD, Previous,
10483
isMemberSpecialization,
10484
D.isFunctionDefinition()));
10485
else if (!Previous.empty())
10486
// Recover gracefully from an invalid redeclaration.
10487
D.setRedeclaration(true);
10488
10489
assert((NewFD->isInvalidDecl() || NewFD->isMultiVersion() ||
10490
!D.isRedeclaration() ||
10491
Previous.getResultKind() != LookupResult::FoundOverloaded) &&
10492
"previous declaration set still overloaded");
10493
10494
NamedDecl *PrincipalDecl = (FunctionTemplate
10495
? cast<NamedDecl>(FunctionTemplate)
10496
: NewFD);
10497
10498
if (isFriend && NewFD->getPreviousDecl()) {
10499
AccessSpecifier Access = AS_public;
10500
if (!NewFD->isInvalidDecl())
10501
Access = NewFD->getPreviousDecl()->getAccess();
10502
10503
NewFD->setAccess(Access);
10504
if (FunctionTemplate) FunctionTemplate->setAccess(Access);
10505
}
10506
10507
if (NewFD->isOverloadedOperator() && !DC->isRecord() &&
10508
PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
10509
PrincipalDecl->setNonMemberOperator();
10510
10511
// If we have a function template, check the template parameter
10512
// list. This will check and merge default template arguments.
10513
if (FunctionTemplate) {
10514
FunctionTemplateDecl *PrevTemplate =
10515
FunctionTemplate->getPreviousDecl();
10516
CheckTemplateParameterList(FunctionTemplate->getTemplateParameters(),
10517
PrevTemplate ? PrevTemplate->getTemplateParameters()
10518
: nullptr,
10519
D.getDeclSpec().isFriendSpecified()
10520
? (D.isFunctionDefinition()
10521
? TPC_FriendFunctionTemplateDefinition
10522
: TPC_FriendFunctionTemplate)
10523
: (D.getCXXScopeSpec().isSet() &&
10524
DC && DC->isRecord() &&
10525
DC->isDependentContext())
10526
? TPC_ClassTemplateMember
10527
: TPC_FunctionTemplate);
10528
}
10529
10530
if (NewFD->isInvalidDecl()) {
10531
// Ignore all the rest of this.
10532
} else if (!D.isRedeclaration()) {
10533
struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
10534
AddToScope };
10535
// Fake up an access specifier if it's supposed to be a class member.
10536
if (isa<CXXRecordDecl>(NewFD->getDeclContext()))
10537
NewFD->setAccess(AS_public);
10538
10539
// Qualified decls generally require a previous declaration.
10540
if (D.getCXXScopeSpec().isSet()) {
10541
// ...with the major exception of templated-scope or
10542
// dependent-scope friend declarations.
10543
10544
// TODO: we currently also suppress this check in dependent
10545
// contexts because (1) the parameter depth will be off when
10546
// matching friend templates and (2) we might actually be
10547
// selecting a friend based on a dependent factor. But there
10548
// are situations where these conditions don't apply and we
10549
// can actually do this check immediately.
10550
//
10551
// Unless the scope is dependent, it's always an error if qualified
10552
// redeclaration lookup found nothing at all. Diagnose that now;
10553
// nothing will diagnose that error later.
10554
if (isFriend &&
10555
(D.getCXXScopeSpec().getScopeRep()->isDependent() ||
10556
(!Previous.empty() && CurContext->isDependentContext()))) {
10557
// ignore these
10558
} else if (NewFD->isCPUDispatchMultiVersion() ||
10559
NewFD->isCPUSpecificMultiVersion()) {
10560
// ignore this, we allow the redeclaration behavior here to create new
10561
// versions of the function.
10562
} else {
10563
// The user tried to provide an out-of-line definition for a
10564
// function that is a member of a class or namespace, but there
10565
// was no such member function declared (C++ [class.mfct]p2,
10566
// C++ [namespace.memdef]p2). For example:
10567
//
10568
// class X {
10569
// void f() const;
10570
// };
10571
//
10572
// void X::f() { } // ill-formed
10573
//
10574
// Complain about this problem, and attempt to suggest close
10575
// matches (e.g., those that differ only in cv-qualifiers and
10576
// whether the parameter types are references).
10577
10578
if (NamedDecl *Result = DiagnoseInvalidRedeclaration(
10579
*this, Previous, NewFD, ExtraArgs, false, nullptr)) {
10580
AddToScope = ExtraArgs.AddToScope;
10581
return Result;
10582
}
10583
}
10584
10585
// Unqualified local friend declarations are required to resolve
10586
// to something.
10587
} else if (isFriend && cast<CXXRecordDecl>(CurContext)->isLocalClass()) {
10588
if (NamedDecl *Result = DiagnoseInvalidRedeclaration(
10589
*this, Previous, NewFD, ExtraArgs, true, S)) {
10590
AddToScope = ExtraArgs.AddToScope;
10591
return Result;
10592
}
10593
}
10594
} else if (!D.isFunctionDefinition() &&
10595
isa<CXXMethodDecl>(NewFD) && NewFD->isOutOfLine() &&
10596
!isFriend && !isFunctionTemplateSpecialization &&
10597
!isMemberSpecialization) {
10598
// An out-of-line member function declaration must also be a
10599
// definition (C++ [class.mfct]p2).
10600
// Note that this is not the case for explicit specializations of
10601
// function templates or member functions of class templates, per
10602
// C++ [temp.expl.spec]p2. We also allow these declarations as an
10603
// extension for compatibility with old SWIG code which likes to
10604
// generate them.
10605
Diag(NewFD->getLocation(), diag::ext_out_of_line_declaration)
10606
<< D.getCXXScopeSpec().getRange();
10607
}
10608
}
10609
10610
if (getLangOpts().HLSL && D.isFunctionDefinition()) {
10611
// Any top level function could potentially be specified as an entry.
10612
if (!NewFD->isInvalidDecl() && S->getDepth() == 0 && Name.isIdentifier())
10613
HLSL().ActOnTopLevelFunction(NewFD);
10614
10615
if (NewFD->hasAttr<HLSLShaderAttr>())
10616
HLSL().CheckEntryPoint(NewFD);
10617
}
10618
10619
// If this is the first declaration of a library builtin function, add
10620
// attributes as appropriate.
10621
if (!D.isRedeclaration()) {
10622
if (IdentifierInfo *II = Previous.getLookupName().getAsIdentifierInfo()) {
10623
if (unsigned BuiltinID = II->getBuiltinID()) {
10624
bool InStdNamespace = Context.BuiltinInfo.isInStdNamespace(BuiltinID);
10625
if (!InStdNamespace &&
10626
NewFD->getDeclContext()->getRedeclContext()->isFileContext()) {
10627
if (NewFD->getLanguageLinkage() == CLanguageLinkage) {
10628
// Validate the type matches unless this builtin is specified as
10629
// matching regardless of its declared type.
10630
if (Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
10631
NewFD->addAttr(BuiltinAttr::CreateImplicit(Context, BuiltinID));
10632
} else {
10633
ASTContext::GetBuiltinTypeError Error;
10634
LookupNecessaryTypesForBuiltin(S, BuiltinID);
10635
QualType BuiltinType = Context.GetBuiltinType(BuiltinID, Error);
10636
10637
if (!Error && !BuiltinType.isNull() &&
10638
Context.hasSameFunctionTypeIgnoringExceptionSpec(
10639
NewFD->getType(), BuiltinType))
10640
NewFD->addAttr(BuiltinAttr::CreateImplicit(Context, BuiltinID));
10641
}
10642
}
10643
} else if (InStdNamespace && NewFD->isInStdNamespace() &&
10644
isStdBuiltin(Context, NewFD, BuiltinID)) {
10645
NewFD->addAttr(BuiltinAttr::CreateImplicit(Context, BuiltinID));
10646
}
10647
}
10648
}
10649
}
10650
10651
ProcessPragmaWeak(S, NewFD);
10652
checkAttributesAfterMerging(*this, *NewFD);
10653
10654
AddKnownFunctionAttributes(NewFD);
10655
10656
if (NewFD->hasAttr<OverloadableAttr>() &&
10657
!NewFD->getType()->getAs<FunctionProtoType>()) {
10658
Diag(NewFD->getLocation(),
10659
diag::err_attribute_overloadable_no_prototype)
10660
<< NewFD;
10661
NewFD->dropAttr<OverloadableAttr>();
10662
}
10663
10664
// If there's a #pragma GCC visibility in scope, and this isn't a class
10665
// member, set the visibility of this function.
10666
if (!DC->isRecord() && NewFD->isExternallyVisible())
10667
AddPushedVisibilityAttribute(NewFD);
10668
10669
// If there's a #pragma clang arc_cf_code_audited in scope, consider
10670
// marking the function.
10671
ObjC().AddCFAuditedAttribute(NewFD);
10672
10673
// If this is a function definition, check if we have to apply any
10674
// attributes (i.e. optnone and no_builtin) due to a pragma.
10675
if (D.isFunctionDefinition()) {
10676
AddRangeBasedOptnone(NewFD);
10677
AddImplicitMSFunctionNoBuiltinAttr(NewFD);
10678
AddSectionMSAllocText(NewFD);
10679
ModifyFnAttributesMSPragmaOptimize(NewFD);
10680
}
10681
10682
// If this is the first declaration of an extern C variable, update
10683
// the map of such variables.
10684
if (NewFD->isFirstDecl() && !NewFD->isInvalidDecl() &&
10685
isIncompleteDeclExternC(*this, NewFD))
10686
RegisterLocallyScopedExternCDecl(NewFD, S);
10687
10688
// Set this FunctionDecl's range up to the right paren.
10689
NewFD->setRangeEnd(D.getSourceRange().getEnd());
10690
10691
if (D.isRedeclaration() && !Previous.empty()) {
10692
NamedDecl *Prev = Previous.getRepresentativeDecl();
10693
checkDLLAttributeRedeclaration(*this, Prev, NewFD,
10694
isMemberSpecialization ||
10695
isFunctionTemplateSpecialization,
10696
D.isFunctionDefinition());
10697
}
10698
10699
if (getLangOpts().CUDA) {
10700
IdentifierInfo *II = NewFD->getIdentifier();
10701
if (II && II->isStr(CUDA().getConfigureFuncName()) &&
10702
!NewFD->isInvalidDecl() &&
10703
NewFD->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
10704
if (!R->castAs<FunctionType>()->getReturnType()->isScalarType())
10705
Diag(NewFD->getLocation(), diag::err_config_scalar_return)
10706
<< CUDA().getConfigureFuncName();
10707
Context.setcudaConfigureCallDecl(NewFD);
10708
}
10709
10710
// Variadic functions, other than a *declaration* of printf, are not allowed
10711
// in device-side CUDA code, unless someone passed
10712
// -fcuda-allow-variadic-functions.
10713
if (!getLangOpts().CUDAAllowVariadicFunctions && NewFD->isVariadic() &&
10714
(NewFD->hasAttr<CUDADeviceAttr>() ||
10715
NewFD->hasAttr<CUDAGlobalAttr>()) &&
10716
!(II && II->isStr("printf") && NewFD->isExternC() &&
10717
!D.isFunctionDefinition())) {
10718
Diag(NewFD->getLocation(), diag::err_variadic_device_fn);
10719
}
10720
}
10721
10722
MarkUnusedFileScopedDecl(NewFD);
10723
10724
10725
10726
if (getLangOpts().OpenCL && NewFD->hasAttr<OpenCLKernelAttr>()) {
10727
// OpenCL v1.2 s6.8 static is invalid for kernel functions.
10728
if (SC == SC_Static) {
10729
Diag(D.getIdentifierLoc(), diag::err_static_kernel);
10730
D.setInvalidType();
10731
}
10732
10733
// OpenCL v1.2, s6.9 -- Kernels can only have return type void.
10734
if (!NewFD->getReturnType()->isVoidType()) {
10735
SourceRange RTRange = NewFD->getReturnTypeSourceRange();
10736
Diag(D.getIdentifierLoc(), diag::err_expected_kernel_void_return_type)
10737
<< (RTRange.isValid() ? FixItHint::CreateReplacement(RTRange, "void")
10738
: FixItHint());
10739
D.setInvalidType();
10740
}
10741
10742
llvm::SmallPtrSet<const Type *, 16> ValidTypes;
10743
for (auto *Param : NewFD->parameters())
10744
checkIsValidOpenCLKernelParameter(*this, D, Param, ValidTypes);
10745
10746
if (getLangOpts().OpenCLCPlusPlus) {
10747
if (DC->isRecord()) {
10748
Diag(D.getIdentifierLoc(), diag::err_method_kernel);
10749
D.setInvalidType();
10750
}
10751
if (FunctionTemplate) {
10752
Diag(D.getIdentifierLoc(), diag::err_template_kernel);
10753
D.setInvalidType();
10754
}
10755
}
10756
}
10757
10758
if (getLangOpts().CPlusPlus) {
10759
// Precalculate whether this is a friend function template with a constraint
10760
// that depends on an enclosing template, per [temp.friend]p9.
10761
if (isFriend && FunctionTemplate &&
10762
FriendConstraintsDependOnEnclosingTemplate(NewFD)) {
10763
NewFD->setFriendConstraintRefersToEnclosingTemplate(true);
10764
10765
// C++ [temp.friend]p9:
10766
// A friend function template with a constraint that depends on a
10767
// template parameter from an enclosing template shall be a definition.
10768
if (!D.isFunctionDefinition()) {
10769
Diag(NewFD->getBeginLoc(),
10770
diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
10771
NewFD->setInvalidDecl();
10772
}
10773
}
10774
10775
if (FunctionTemplate) {
10776
if (NewFD->isInvalidDecl())
10777
FunctionTemplate->setInvalidDecl();
10778
return FunctionTemplate;
10779
}
10780
10781
if (isMemberSpecialization && !NewFD->isInvalidDecl())
10782
CompleteMemberSpecialization(NewFD, Previous);
10783
}
10784
10785
for (const ParmVarDecl *Param : NewFD->parameters()) {
10786
QualType PT = Param->getType();
10787
10788
// OpenCL 2.0 pipe restrictions forbids pipe packet types to be non-value
10789
// types.
10790
if (getLangOpts().getOpenCLCompatibleVersion() >= 200) {
10791
if(const PipeType *PipeTy = PT->getAs<PipeType>()) {
10792
QualType ElemTy = PipeTy->getElementType();
10793
if (ElemTy->isReferenceType() || ElemTy->isPointerType()) {
10794
Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type );
10795
D.setInvalidType();
10796
}
10797
}
10798
}
10799
// WebAssembly tables can't be used as function parameters.
10800
if (Context.getTargetInfo().getTriple().isWasm()) {
10801
if (PT->getUnqualifiedDesugaredType()->isWebAssemblyTableType()) {
10802
Diag(Param->getTypeSpecStartLoc(),
10803
diag::err_wasm_table_as_function_parameter);
10804
D.setInvalidType();
10805
}
10806
}
10807
}
10808
10809
// Diagnose availability attributes. Availability cannot be used on functions
10810
// that are run during load/unload.
10811
if (const auto *attr = NewFD->getAttr<AvailabilityAttr>()) {
10812
if (NewFD->hasAttr<ConstructorAttr>()) {
10813
Diag(attr->getLocation(), diag::warn_availability_on_static_initializer)
10814
<< 1;
10815
NewFD->dropAttr<AvailabilityAttr>();
10816
}
10817
if (NewFD->hasAttr<DestructorAttr>()) {
10818
Diag(attr->getLocation(), diag::warn_availability_on_static_initializer)
10819
<< 2;
10820
NewFD->dropAttr<AvailabilityAttr>();
10821
}
10822
}
10823
10824
// Diagnose no_builtin attribute on function declaration that are not a
10825
// definition.
10826
// FIXME: We should really be doing this in
10827
// SemaDeclAttr.cpp::handleNoBuiltinAttr, unfortunately we only have access to
10828
// the FunctionDecl and at this point of the code
10829
// FunctionDecl::isThisDeclarationADefinition() which always returns `false`
10830
// because Sema::ActOnStartOfFunctionDef has not been called yet.
10831
if (const auto *NBA = NewFD->getAttr<NoBuiltinAttr>())
10832
switch (D.getFunctionDefinitionKind()) {
10833
case FunctionDefinitionKind::Defaulted:
10834
case FunctionDefinitionKind::Deleted:
10835
Diag(NBA->getLocation(),
10836
diag::err_attribute_no_builtin_on_defaulted_deleted_function)
10837
<< NBA->getSpelling();
10838
break;
10839
case FunctionDefinitionKind::Declaration:
10840
Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
10841
<< NBA->getSpelling();
10842
break;
10843
case FunctionDefinitionKind::Definition:
10844
break;
10845
}
10846
10847
// Similar to no_builtin logic above, at this point of the code
10848
// FunctionDecl::isThisDeclarationADefinition() always returns `false`
10849
// because Sema::ActOnStartOfFunctionDef has not been called yet.
10850
if (Context.getTargetInfo().allowDebugInfoForExternalRef() &&
10851
!NewFD->isInvalidDecl() &&
10852
D.getFunctionDefinitionKind() == FunctionDefinitionKind::Declaration)
10853
ExternalDeclarations.push_back(NewFD);
10854
10855
return NewFD;
10856
}
10857
10858
/// Return a CodeSegAttr from a containing class. The Microsoft docs say
10859
/// when __declspec(code_seg) "is applied to a class, all member functions of
10860
/// the class and nested classes -- this includes compiler-generated special
10861
/// member functions -- are put in the specified segment."
10862
/// The actual behavior is a little more complicated. The Microsoft compiler
10863
/// won't check outer classes if there is an active value from #pragma code_seg.
10864
/// The CodeSeg is always applied from the direct parent but only from outer
10865
/// classes when the #pragma code_seg stack is empty. See:
10866
/// https://reviews.llvm.org/D22931, the Microsoft feedback page is no longer
10867
/// available since MS has removed the page.
10868
static Attr *getImplicitCodeSegAttrFromClass(Sema &S, const FunctionDecl *FD) {
10869
const auto *Method = dyn_cast<CXXMethodDecl>(FD);
10870
if (!Method)
10871
return nullptr;
10872
const CXXRecordDecl *Parent = Method->getParent();
10873
if (const auto *SAttr = Parent->getAttr<CodeSegAttr>()) {
10874
Attr *NewAttr = SAttr->clone(S.getASTContext());
10875
NewAttr->setImplicit(true);
10876
return NewAttr;
10877
}
10878
10879
// The Microsoft compiler won't check outer classes for the CodeSeg
10880
// when the #pragma code_seg stack is active.
10881
if (S.CodeSegStack.CurrentValue)
10882
return nullptr;
10883
10884
while ((Parent = dyn_cast<CXXRecordDecl>(Parent->getParent()))) {
10885
if (const auto *SAttr = Parent->getAttr<CodeSegAttr>()) {
10886
Attr *NewAttr = SAttr->clone(S.getASTContext());
10887
NewAttr->setImplicit(true);
10888
return NewAttr;
10889
}
10890
}
10891
return nullptr;
10892
}
10893
10894
Attr *Sema::getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
10895
bool IsDefinition) {
10896
if (Attr *A = getImplicitCodeSegAttrFromClass(*this, FD))
10897
return A;
10898
if (!FD->hasAttr<SectionAttr>() && IsDefinition &&
10899
CodeSegStack.CurrentValue)
10900
return SectionAttr::CreateImplicit(
10901
getASTContext(), CodeSegStack.CurrentValue->getString(),
10902
CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
10903
return nullptr;
10904
}
10905
10906
bool Sema::canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
10907
QualType NewT, QualType OldT) {
10908
if (!NewD->getLexicalDeclContext()->isDependentContext())
10909
return true;
10910
10911
// For dependently-typed local extern declarations and friends, we can't
10912
// perform a correct type check in general until instantiation:
10913
//
10914
// int f();
10915
// template<typename T> void g() { T f(); }
10916
//
10917
// (valid if g() is only instantiated with T = int).
10918
if (NewT->isDependentType() &&
10919
(NewD->isLocalExternDecl() || NewD->getFriendObjectKind()))
10920
return false;
10921
10922
// Similarly, if the previous declaration was a dependent local extern
10923
// declaration, we don't really know its type yet.
10924
if (OldT->isDependentType() && OldD->isLocalExternDecl())
10925
return false;
10926
10927
return true;
10928
}
10929
10930
bool Sema::shouldLinkDependentDeclWithPrevious(Decl *D, Decl *PrevDecl) {
10931
if (!D->getLexicalDeclContext()->isDependentContext())
10932
return true;
10933
10934
// Don't chain dependent friend function definitions until instantiation, to
10935
// permit cases like
10936
//
10937
// void func();
10938
// template<typename T> class C1 { friend void func() {} };
10939
// template<typename T> class C2 { friend void func() {} };
10940
//
10941
// ... which is valid if only one of C1 and C2 is ever instantiated.
10942
//
10943
// FIXME: This need only apply to function definitions. For now, we proxy
10944
// this by checking for a file-scope function. We do not want this to apply
10945
// to friend declarations nominating member functions, because that gets in
10946
// the way of access checks.
10947
if (D->getFriendObjectKind() && D->getDeclContext()->isFileContext())
10948
return false;
10949
10950
auto *VD = dyn_cast<ValueDecl>(D);
10951
auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
10952
return !VD || !PrevVD ||
10953
canFullyTypeCheckRedeclaration(VD, PrevVD, VD->getType(),
10954
PrevVD->getType());
10955
}
10956
10957
/// Check the target or target_version attribute of the function for
10958
/// MultiVersion validity.
10959
///
10960
/// Returns true if there was an error, false otherwise.
10961
static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD) {
10962
const auto *TA = FD->getAttr<TargetAttr>();
10963
const auto *TVA = FD->getAttr<TargetVersionAttr>();
10964
assert(
10965
(TA || TVA) &&
10966
"MultiVersion candidate requires a target or target_version attribute");
10967
const TargetInfo &TargetInfo = S.Context.getTargetInfo();
10968
enum ErrType { Feature = 0, Architecture = 1 };
10969
10970
if (TA) {
10971
ParsedTargetAttr ParseInfo =
10972
S.getASTContext().getTargetInfo().parseTargetAttr(TA->getFeaturesStr());
10973
if (!ParseInfo.CPU.empty() && !TargetInfo.validateCpuIs(ParseInfo.CPU)) {
10974
S.Diag(FD->getLocation(), diag::err_bad_multiversion_option)
10975
<< Architecture << ParseInfo.CPU;
10976
return true;
10977
}
10978
for (const auto &Feat : ParseInfo.Features) {
10979
auto BareFeat = StringRef{Feat}.substr(1);
10980
if (Feat[0] == '-') {
10981
S.Diag(FD->getLocation(), diag::err_bad_multiversion_option)
10982
<< Feature << ("no-" + BareFeat).str();
10983
return true;
10984
}
10985
10986
if (!TargetInfo.validateCpuSupports(BareFeat) ||
10987
!TargetInfo.isValidFeatureName(BareFeat)) {
10988
S.Diag(FD->getLocation(), diag::err_bad_multiversion_option)
10989
<< Feature << BareFeat;
10990
return true;
10991
}
10992
}
10993
}
10994
10995
if (TVA) {
10996
llvm::SmallVector<StringRef, 8> Feats;
10997
TVA->getFeatures(Feats);
10998
for (const auto &Feat : Feats) {
10999
if (!TargetInfo.validateCpuSupports(Feat)) {
11000
S.Diag(FD->getLocation(), diag::err_bad_multiversion_option)
11001
<< Feature << Feat;
11002
return true;
11003
}
11004
}
11005
}
11006
return false;
11007
}
11008
11009
// Provide a white-list of attributes that are allowed to be combined with
11010
// multiversion functions.
11011
static bool AttrCompatibleWithMultiVersion(attr::Kind Kind,
11012
MultiVersionKind MVKind) {
11013
// Note: this list/diagnosis must match the list in
11014
// checkMultiversionAttributesAllSame.
11015
switch (Kind) {
11016
default:
11017
return false;
11018
case attr::ArmLocallyStreaming:
11019
return MVKind == MultiVersionKind::TargetVersion ||
11020
MVKind == MultiVersionKind::TargetClones;
11021
case attr::Used:
11022
return MVKind == MultiVersionKind::Target;
11023
case attr::NonNull:
11024
case attr::NoThrow:
11025
return true;
11026
}
11027
}
11028
11029
static bool checkNonMultiVersionCompatAttributes(Sema &S,
11030
const FunctionDecl *FD,
11031
const FunctionDecl *CausedFD,
11032
MultiVersionKind MVKind) {
11033
const auto Diagnose = [FD, CausedFD, MVKind](Sema &S, const Attr *A) {
11034
S.Diag(FD->getLocation(), diag::err_multiversion_disallowed_other_attr)
11035
<< static_cast<unsigned>(MVKind) << A;
11036
if (CausedFD)
11037
S.Diag(CausedFD->getLocation(), diag::note_multiversioning_caused_here);
11038
return true;
11039
};
11040
11041
for (const Attr *A : FD->attrs()) {
11042
switch (A->getKind()) {
11043
case attr::CPUDispatch:
11044
case attr::CPUSpecific:
11045
if (MVKind != MultiVersionKind::CPUDispatch &&
11046
MVKind != MultiVersionKind::CPUSpecific)
11047
return Diagnose(S, A);
11048
break;
11049
case attr::Target:
11050
if (MVKind != MultiVersionKind::Target)
11051
return Diagnose(S, A);
11052
break;
11053
case attr::TargetVersion:
11054
if (MVKind != MultiVersionKind::TargetVersion &&
11055
MVKind != MultiVersionKind::TargetClones)
11056
return Diagnose(S, A);
11057
break;
11058
case attr::TargetClones:
11059
if (MVKind != MultiVersionKind::TargetClones &&
11060
MVKind != MultiVersionKind::TargetVersion)
11061
return Diagnose(S, A);
11062
break;
11063
default:
11064
if (!AttrCompatibleWithMultiVersion(A->getKind(), MVKind))
11065
return Diagnose(S, A);
11066
break;
11067
}
11068
}
11069
return false;
11070
}
11071
11072
bool Sema::areMultiversionVariantFunctionsCompatible(
11073
const FunctionDecl *OldFD, const FunctionDecl *NewFD,
11074
const PartialDiagnostic &NoProtoDiagID,
11075
const PartialDiagnosticAt &NoteCausedDiagIDAt,
11076
const PartialDiagnosticAt &NoSupportDiagIDAt,
11077
const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
11078
bool ConstexprSupported, bool CLinkageMayDiffer) {
11079
enum DoesntSupport {
11080
FuncTemplates = 0,
11081
VirtFuncs = 1,
11082
DeducedReturn = 2,
11083
Constructors = 3,
11084
Destructors = 4,
11085
DeletedFuncs = 5,
11086
DefaultedFuncs = 6,
11087
ConstexprFuncs = 7,
11088
ConstevalFuncs = 8,
11089
Lambda = 9,
11090
};
11091
enum Different {
11092
CallingConv = 0,
11093
ReturnType = 1,
11094
ConstexprSpec = 2,
11095
InlineSpec = 3,
11096
Linkage = 4,
11097
LanguageLinkage = 5,
11098
};
11099
11100
if (NoProtoDiagID.getDiagID() != 0 && OldFD &&
11101
!OldFD->getType()->getAs<FunctionProtoType>()) {
11102
Diag(OldFD->getLocation(), NoProtoDiagID);
11103
Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11104
return true;
11105
}
11106
11107
if (NoProtoDiagID.getDiagID() != 0 &&
11108
!NewFD->getType()->getAs<FunctionProtoType>())
11109
return Diag(NewFD->getLocation(), NoProtoDiagID);
11110
11111
if (!TemplatesSupported &&
11112
NewFD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate)
11113
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11114
<< FuncTemplates;
11115
11116
if (const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11117
if (NewCXXFD->isVirtual())
11118
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11119
<< VirtFuncs;
11120
11121
if (isa<CXXConstructorDecl>(NewCXXFD))
11122
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11123
<< Constructors;
11124
11125
if (isa<CXXDestructorDecl>(NewCXXFD))
11126
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11127
<< Destructors;
11128
}
11129
11130
if (NewFD->isDeleted())
11131
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11132
<< DeletedFuncs;
11133
11134
if (NewFD->isDefaulted())
11135
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11136
<< DefaultedFuncs;
11137
11138
if (!ConstexprSupported && NewFD->isConstexpr())
11139
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11140
<< (NewFD->isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11141
11142
QualType NewQType = Context.getCanonicalType(NewFD->getType());
11143
const auto *NewType = cast<FunctionType>(NewQType);
11144
QualType NewReturnType = NewType->getReturnType();
11145
11146
if (NewReturnType->isUndeducedType())
11147
return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11148
<< DeducedReturn;
11149
11150
// Ensure the return type is identical.
11151
if (OldFD) {
11152
QualType OldQType = Context.getCanonicalType(OldFD->getType());
11153
const auto *OldType = cast<FunctionType>(OldQType);
11154
FunctionType::ExtInfo OldTypeInfo = OldType->getExtInfo();
11155
FunctionType::ExtInfo NewTypeInfo = NewType->getExtInfo();
11156
11157
const auto *OldFPT = OldFD->getType()->getAs<FunctionProtoType>();
11158
const auto *NewFPT = NewFD->getType()->getAs<FunctionProtoType>();
11159
11160
bool ArmStreamingCCMismatched = false;
11161
if (OldFPT && NewFPT) {
11162
unsigned Diff =
11163
OldFPT->getAArch64SMEAttributes() ^ NewFPT->getAArch64SMEAttributes();
11164
// Arm-streaming, arm-streaming-compatible and non-streaming versions
11165
// cannot be mixed.
11166
if (Diff & (FunctionType::SME_PStateSMEnabledMask |
11167
FunctionType::SME_PStateSMCompatibleMask))
11168
ArmStreamingCCMismatched = true;
11169
}
11170
11171
if (OldTypeInfo.getCC() != NewTypeInfo.getCC() || ArmStreamingCCMismatched)
11172
return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << CallingConv;
11173
11174
QualType OldReturnType = OldType->getReturnType();
11175
11176
if (OldReturnType != NewReturnType)
11177
return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11178
11179
if (OldFD->getConstexprKind() != NewFD->getConstexprKind())
11180
return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11181
11182
if (OldFD->isInlineSpecified() != NewFD->isInlineSpecified())
11183
return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11184
11185
if (OldFD->getFormalLinkage() != NewFD->getFormalLinkage())
11186
return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << Linkage;
11187
11188
if (!CLinkageMayDiffer && OldFD->isExternC() != NewFD->isExternC())
11189
return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << LanguageLinkage;
11190
11191
if (CheckEquivalentExceptionSpec(OldFPT, OldFD->getLocation(), NewFPT,
11192
NewFD->getLocation()))
11193
return true;
11194
}
11195
return false;
11196
}
11197
11198
static bool CheckMultiVersionAdditionalRules(Sema &S, const FunctionDecl *OldFD,
11199
const FunctionDecl *NewFD,
11200
bool CausesMV,
11201
MultiVersionKind MVKind) {
11202
if (!S.getASTContext().getTargetInfo().supportsMultiVersioning()) {
11203
S.Diag(NewFD->getLocation(), diag::err_multiversion_not_supported);
11204
if (OldFD)
11205
S.Diag(OldFD->getLocation(), diag::note_previous_declaration);
11206
return true;
11207
}
11208
11209
bool IsCPUSpecificCPUDispatchMVKind =
11210
MVKind == MultiVersionKind::CPUDispatch ||
11211
MVKind == MultiVersionKind::CPUSpecific;
11212
11213
if (CausesMV && OldFD &&
11214
checkNonMultiVersionCompatAttributes(S, OldFD, NewFD, MVKind))
11215
return true;
11216
11217
if (checkNonMultiVersionCompatAttributes(S, NewFD, nullptr, MVKind))
11218
return true;
11219
11220
// Only allow transition to MultiVersion if it hasn't been used.
11221
if (OldFD && CausesMV && OldFD->isUsed(false))
11222
return S.Diag(NewFD->getLocation(), diag::err_multiversion_after_used);
11223
11224
return S.areMultiversionVariantFunctionsCompatible(
11225
OldFD, NewFD, S.PDiag(diag::err_multiversion_noproto),
11226
PartialDiagnosticAt(NewFD->getLocation(),
11227
S.PDiag(diag::note_multiversioning_caused_here)),
11228
PartialDiagnosticAt(NewFD->getLocation(),
11229
S.PDiag(diag::err_multiversion_doesnt_support)
11230
<< static_cast<unsigned>(MVKind)),
11231
PartialDiagnosticAt(NewFD->getLocation(),
11232
S.PDiag(diag::err_multiversion_diff)),
11233
/*TemplatesSupported=*/false,
11234
/*ConstexprSupported=*/!IsCPUSpecificCPUDispatchMVKind,
11235
/*CLinkageMayDiffer=*/false);
11236
}
11237
11238
/// Check the validity of a multiversion function declaration that is the
11239
/// first of its kind. Also sets the multiversion'ness' of the function itself.
11240
///
11241
/// This sets NewFD->isInvalidDecl() to true if there was an error.
11242
///
11243
/// Returns true if there was an error, false otherwise.
11244
static bool CheckMultiVersionFirstFunction(Sema &S, FunctionDecl *FD) {
11245
MultiVersionKind MVKind = FD->getMultiVersionKind();
11246
assert(MVKind != MultiVersionKind::None &&
11247
"Function lacks multiversion attribute");
11248
const auto *TA = FD->getAttr<TargetAttr>();
11249
const auto *TVA = FD->getAttr<TargetVersionAttr>();
11250
// The target attribute only causes MV if this declaration is the default,
11251
// otherwise it is treated as a normal function.
11252
if (TA && !TA->isDefaultVersion())
11253
return false;
11254
// The target_version attribute only causes Multiversioning if this
11255
// declaration is NOT the default version.
11256
if (TVA && TVA->isDefaultVersion())
11257
return false;
11258
11259
if ((TA || TVA) && CheckMultiVersionValue(S, FD)) {
11260
FD->setInvalidDecl();
11261
return true;
11262
}
11263
11264
if (CheckMultiVersionAdditionalRules(S, nullptr, FD, true, MVKind)) {
11265
FD->setInvalidDecl();
11266
return true;
11267
}
11268
11269
FD->setIsMultiVersion();
11270
return false;
11271
}
11272
11273
static bool PreviousDeclsHaveMultiVersionAttribute(const FunctionDecl *FD) {
11274
for (const Decl *D = FD->getPreviousDecl(); D; D = D->getPreviousDecl()) {
11275
if (D->getAsFunction()->getMultiVersionKind() != MultiVersionKind::None)
11276
return true;
11277
}
11278
11279
return false;
11280
}
11281
11282
static void patchDefaultTargetVersion(FunctionDecl *From, FunctionDecl *To) {
11283
if (!From->getASTContext().getTargetInfo().getTriple().isAArch64())
11284
return;
11285
11286
MultiVersionKind MVKindFrom = From->getMultiVersionKind();
11287
MultiVersionKind MVKindTo = To->getMultiVersionKind();
11288
11289
if (MVKindTo == MultiVersionKind::None &&
11290
(MVKindFrom == MultiVersionKind::TargetVersion ||
11291
MVKindFrom == MultiVersionKind::TargetClones))
11292
To->addAttr(TargetVersionAttr::CreateImplicit(
11293
To->getASTContext(), "default", To->getSourceRange()));
11294
}
11295
11296
static bool CheckDeclarationCausesMultiVersioning(Sema &S, FunctionDecl *OldFD,
11297
FunctionDecl *NewFD,
11298
bool &Redeclaration,
11299
NamedDecl *&OldDecl,
11300
LookupResult &Previous) {
11301
assert(!OldFD->isMultiVersion() && "Unexpected MultiVersion");
11302
11303
// The definitions should be allowed in any order. If we have discovered
11304
// a new target version and the preceeding was the default, then add the
11305
// corresponding attribute to it.
11306
patchDefaultTargetVersion(NewFD, OldFD);
11307
11308
const auto *NewTA = NewFD->getAttr<TargetAttr>();
11309
const auto *NewTVA = NewFD->getAttr<TargetVersionAttr>();
11310
const auto *OldTA = OldFD->getAttr<TargetAttr>();
11311
11312
// If the old decl is NOT MultiVersioned yet, and we don't cause that
11313
// to change, this is a simple redeclaration.
11314
if (NewTA && !NewTA->isDefaultVersion() &&
11315
(!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11316
return false;
11317
11318
// The target_version attribute only causes Multiversioning if this
11319
// declaration is NOT the default version.
11320
if (NewTVA && NewTVA->isDefaultVersion())
11321
return false;
11322
11323
// Otherwise, this decl causes MultiVersioning.
11324
if (CheckMultiVersionAdditionalRules(S, OldFD, NewFD, true,
11325
NewTVA ? MultiVersionKind::TargetVersion
11326
: MultiVersionKind::Target)) {
11327
NewFD->setInvalidDecl();
11328
return true;
11329
}
11330
11331
if (CheckMultiVersionValue(S, NewFD)) {
11332
NewFD->setInvalidDecl();
11333
return true;
11334
}
11335
11336
// If this is 'default', permit the forward declaration.
11337
if (NewTA && NewTA->isDefaultVersion() && !OldTA) {
11338
Redeclaration = true;
11339
OldDecl = OldFD;
11340
OldFD->setIsMultiVersion();
11341
NewFD->setIsMultiVersion();
11342
return false;
11343
}
11344
11345
if (CheckMultiVersionValue(S, OldFD)) {
11346
S.Diag(NewFD->getLocation(), diag::note_multiversioning_caused_here);
11347
NewFD->setInvalidDecl();
11348
return true;
11349
}
11350
11351
if (NewTA) {
11352
ParsedTargetAttr OldParsed =
11353
S.getASTContext().getTargetInfo().parseTargetAttr(
11354
OldTA->getFeaturesStr());
11355
llvm::sort(OldParsed.Features);
11356
ParsedTargetAttr NewParsed =
11357
S.getASTContext().getTargetInfo().parseTargetAttr(
11358
NewTA->getFeaturesStr());
11359
// Sort order doesn't matter, it just needs to be consistent.
11360
llvm::sort(NewParsed.Features);
11361
if (OldParsed == NewParsed) {
11362
S.Diag(NewFD->getLocation(), diag::err_multiversion_duplicate);
11363
S.Diag(OldFD->getLocation(), diag::note_previous_declaration);
11364
NewFD->setInvalidDecl();
11365
return true;
11366
}
11367
}
11368
11369
for (const auto *FD : OldFD->redecls()) {
11370
const auto *CurTA = FD->getAttr<TargetAttr>();
11371
const auto *CurTVA = FD->getAttr<TargetVersionAttr>();
11372
// We allow forward declarations before ANY multiversioning attributes, but
11373
// nothing after the fact.
11374
if (PreviousDeclsHaveMultiVersionAttribute(FD) &&
11375
((NewTA && (!CurTA || CurTA->isInherited())) ||
11376
(NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11377
S.Diag(FD->getLocation(), diag::err_multiversion_required_in_redecl)
11378
<< (NewTA ? 0 : 2);
11379
S.Diag(NewFD->getLocation(), diag::note_multiversioning_caused_here);
11380
NewFD->setInvalidDecl();
11381
return true;
11382
}
11383
}
11384
11385
OldFD->setIsMultiVersion();
11386
NewFD->setIsMultiVersion();
11387
Redeclaration = false;
11388
OldDecl = nullptr;
11389
Previous.clear();
11390
return false;
11391
}
11392
11393
static bool MultiVersionTypesCompatible(FunctionDecl *Old, FunctionDecl *New) {
11394
MultiVersionKind OldKind = Old->getMultiVersionKind();
11395
MultiVersionKind NewKind = New->getMultiVersionKind();
11396
11397
if (OldKind == NewKind || OldKind == MultiVersionKind::None ||
11398
NewKind == MultiVersionKind::None)
11399
return true;
11400
11401
if (Old->getASTContext().getTargetInfo().getTriple().isAArch64()) {
11402
switch (OldKind) {
11403
case MultiVersionKind::TargetVersion:
11404
return NewKind == MultiVersionKind::TargetClones;
11405
case MultiVersionKind::TargetClones:
11406
return NewKind == MultiVersionKind::TargetVersion;
11407
default:
11408
return false;
11409
}
11410
} else {
11411
switch (OldKind) {
11412
case MultiVersionKind::CPUDispatch:
11413
return NewKind == MultiVersionKind::CPUSpecific;
11414
case MultiVersionKind::CPUSpecific:
11415
return NewKind == MultiVersionKind::CPUDispatch;
11416
default:
11417
return false;
11418
}
11419
}
11420
}
11421
11422
/// Check the validity of a new function declaration being added to an existing
11423
/// multiversioned declaration collection.
11424
static bool CheckMultiVersionAdditionalDecl(
11425
Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD,
11426
const CPUDispatchAttr *NewCPUDisp, const CPUSpecificAttr *NewCPUSpec,
11427
const TargetClonesAttr *NewClones, bool &Redeclaration, NamedDecl *&OldDecl,
11428
LookupResult &Previous) {
11429
11430
// Disallow mixing of multiversioning types.
11431
if (!MultiVersionTypesCompatible(OldFD, NewFD)) {
11432
S.Diag(NewFD->getLocation(), diag::err_multiversion_types_mixed);
11433
S.Diag(OldFD->getLocation(), diag::note_previous_declaration);
11434
NewFD->setInvalidDecl();
11435
return true;
11436
}
11437
11438
// Add the default target_version attribute if it's missing.
11439
patchDefaultTargetVersion(OldFD, NewFD);
11440
patchDefaultTargetVersion(NewFD, OldFD);
11441
11442
const auto *NewTA = NewFD->getAttr<TargetAttr>();
11443
const auto *NewTVA = NewFD->getAttr<TargetVersionAttr>();
11444
MultiVersionKind NewMVKind = NewFD->getMultiVersionKind();
11445
[[maybe_unused]] MultiVersionKind OldMVKind = OldFD->getMultiVersionKind();
11446
11447
ParsedTargetAttr NewParsed;
11448
if (NewTA) {
11449
NewParsed = S.getASTContext().getTargetInfo().parseTargetAttr(
11450
NewTA->getFeaturesStr());
11451
llvm::sort(NewParsed.Features);
11452
}
11453
llvm::SmallVector<StringRef, 8> NewFeats;
11454
if (NewTVA) {
11455
NewTVA->getFeatures(NewFeats);
11456
llvm::sort(NewFeats);
11457
}
11458
11459
bool UseMemberUsingDeclRules =
11460
S.CurContext->isRecord() && !NewFD->getFriendObjectKind();
11461
11462
bool MayNeedOverloadableChecks =
11463
AllowOverloadingOfFunction(Previous, S.Context, NewFD);
11464
11465
// Next, check ALL non-invalid non-overloads to see if this is a redeclaration
11466
// of a previous member of the MultiVersion set.
11467
for (NamedDecl *ND : Previous) {
11468
FunctionDecl *CurFD = ND->getAsFunction();
11469
if (!CurFD || CurFD->isInvalidDecl())
11470
continue;
11471
if (MayNeedOverloadableChecks &&
11472
S.IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11473
continue;
11474
11475
switch (NewMVKind) {
11476
case MultiVersionKind::None:
11477
assert(OldMVKind == MultiVersionKind::TargetClones &&
11478
"Only target_clones can be omitted in subsequent declarations");
11479
break;
11480
case MultiVersionKind::Target: {
11481
const auto *CurTA = CurFD->getAttr<TargetAttr>();
11482
if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11483
NewFD->setIsMultiVersion();
11484
Redeclaration = true;
11485
OldDecl = ND;
11486
return false;
11487
}
11488
11489
ParsedTargetAttr CurParsed =
11490
S.getASTContext().getTargetInfo().parseTargetAttr(
11491
CurTA->getFeaturesStr());
11492
llvm::sort(CurParsed.Features);
11493
if (CurParsed == NewParsed) {
11494
S.Diag(NewFD->getLocation(), diag::err_multiversion_duplicate);
11495
S.Diag(CurFD->getLocation(), diag::note_previous_declaration);
11496
NewFD->setInvalidDecl();
11497
return true;
11498
}
11499
break;
11500
}
11501
case MultiVersionKind::TargetVersion: {
11502
if (const auto *CurTVA = CurFD->getAttr<TargetVersionAttr>()) {
11503
if (CurTVA->getName() == NewTVA->getName()) {
11504
NewFD->setIsMultiVersion();
11505
Redeclaration = true;
11506
OldDecl = ND;
11507
return false;
11508
}
11509
llvm::SmallVector<StringRef, 8> CurFeats;
11510
CurTVA->getFeatures(CurFeats);
11511
llvm::sort(CurFeats);
11512
11513
if (CurFeats == NewFeats) {
11514
S.Diag(NewFD->getLocation(), diag::err_multiversion_duplicate);
11515
S.Diag(CurFD->getLocation(), diag::note_previous_declaration);
11516
NewFD->setInvalidDecl();
11517
return true;
11518
}
11519
} else if (const auto *CurClones = CurFD->getAttr<TargetClonesAttr>()) {
11520
// Default
11521
if (NewFeats.empty())
11522
break;
11523
11524
for (unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11525
llvm::SmallVector<StringRef, 8> CurFeats;
11526
CurClones->getFeatures(CurFeats, I);
11527
llvm::sort(CurFeats);
11528
11529
if (CurFeats == NewFeats) {
11530
S.Diag(NewFD->getLocation(), diag::err_multiversion_duplicate);
11531
S.Diag(CurFD->getLocation(), diag::note_previous_declaration);
11532
NewFD->setInvalidDecl();
11533
return true;
11534
}
11535
}
11536
}
11537
break;
11538
}
11539
case MultiVersionKind::TargetClones: {
11540
assert(NewClones && "MultiVersionKind does not match attribute type");
11541
if (const auto *CurClones = CurFD->getAttr<TargetClonesAttr>()) {
11542
if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11543
!std::equal(CurClones->featuresStrs_begin(),
11544
CurClones->featuresStrs_end(),
11545
NewClones->featuresStrs_begin())) {
11546
S.Diag(NewFD->getLocation(), diag::err_target_clone_doesnt_match);
11547
S.Diag(CurFD->getLocation(), diag::note_previous_declaration);
11548
NewFD->setInvalidDecl();
11549
return true;
11550
}
11551
} else if (const auto *CurTVA = CurFD->getAttr<TargetVersionAttr>()) {
11552
llvm::SmallVector<StringRef, 8> CurFeats;
11553
CurTVA->getFeatures(CurFeats);
11554
llvm::sort(CurFeats);
11555
11556
// Default
11557
if (CurFeats.empty())
11558
break;
11559
11560
for (unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11561
NewFeats.clear();
11562
NewClones->getFeatures(NewFeats, I);
11563
llvm::sort(NewFeats);
11564
11565
if (CurFeats == NewFeats) {
11566
S.Diag(NewFD->getLocation(), diag::err_multiversion_duplicate);
11567
S.Diag(CurFD->getLocation(), diag::note_previous_declaration);
11568
NewFD->setInvalidDecl();
11569
return true;
11570
}
11571
}
11572
break;
11573
}
11574
Redeclaration = true;
11575
OldDecl = CurFD;
11576
NewFD->setIsMultiVersion();
11577
return false;
11578
}
11579
case MultiVersionKind::CPUSpecific:
11580
case MultiVersionKind::CPUDispatch: {
11581
const auto *CurCPUSpec = CurFD->getAttr<CPUSpecificAttr>();
11582
const auto *CurCPUDisp = CurFD->getAttr<CPUDispatchAttr>();
11583
// Handle CPUDispatch/CPUSpecific versions.
11584
// Only 1 CPUDispatch function is allowed, this will make it go through
11585
// the redeclaration errors.
11586
if (NewMVKind == MultiVersionKind::CPUDispatch &&
11587
CurFD->hasAttr<CPUDispatchAttr>()) {
11588
if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
11589
std::equal(
11590
CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
11591
NewCPUDisp->cpus_begin(),
11592
[](const IdentifierInfo *Cur, const IdentifierInfo *New) {
11593
return Cur->getName() == New->getName();
11594
})) {
11595
NewFD->setIsMultiVersion();
11596
Redeclaration = true;
11597
OldDecl = ND;
11598
return false;
11599
}
11600
11601
// If the declarations don't match, this is an error condition.
11602
S.Diag(NewFD->getLocation(), diag::err_cpu_dispatch_mismatch);
11603
S.Diag(CurFD->getLocation(), diag::note_previous_declaration);
11604
NewFD->setInvalidDecl();
11605
return true;
11606
}
11607
if (NewMVKind == MultiVersionKind::CPUSpecific && CurCPUSpec) {
11608
if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
11609
std::equal(
11610
CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
11611
NewCPUSpec->cpus_begin(),
11612
[](const IdentifierInfo *Cur, const IdentifierInfo *New) {
11613
return Cur->getName() == New->getName();
11614
})) {
11615
NewFD->setIsMultiVersion();
11616
Redeclaration = true;
11617
OldDecl = ND;
11618
return false;
11619
}
11620
11621
// Only 1 version of CPUSpecific is allowed for each CPU.
11622
for (const IdentifierInfo *CurII : CurCPUSpec->cpus()) {
11623
for (const IdentifierInfo *NewII : NewCPUSpec->cpus()) {
11624
if (CurII == NewII) {
11625
S.Diag(NewFD->getLocation(), diag::err_cpu_specific_multiple_defs)
11626
<< NewII;
11627
S.Diag(CurFD->getLocation(), diag::note_previous_declaration);
11628
NewFD->setInvalidDecl();
11629
return true;
11630
}
11631
}
11632
}
11633
}
11634
break;
11635
}
11636
}
11637
}
11638
11639
// Else, this is simply a non-redecl case. Checking the 'value' is only
11640
// necessary in the Target case, since The CPUSpecific/Dispatch cases are
11641
// handled in the attribute adding step.
11642
if ((NewMVKind == MultiVersionKind::TargetVersion ||
11643
NewMVKind == MultiVersionKind::Target) &&
11644
CheckMultiVersionValue(S, NewFD)) {
11645
NewFD->setInvalidDecl();
11646
return true;
11647
}
11648
11649
if (CheckMultiVersionAdditionalRules(S, OldFD, NewFD,
11650
!OldFD->isMultiVersion(), NewMVKind)) {
11651
NewFD->setInvalidDecl();
11652
return true;
11653
}
11654
11655
// Permit forward declarations in the case where these two are compatible.
11656
if (!OldFD->isMultiVersion()) {
11657
OldFD->setIsMultiVersion();
11658
NewFD->setIsMultiVersion();
11659
Redeclaration = true;
11660
OldDecl = OldFD;
11661
return false;
11662
}
11663
11664
NewFD->setIsMultiVersion();
11665
Redeclaration = false;
11666
OldDecl = nullptr;
11667
Previous.clear();
11668
return false;
11669
}
11670
11671
/// Check the validity of a mulitversion function declaration.
11672
/// Also sets the multiversion'ness' of the function itself.
11673
///
11674
/// This sets NewFD->isInvalidDecl() to true if there was an error.
11675
///
11676
/// Returns true if there was an error, false otherwise.
11677
static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD,
11678
bool &Redeclaration, NamedDecl *&OldDecl,
11679
LookupResult &Previous) {
11680
const auto *NewTA = NewFD->getAttr<TargetAttr>();
11681
const auto *NewTVA = NewFD->getAttr<TargetVersionAttr>();
11682
const auto *NewCPUDisp = NewFD->getAttr<CPUDispatchAttr>();
11683
const auto *NewCPUSpec = NewFD->getAttr<CPUSpecificAttr>();
11684
const auto *NewClones = NewFD->getAttr<TargetClonesAttr>();
11685
MultiVersionKind MVKind = NewFD->getMultiVersionKind();
11686
11687
// Main isn't allowed to become a multiversion function, however it IS
11688
// permitted to have 'main' be marked with the 'target' optimization hint,
11689
// for 'target_version' only default is allowed.
11690
if (NewFD->isMain()) {
11691
if (MVKind != MultiVersionKind::None &&
11692
!(MVKind == MultiVersionKind::Target && !NewTA->isDefaultVersion()) &&
11693
!(MVKind == MultiVersionKind::TargetVersion &&
11694
NewTVA->isDefaultVersion())) {
11695
S.Diag(NewFD->getLocation(), diag::err_multiversion_not_allowed_on_main);
11696
NewFD->setInvalidDecl();
11697
return true;
11698
}
11699
return false;
11700
}
11701
11702
const llvm::Triple &T = S.getASTContext().getTargetInfo().getTriple();
11703
11704
// Target attribute on AArch64 is not used for multiversioning
11705
if (NewTA && T.isAArch64())
11706
return false;
11707
11708
// Target attribute on RISCV is not used for multiversioning
11709
if (NewTA && T.isRISCV())
11710
return false;
11711
11712
if (!OldDecl || !OldDecl->getAsFunction() ||
11713
!OldDecl->getDeclContext()->getRedeclContext()->Equals(
11714
NewFD->getDeclContext()->getRedeclContext())) {
11715
// If there's no previous declaration, AND this isn't attempting to cause
11716
// multiversioning, this isn't an error condition.
11717
if (MVKind == MultiVersionKind::None)
11718
return false;
11719
return CheckMultiVersionFirstFunction(S, NewFD);
11720
}
11721
11722
FunctionDecl *OldFD = OldDecl->getAsFunction();
11723
11724
if (!OldFD->isMultiVersion() && MVKind == MultiVersionKind::None)
11725
return false;
11726
11727
// Multiversioned redeclarations aren't allowed to omit the attribute, except
11728
// for target_clones and target_version.
11729
if (OldFD->isMultiVersion() && MVKind == MultiVersionKind::None &&
11730
OldFD->getMultiVersionKind() != MultiVersionKind::TargetClones &&
11731
OldFD->getMultiVersionKind() != MultiVersionKind::TargetVersion) {
11732
S.Diag(NewFD->getLocation(), diag::err_multiversion_required_in_redecl)
11733
<< (OldFD->getMultiVersionKind() != MultiVersionKind::Target);
11734
NewFD->setInvalidDecl();
11735
return true;
11736
}
11737
11738
if (!OldFD->isMultiVersion()) {
11739
switch (MVKind) {
11740
case MultiVersionKind::Target:
11741
case MultiVersionKind::TargetVersion:
11742
return CheckDeclarationCausesMultiVersioning(
11743
S, OldFD, NewFD, Redeclaration, OldDecl, Previous);
11744
case MultiVersionKind::TargetClones:
11745
if (OldFD->isUsed(false)) {
11746
NewFD->setInvalidDecl();
11747
return S.Diag(NewFD->getLocation(), diag::err_multiversion_after_used);
11748
}
11749
OldFD->setIsMultiVersion();
11750
break;
11751
11752
case MultiVersionKind::CPUDispatch:
11753
case MultiVersionKind::CPUSpecific:
11754
case MultiVersionKind::None:
11755
break;
11756
}
11757
}
11758
11759
// At this point, we have a multiversion function decl (in OldFD) AND an
11760
// appropriate attribute in the current function decl. Resolve that these are
11761
// still compatible with previous declarations.
11762
return CheckMultiVersionAdditionalDecl(S, OldFD, NewFD, NewCPUDisp,
11763
NewCPUSpec, NewClones, Redeclaration,
11764
OldDecl, Previous);
11765
}
11766
11767
static void CheckConstPureAttributesUsage(Sema &S, FunctionDecl *NewFD) {
11768
bool IsPure = NewFD->hasAttr<PureAttr>();
11769
bool IsConst = NewFD->hasAttr<ConstAttr>();
11770
11771
// If there are no pure or const attributes, there's nothing to check.
11772
if (!IsPure && !IsConst)
11773
return;
11774
11775
// If the function is marked both pure and const, we retain the const
11776
// attribute because it makes stronger guarantees than the pure attribute, and
11777
// we drop the pure attribute explicitly to prevent later confusion about
11778
// semantics.
11779
if (IsPure && IsConst) {
11780
S.Diag(NewFD->getLocation(), diag::warn_const_attr_with_pure_attr);
11781
NewFD->dropAttrs<PureAttr>();
11782
}
11783
11784
// Constructors and destructors are functions which return void, so are
11785
// handled here as well.
11786
if (NewFD->getReturnType()->isVoidType()) {
11787
S.Diag(NewFD->getLocation(), diag::warn_pure_function_returns_void)
11788
<< IsConst;
11789
NewFD->dropAttrs<PureAttr, ConstAttr>();
11790
}
11791
}
11792
11793
bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
11794
LookupResult &Previous,
11795
bool IsMemberSpecialization,
11796
bool DeclIsDefn) {
11797
assert(!NewFD->getReturnType()->isVariablyModifiedType() &&
11798
"Variably modified return types are not handled here");
11799
11800
// Determine whether the type of this function should be merged with
11801
// a previous visible declaration. This never happens for functions in C++,
11802
// and always happens in C if the previous declaration was visible.
11803
bool MergeTypeWithPrevious = !getLangOpts().CPlusPlus &&
11804
!Previous.isShadowed();
11805
11806
bool Redeclaration = false;
11807
NamedDecl *OldDecl = nullptr;
11808
bool MayNeedOverloadableChecks = false;
11809
11810
// Merge or overload the declaration with an existing declaration of
11811
// the same name, if appropriate.
11812
if (!Previous.empty()) {
11813
// Determine whether NewFD is an overload of PrevDecl or
11814
// a declaration that requires merging. If it's an overload,
11815
// there's no more work to do here; we'll just add the new
11816
// function to the scope.
11817
if (!AllowOverloadingOfFunction(Previous, Context, NewFD)) {
11818
NamedDecl *Candidate = Previous.getRepresentativeDecl();
11819
if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
11820
Redeclaration = true;
11821
OldDecl = Candidate;
11822
}
11823
} else {
11824
MayNeedOverloadableChecks = true;
11825
switch (CheckOverload(S, NewFD, Previous, OldDecl,
11826
/*NewIsUsingDecl*/ false)) {
11827
case Ovl_Match:
11828
Redeclaration = true;
11829
break;
11830
11831
case Ovl_NonFunction:
11832
Redeclaration = true;
11833
break;
11834
11835
case Ovl_Overload:
11836
Redeclaration = false;
11837
break;
11838
}
11839
}
11840
}
11841
11842
// Check for a previous extern "C" declaration with this name.
11843
if (!Redeclaration &&
11844
checkForConflictWithNonVisibleExternC(*this, NewFD, Previous)) {
11845
if (!Previous.empty()) {
11846
// This is an extern "C" declaration with the same name as a previous
11847
// declaration, and thus redeclares that entity...
11848
Redeclaration = true;
11849
OldDecl = Previous.getFoundDecl();
11850
MergeTypeWithPrevious = false;
11851
11852
// ... except in the presence of __attribute__((overloadable)).
11853
if (OldDecl->hasAttr<OverloadableAttr>() ||
11854
NewFD->hasAttr<OverloadableAttr>()) {
11855
if (IsOverload(NewFD, cast<FunctionDecl>(OldDecl), false)) {
11856
MayNeedOverloadableChecks = true;
11857
Redeclaration = false;
11858
OldDecl = nullptr;
11859
}
11860
}
11861
}
11862
}
11863
11864
if (CheckMultiVersionFunction(*this, NewFD, Redeclaration, OldDecl, Previous))
11865
return Redeclaration;
11866
11867
// PPC MMA non-pointer types are not allowed as function return types.
11868
if (Context.getTargetInfo().getTriple().isPPC64() &&
11869
PPC().CheckPPCMMAType(NewFD->getReturnType(), NewFD->getLocation())) {
11870
NewFD->setInvalidDecl();
11871
}
11872
11873
CheckConstPureAttributesUsage(*this, NewFD);
11874
11875
// C++ [dcl.spec.auto.general]p12:
11876
// Return type deduction for a templated function with a placeholder in its
11877
// declared type occurs when the definition is instantiated even if the
11878
// function body contains a return statement with a non-type-dependent
11879
// operand.
11880
//
11881
// C++ [temp.dep.expr]p3:
11882
// An id-expression is type-dependent if it is a template-id that is not a
11883
// concept-id and is dependent; or if its terminal name is:
11884
// - [...]
11885
// - associated by name lookup with one or more declarations of member
11886
// functions of a class that is the current instantiation declared with a
11887
// return type that contains a placeholder type,
11888
// - [...]
11889
//
11890
// If this is a templated function with a placeholder in its return type,
11891
// make the placeholder type dependent since it won't be deduced until the
11892
// definition is instantiated. We do this here because it needs to happen
11893
// for implicitly instantiated member functions/member function templates.
11894
if (getLangOpts().CPlusPlus14 &&
11895
(NewFD->isDependentContext() &&
11896
NewFD->getReturnType()->isUndeducedType())) {
11897
const FunctionProtoType *FPT =
11898
NewFD->getType()->castAs<FunctionProtoType>();
11899
QualType NewReturnType = SubstAutoTypeDependent(FPT->getReturnType());
11900
NewFD->setType(Context.getFunctionType(NewReturnType, FPT->getParamTypes(),
11901
FPT->getExtProtoInfo()));
11902
}
11903
11904
// C++11 [dcl.constexpr]p8:
11905
// A constexpr specifier for a non-static member function that is not
11906
// a constructor declares that member function to be const.
11907
//
11908
// This needs to be delayed until we know whether this is an out-of-line
11909
// definition of a static member function.
11910
//
11911
// This rule is not present in C++1y, so we produce a backwards
11912
// compatibility warning whenever it happens in C++11.
11913
CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD);
11914
if (!getLangOpts().CPlusPlus14 && MD && MD->isConstexpr() &&
11915
!MD->isStatic() && !isa<CXXConstructorDecl>(MD) &&
11916
!isa<CXXDestructorDecl>(MD) && !MD->getMethodQualifiers().hasConst()) {
11917
CXXMethodDecl *OldMD = nullptr;
11918
if (OldDecl)
11919
OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->getAsFunction());
11920
if (!OldMD || !OldMD->isStatic()) {
11921
const FunctionProtoType *FPT =
11922
MD->getType()->castAs<FunctionProtoType>();
11923
FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
11924
EPI.TypeQuals.addConst();
11925
MD->setType(Context.getFunctionType(FPT->getReturnType(),
11926
FPT->getParamTypes(), EPI));
11927
11928
// Warn that we did this, if we're not performing template instantiation.
11929
// In that case, we'll have warned already when the template was defined.
11930
if (!inTemplateInstantiation()) {
11931
SourceLocation AddConstLoc;
11932
if (FunctionTypeLoc FTL = MD->getTypeSourceInfo()->getTypeLoc()
11933
.IgnoreParens().getAs<FunctionTypeLoc>())
11934
AddConstLoc = getLocForEndOfToken(FTL.getRParenLoc());
11935
11936
Diag(MD->getLocation(), diag::warn_cxx14_compat_constexpr_not_const)
11937
<< FixItHint::CreateInsertion(AddConstLoc, " const");
11938
}
11939
}
11940
}
11941
11942
if (Redeclaration) {
11943
// NewFD and OldDecl represent declarations that need to be
11944
// merged.
11945
if (MergeFunctionDecl(NewFD, OldDecl, S, MergeTypeWithPrevious,
11946
DeclIsDefn)) {
11947
NewFD->setInvalidDecl();
11948
return Redeclaration;
11949
}
11950
11951
Previous.clear();
11952
Previous.addDecl(OldDecl);
11953
11954
if (FunctionTemplateDecl *OldTemplateDecl =
11955
dyn_cast<FunctionTemplateDecl>(OldDecl)) {
11956
auto *OldFD = OldTemplateDecl->getTemplatedDecl();
11957
FunctionTemplateDecl *NewTemplateDecl
11958
= NewFD->getDescribedFunctionTemplate();
11959
assert(NewTemplateDecl && "Template/non-template mismatch");
11960
11961
// The call to MergeFunctionDecl above may have created some state in
11962
// NewTemplateDecl that needs to be merged with OldTemplateDecl before we
11963
// can add it as a redeclaration.
11964
NewTemplateDecl->mergePrevDecl(OldTemplateDecl);
11965
11966
NewFD->setPreviousDeclaration(OldFD);
11967
if (NewFD->isCXXClassMember()) {
11968
NewFD->setAccess(OldTemplateDecl->getAccess());
11969
NewTemplateDecl->setAccess(OldTemplateDecl->getAccess());
11970
}
11971
11972
// If this is an explicit specialization of a member that is a function
11973
// template, mark it as a member specialization.
11974
if (IsMemberSpecialization &&
11975
NewTemplateDecl->getInstantiatedFromMemberTemplate()) {
11976
NewTemplateDecl->setMemberSpecialization();
11977
assert(OldTemplateDecl->isMemberSpecialization());
11978
// Explicit specializations of a member template do not inherit deleted
11979
// status from the parent member template that they are specializing.
11980
if (OldFD->isDeleted()) {
11981
// FIXME: This assert will not hold in the presence of modules.
11982
assert(OldFD->getCanonicalDecl() == OldFD);
11983
// FIXME: We need an update record for this AST mutation.
11984
OldFD->setDeletedAsWritten(false);
11985
}
11986
}
11987
11988
} else {
11989
if (shouldLinkDependentDeclWithPrevious(NewFD, OldDecl)) {
11990
auto *OldFD = cast<FunctionDecl>(OldDecl);
11991
// This needs to happen first so that 'inline' propagates.
11992
NewFD->setPreviousDeclaration(OldFD);
11993
if (NewFD->isCXXClassMember())
11994
NewFD->setAccess(OldFD->getAccess());
11995
}
11996
}
11997
} else if (!getLangOpts().CPlusPlus && MayNeedOverloadableChecks &&
11998
!NewFD->getAttr<OverloadableAttr>()) {
11999
assert((Previous.empty() ||
12000
llvm::any_of(Previous,
12001
[](const NamedDecl *ND) {
12002
return ND->hasAttr<OverloadableAttr>();
12003
})) &&
12004
"Non-redecls shouldn't happen without overloadable present");
12005
12006
auto OtherUnmarkedIter = llvm::find_if(Previous, [](const NamedDecl *ND) {
12007
const auto *FD = dyn_cast<FunctionDecl>(ND);
12008
return FD && !FD->hasAttr<OverloadableAttr>();
12009
});
12010
12011
if (OtherUnmarkedIter != Previous.end()) {
12012
Diag(NewFD->getLocation(),
12013
diag::err_attribute_overloadable_multiple_unmarked_overloads);
12014
Diag((*OtherUnmarkedIter)->getLocation(),
12015
diag::note_attribute_overloadable_prev_overload)
12016
<< false;
12017
12018
NewFD->addAttr(OverloadableAttr::CreateImplicit(Context));
12019
}
12020
}
12021
12022
if (LangOpts.OpenMP)
12023
OpenMP().ActOnFinishedFunctionDefinitionInOpenMPAssumeScope(NewFD);
12024
12025
// Semantic checking for this function declaration (in isolation).
12026
12027
if (getLangOpts().CPlusPlus) {
12028
// C++-specific checks.
12029
if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(NewFD)) {
12030
CheckConstructor(Constructor);
12031
} else if (CXXDestructorDecl *Destructor =
12032
dyn_cast<CXXDestructorDecl>(NewFD)) {
12033
// We check here for invalid destructor names.
12034
// If we have a friend destructor declaration that is dependent, we can't
12035
// diagnose right away because cases like this are still valid:
12036
// template <class T> struct A { friend T::X::~Y(); };
12037
// struct B { struct Y { ~Y(); }; using X = Y; };
12038
// template struct A<B>;
12039
if (NewFD->getFriendObjectKind() == Decl::FriendObjectKind::FOK_None ||
12040
!Destructor->getFunctionObjectParameterType()->isDependentType()) {
12041
CXXRecordDecl *Record = Destructor->getParent();
12042
QualType ClassType = Context.getTypeDeclType(Record);
12043
12044
DeclarationName Name = Context.DeclarationNames.getCXXDestructorName(
12045
Context.getCanonicalType(ClassType));
12046
if (NewFD->getDeclName() != Name) {
12047
Diag(NewFD->getLocation(), diag::err_destructor_name);
12048
NewFD->setInvalidDecl();
12049
return Redeclaration;
12050
}
12051
}
12052
} else if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12053
if (auto *TD = Guide->getDescribedFunctionTemplate())
12054
CheckDeductionGuideTemplate(TD);
12055
12056
// A deduction guide is not on the list of entities that can be
12057
// explicitly specialized.
12058
if (Guide->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
12059
Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12060
<< /*explicit specialization*/ 1;
12061
}
12062
12063
// Find any virtual functions that this function overrides.
12064
if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(NewFD)) {
12065
if (!Method->isFunctionTemplateSpecialization() &&
12066
!Method->getDescribedFunctionTemplate() &&
12067
Method->isCanonicalDecl()) {
12068
AddOverriddenMethods(Method->getParent(), Method);
12069
}
12070
if (Method->isVirtual() && NewFD->getTrailingRequiresClause())
12071
// C++2a [class.virtual]p6
12072
// A virtual method shall not have a requires-clause.
12073
Diag(NewFD->getTrailingRequiresClause()->getBeginLoc(),
12074
diag::err_constrained_virtual_method);
12075
12076
if (Method->isStatic())
12077
checkThisInStaticMemberFunctionType(Method);
12078
}
12079
12080
if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(NewFD))
12081
ActOnConversionDeclarator(Conversion);
12082
12083
// Extra checking for C++ overloaded operators (C++ [over.oper]).
12084
if (NewFD->isOverloadedOperator() &&
12085
CheckOverloadedOperatorDeclaration(NewFD)) {
12086
NewFD->setInvalidDecl();
12087
return Redeclaration;
12088
}
12089
12090
// Extra checking for C++0x literal operators (C++0x [over.literal]).
12091
if (NewFD->getLiteralIdentifier() &&
12092
CheckLiteralOperatorDeclaration(NewFD)) {
12093
NewFD->setInvalidDecl();
12094
return Redeclaration;
12095
}
12096
12097
// In C++, check default arguments now that we have merged decls. Unless
12098
// the lexical context is the class, because in this case this is done
12099
// during delayed parsing anyway.
12100
if (!CurContext->isRecord())
12101
CheckCXXDefaultArguments(NewFD);
12102
12103
// If this function is declared as being extern "C", then check to see if
12104
// the function returns a UDT (class, struct, or union type) that is not C
12105
// compatible, and if it does, warn the user.
12106
// But, issue any diagnostic on the first declaration only.
12107
if (Previous.empty() && NewFD->isExternC()) {
12108
QualType R = NewFD->getReturnType();
12109
if (R->isIncompleteType() && !R->isVoidType())
12110
Diag(NewFD->getLocation(), diag::warn_return_value_udt_incomplete)
12111
<< NewFD << R;
12112
else if (!R.isPODType(Context) && !R->isVoidType() &&
12113
!R->isObjCObjectPointerType())
12114
Diag(NewFD->getLocation(), diag::warn_return_value_udt) << NewFD << R;
12115
}
12116
12117
// C++1z [dcl.fct]p6:
12118
// [...] whether the function has a non-throwing exception-specification
12119
// [is] part of the function type
12120
//
12121
// This results in an ABI break between C++14 and C++17 for functions whose
12122
// declared type includes an exception-specification in a parameter or
12123
// return type. (Exception specifications on the function itself are OK in
12124
// most cases, and exception specifications are not permitted in most other
12125
// contexts where they could make it into a mangling.)
12126
if (!getLangOpts().CPlusPlus17 && !NewFD->getPrimaryTemplate()) {
12127
auto HasNoexcept = [&](QualType T) -> bool {
12128
// Strip off declarator chunks that could be between us and a function
12129
// type. We don't need to look far, exception specifications are very
12130
// restricted prior to C++17.
12131
if (auto *RT = T->getAs<ReferenceType>())
12132
T = RT->getPointeeType();
12133
else if (T->isAnyPointerType())
12134
T = T->getPointeeType();
12135
else if (auto *MPT = T->getAs<MemberPointerType>())
12136
T = MPT->getPointeeType();
12137
if (auto *FPT = T->getAs<FunctionProtoType>())
12138
if (FPT->isNothrow())
12139
return true;
12140
return false;
12141
};
12142
12143
auto *FPT = NewFD->getType()->castAs<FunctionProtoType>();
12144
bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12145
for (QualType T : FPT->param_types())
12146
AnyNoexcept |= HasNoexcept(T);
12147
if (AnyNoexcept)
12148
Diag(NewFD->getLocation(),
12149
diag::warn_cxx17_compat_exception_spec_in_signature)
12150
<< NewFD;
12151
}
12152
12153
if (!Redeclaration && LangOpts.CUDA)
12154
CUDA().checkTargetOverload(NewFD, Previous);
12155
}
12156
12157
// Check if the function definition uses any AArch64 SME features without
12158
// having the '+sme' feature enabled and warn user if sme locally streaming
12159
// function returns or uses arguments with VL-based types.
12160
if (DeclIsDefn) {
12161
const auto *Attr = NewFD->getAttr<ArmNewAttr>();
12162
bool UsesSM = NewFD->hasAttr<ArmLocallyStreamingAttr>();
12163
bool UsesZA = Attr && Attr->isNewZA();
12164
bool UsesZT0 = Attr && Attr->isNewZT0();
12165
12166
if (NewFD->hasAttr<ArmLocallyStreamingAttr>()) {
12167
if (NewFD->getReturnType()->isSizelessVectorType())
12168
Diag(NewFD->getLocation(),
12169
diag::warn_sme_locally_streaming_has_vl_args_returns)
12170
<< /*IsArg=*/false;
12171
if (llvm::any_of(NewFD->parameters(), [](ParmVarDecl *P) {
12172
return P->getOriginalType()->isSizelessVectorType();
12173
}))
12174
Diag(NewFD->getLocation(),
12175
diag::warn_sme_locally_streaming_has_vl_args_returns)
12176
<< /*IsArg=*/true;
12177
}
12178
if (const auto *FPT = NewFD->getType()->getAs<FunctionProtoType>()) {
12179
FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
12180
UsesSM |=
12181
EPI.AArch64SMEAttributes & FunctionType::SME_PStateSMEnabledMask;
12182
UsesZA |= FunctionType::getArmZAState(EPI.AArch64SMEAttributes) !=
12183
FunctionType::ARM_None;
12184
UsesZT0 |= FunctionType::getArmZT0State(EPI.AArch64SMEAttributes) !=
12185
FunctionType::ARM_None;
12186
}
12187
12188
if (UsesSM || UsesZA) {
12189
llvm::StringMap<bool> FeatureMap;
12190
Context.getFunctionFeatureMap(FeatureMap, NewFD);
12191
if (!FeatureMap.contains("sme")) {
12192
if (UsesSM)
12193
Diag(NewFD->getLocation(),
12194
diag::err_sme_definition_using_sm_in_non_sme_target);
12195
else
12196
Diag(NewFD->getLocation(),
12197
diag::err_sme_definition_using_za_in_non_sme_target);
12198
}
12199
}
12200
if (UsesZT0) {
12201
llvm::StringMap<bool> FeatureMap;
12202
Context.getFunctionFeatureMap(FeatureMap, NewFD);
12203
if (!FeatureMap.contains("sme2")) {
12204
Diag(NewFD->getLocation(),
12205
diag::err_sme_definition_using_zt0_in_non_sme2_target);
12206
}
12207
}
12208
}
12209
12210
return Redeclaration;
12211
}
12212
12213
void Sema::CheckMain(FunctionDecl* FD, const DeclSpec& DS) {
12214
// C++11 [basic.start.main]p3:
12215
// A program that [...] declares main to be inline, static or
12216
// constexpr is ill-formed.
12217
// C11 6.7.4p4: In a hosted environment, no function specifier(s) shall
12218
// appear in a declaration of main.
12219
// static main is not an error under C99, but we should warn about it.
12220
// We accept _Noreturn main as an extension.
12221
if (FD->getStorageClass() == SC_Static)
12222
Diag(DS.getStorageClassSpecLoc(), getLangOpts().CPlusPlus
12223
? diag::err_static_main : diag::warn_static_main)
12224
<< FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());
12225
if (FD->isInlineSpecified())
12226
Diag(DS.getInlineSpecLoc(), diag::err_inline_main)
12227
<< FixItHint::CreateRemoval(DS.getInlineSpecLoc());
12228
if (DS.isNoreturnSpecified()) {
12229
SourceLocation NoreturnLoc = DS.getNoreturnSpecLoc();
12230
SourceRange NoreturnRange(NoreturnLoc, getLocForEndOfToken(NoreturnLoc));
12231
Diag(NoreturnLoc, diag::ext_noreturn_main);
12232
Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12233
<< FixItHint::CreateRemoval(NoreturnRange);
12234
}
12235
if (FD->isConstexpr()) {
12236
Diag(DS.getConstexprSpecLoc(), diag::err_constexpr_main)
12237
<< FD->isConsteval()
12238
<< FixItHint::CreateRemoval(DS.getConstexprSpecLoc());
12239
FD->setConstexprKind(ConstexprSpecKind::Unspecified);
12240
}
12241
12242
if (getLangOpts().OpenCL) {
12243
Diag(FD->getLocation(), diag::err_opencl_no_main)
12244
<< FD->hasAttr<OpenCLKernelAttr>();
12245
FD->setInvalidDecl();
12246
return;
12247
}
12248
12249
// Functions named main in hlsl are default entries, but don't have specific
12250
// signatures they are required to conform to.
12251
if (getLangOpts().HLSL)
12252
return;
12253
12254
QualType T = FD->getType();
12255
assert(T->isFunctionType() && "function decl is not of function type");
12256
const FunctionType* FT = T->castAs<FunctionType>();
12257
12258
// Set default calling convention for main()
12259
if (FT->getCallConv() != CC_C) {
12260
FT = Context.adjustFunctionType(FT, FT->getExtInfo().withCallingConv(CC_C));
12261
FD->setType(QualType(FT, 0));
12262
T = Context.getCanonicalType(FD->getType());
12263
}
12264
12265
if (getLangOpts().GNUMode && !getLangOpts().CPlusPlus) {
12266
// In C with GNU extensions we allow main() to have non-integer return
12267
// type, but we should warn about the extension, and we disable the
12268
// implicit-return-zero rule.
12269
12270
// GCC in C mode accepts qualified 'int'.
12271
if (Context.hasSameUnqualifiedType(FT->getReturnType(), Context.IntTy))
12272
FD->setHasImplicitReturnZero(true);
12273
else {
12274
Diag(FD->getTypeSpecStartLoc(), diag::ext_main_returns_nonint);
12275
SourceRange RTRange = FD->getReturnTypeSourceRange();
12276
if (RTRange.isValid())
12277
Diag(RTRange.getBegin(), diag::note_main_change_return_type)
12278
<< FixItHint::CreateReplacement(RTRange, "int");
12279
}
12280
} else {
12281
// In C and C++, main magically returns 0 if you fall off the end;
12282
// set the flag which tells us that.
12283
// This is C++ [basic.start.main]p5 and C99 5.1.2.2.3.
12284
12285
// All the standards say that main() should return 'int'.
12286
if (Context.hasSameType(FT->getReturnType(), Context.IntTy))
12287
FD->setHasImplicitReturnZero(true);
12288
else {
12289
// Otherwise, this is just a flat-out error.
12290
SourceRange RTRange = FD->getReturnTypeSourceRange();
12291
Diag(FD->getTypeSpecStartLoc(), diag::err_main_returns_nonint)
12292
<< (RTRange.isValid() ? FixItHint::CreateReplacement(RTRange, "int")
12293
: FixItHint());
12294
FD->setInvalidDecl(true);
12295
}
12296
}
12297
12298
// Treat protoless main() as nullary.
12299
if (isa<FunctionNoProtoType>(FT)) return;
12300
12301
const FunctionProtoType* FTP = cast<const FunctionProtoType>(FT);
12302
unsigned nparams = FTP->getNumParams();
12303
assert(FD->getNumParams() == nparams);
12304
12305
bool HasExtraParameters = (nparams > 3);
12306
12307
if (FTP->isVariadic()) {
12308
Diag(FD->getLocation(), diag::ext_variadic_main);
12309
// FIXME: if we had information about the location of the ellipsis, we
12310
// could add a FixIt hint to remove it as a parameter.
12311
}
12312
12313
// Darwin passes an undocumented fourth argument of type char**. If
12314
// other platforms start sprouting these, the logic below will start
12315
// getting shifty.
12316
if (nparams == 4 && Context.getTargetInfo().getTriple().isOSDarwin())
12317
HasExtraParameters = false;
12318
12319
if (HasExtraParameters) {
12320
Diag(FD->getLocation(), diag::err_main_surplus_args) << nparams;
12321
FD->setInvalidDecl(true);
12322
nparams = 3;
12323
}
12324
12325
// FIXME: a lot of the following diagnostics would be improved
12326
// if we had some location information about types.
12327
12328
QualType CharPP =
12329
Context.getPointerType(Context.getPointerType(Context.CharTy));
12330
QualType Expected[] = { Context.IntTy, CharPP, CharPP, CharPP };
12331
12332
for (unsigned i = 0; i < nparams; ++i) {
12333
QualType AT = FTP->getParamType(i);
12334
12335
bool mismatch = true;
12336
12337
if (Context.hasSameUnqualifiedType(AT, Expected[i]))
12338
mismatch = false;
12339
else if (Expected[i] == CharPP) {
12340
// As an extension, the following forms are okay:
12341
// char const **
12342
// char const * const *
12343
// char * const *
12344
12345
QualifierCollector qs;
12346
const PointerType* PT;
12347
if ((PT = qs.strip(AT)->getAs<PointerType>()) &&
12348
(PT = qs.strip(PT->getPointeeType())->getAs<PointerType>()) &&
12349
Context.hasSameType(QualType(qs.strip(PT->getPointeeType()), 0),
12350
Context.CharTy)) {
12351
qs.removeConst();
12352
mismatch = !qs.empty();
12353
}
12354
}
12355
12356
if (mismatch) {
12357
Diag(FD->getLocation(), diag::err_main_arg_wrong) << i << Expected[i];
12358
// TODO: suggest replacing given type with expected type
12359
FD->setInvalidDecl(true);
12360
}
12361
}
12362
12363
if (nparams == 1 && !FD->isInvalidDecl()) {
12364
Diag(FD->getLocation(), diag::warn_main_one_arg);
12365
}
12366
12367
if (!FD->isInvalidDecl() && FD->getDescribedFunctionTemplate()) {
12368
Diag(FD->getLocation(), diag::err_mainlike_template_decl) << FD;
12369
FD->setInvalidDecl();
12370
}
12371
}
12372
12373
static bool isDefaultStdCall(FunctionDecl *FD, Sema &S) {
12374
12375
// Default calling convention for main and wmain is __cdecl
12376
if (FD->getName() == "main" || FD->getName() == "wmain")
12377
return false;
12378
12379
// Default calling convention for MinGW is __cdecl
12380
const llvm::Triple &T = S.Context.getTargetInfo().getTriple();
12381
if (T.isWindowsGNUEnvironment())
12382
return false;
12383
12384
// Default calling convention for WinMain, wWinMain and DllMain
12385
// is __stdcall on 32 bit Windows
12386
if (T.isOSWindows() && T.getArch() == llvm::Triple::x86)
12387
return true;
12388
12389
return false;
12390
}
12391
12392
void Sema::CheckMSVCRTEntryPoint(FunctionDecl *FD) {
12393
QualType T = FD->getType();
12394
assert(T->isFunctionType() && "function decl is not of function type");
12395
const FunctionType *FT = T->castAs<FunctionType>();
12396
12397
// Set an implicit return of 'zero' if the function can return some integral,
12398
// enumeration, pointer or nullptr type.
12399
if (FT->getReturnType()->isIntegralOrEnumerationType() ||
12400
FT->getReturnType()->isAnyPointerType() ||
12401
FT->getReturnType()->isNullPtrType())
12402
// DllMain is exempt because a return value of zero means it failed.
12403
if (FD->getName() != "DllMain")
12404
FD->setHasImplicitReturnZero(true);
12405
12406
// Explicitly specified calling conventions are applied to MSVC entry points
12407
if (!hasExplicitCallingConv(T)) {
12408
if (isDefaultStdCall(FD, *this)) {
12409
if (FT->getCallConv() != CC_X86StdCall) {
12410
FT = Context.adjustFunctionType(
12411
FT, FT->getExtInfo().withCallingConv(CC_X86StdCall));
12412
FD->setType(QualType(FT, 0));
12413
}
12414
} else if (FT->getCallConv() != CC_C) {
12415
FT = Context.adjustFunctionType(FT,
12416
FT->getExtInfo().withCallingConv(CC_C));
12417
FD->setType(QualType(FT, 0));
12418
}
12419
}
12420
12421
if (!FD->isInvalidDecl() && FD->getDescribedFunctionTemplate()) {
12422
Diag(FD->getLocation(), diag::err_mainlike_template_decl) << FD;
12423
FD->setInvalidDecl();
12424
}
12425
}
12426
12427
bool Sema::CheckForConstantInitializer(Expr *Init, unsigned DiagID) {
12428
// FIXME: Need strict checking. In C89, we need to check for
12429
// any assignment, increment, decrement, function-calls, or
12430
// commas outside of a sizeof. In C99, it's the same list,
12431
// except that the aforementioned are allowed in unevaluated
12432
// expressions. Everything else falls under the
12433
// "may accept other forms of constant expressions" exception.
12434
//
12435
// Regular C++ code will not end up here (exceptions: language extensions,
12436
// OpenCL C++ etc), so the constant expression rules there don't matter.
12437
if (Init->isValueDependent()) {
12438
assert(Init->containsErrors() &&
12439
"Dependent code should only occur in error-recovery path.");
12440
return true;
12441
}
12442
const Expr *Culprit;
12443
if (Init->isConstantInitializer(Context, false, &Culprit))
12444
return false;
12445
Diag(Culprit->getExprLoc(), DiagID) << Culprit->getSourceRange();
12446
return true;
12447
}
12448
12449
namespace {
12450
// Visits an initialization expression to see if OrigDecl is evaluated in
12451
// its own initialization and throws a warning if it does.
12452
class SelfReferenceChecker
12453
: public EvaluatedExprVisitor<SelfReferenceChecker> {
12454
Sema &S;
12455
Decl *OrigDecl;
12456
bool isRecordType;
12457
bool isPODType;
12458
bool isReferenceType;
12459
12460
bool isInitList;
12461
llvm::SmallVector<unsigned, 4> InitFieldIndex;
12462
12463
public:
12464
typedef EvaluatedExprVisitor<SelfReferenceChecker> Inherited;
12465
12466
SelfReferenceChecker(Sema &S, Decl *OrigDecl) : Inherited(S.Context),
12467
S(S), OrigDecl(OrigDecl) {
12468
isPODType = false;
12469
isRecordType = false;
12470
isReferenceType = false;
12471
isInitList = false;
12472
if (ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12473
isPODType = VD->getType().isPODType(S.Context);
12474
isRecordType = VD->getType()->isRecordType();
12475
isReferenceType = VD->getType()->isReferenceType();
12476
}
12477
}
12478
12479
// For most expressions, just call the visitor. For initializer lists,
12480
// track the index of the field being initialized since fields are
12481
// initialized in order allowing use of previously initialized fields.
12482
void CheckExpr(Expr *E) {
12483
InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12484
if (!InitList) {
12485
Visit(E);
12486
return;
12487
}
12488
12489
// Track and increment the index here.
12490
isInitList = true;
12491
InitFieldIndex.push_back(0);
12492
for (auto *Child : InitList->children()) {
12493
CheckExpr(cast<Expr>(Child));
12494
++InitFieldIndex.back();
12495
}
12496
InitFieldIndex.pop_back();
12497
}
12498
12499
// Returns true if MemberExpr is checked and no further checking is needed.
12500
// Returns false if additional checking is required.
12501
bool CheckInitListMemberExpr(MemberExpr *E, bool CheckReference) {
12502
llvm::SmallVector<FieldDecl*, 4> Fields;
12503
Expr *Base = E;
12504
bool ReferenceField = false;
12505
12506
// Get the field members used.
12507
while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12508
FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12509
if (!FD)
12510
return false;
12511
Fields.push_back(FD);
12512
if (FD->getType()->isReferenceType())
12513
ReferenceField = true;
12514
Base = ME->getBase()->IgnoreParenImpCasts();
12515
}
12516
12517
// Keep checking only if the base Decl is the same.
12518
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
12519
if (!DRE || DRE->getDecl() != OrigDecl)
12520
return false;
12521
12522
// A reference field can be bound to an unininitialized field.
12523
if (CheckReference && !ReferenceField)
12524
return true;
12525
12526
// Convert FieldDecls to their index number.
12527
llvm::SmallVector<unsigned, 4> UsedFieldIndex;
12528
for (const FieldDecl *I : llvm::reverse(Fields))
12529
UsedFieldIndex.push_back(I->getFieldIndex());
12530
12531
// See if a warning is needed by checking the first difference in index
12532
// numbers. If field being used has index less than the field being
12533
// initialized, then the use is safe.
12534
for (auto UsedIter = UsedFieldIndex.begin(),
12535
UsedEnd = UsedFieldIndex.end(),
12536
OrigIter = InitFieldIndex.begin(),
12537
OrigEnd = InitFieldIndex.end();
12538
UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
12539
if (*UsedIter < *OrigIter)
12540
return true;
12541
if (*UsedIter > *OrigIter)
12542
break;
12543
}
12544
12545
// TODO: Add a different warning which will print the field names.
12546
HandleDeclRefExpr(DRE);
12547
return true;
12548
}
12549
12550
// For most expressions, the cast is directly above the DeclRefExpr.
12551
// For conditional operators, the cast can be outside the conditional
12552
// operator if both expressions are DeclRefExpr's.
12553
void HandleValue(Expr *E) {
12554
E = E->IgnoreParens();
12555
if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
12556
HandleDeclRefExpr(DRE);
12557
return;
12558
}
12559
12560
if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
12561
Visit(CO->getCond());
12562
HandleValue(CO->getTrueExpr());
12563
HandleValue(CO->getFalseExpr());
12564
return;
12565
}
12566
12567
if (BinaryConditionalOperator *BCO =
12568
dyn_cast<BinaryConditionalOperator>(E)) {
12569
Visit(BCO->getCond());
12570
HandleValue(BCO->getFalseExpr());
12571
return;
12572
}
12573
12574
if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
12575
if (Expr *SE = OVE->getSourceExpr())
12576
HandleValue(SE);
12577
return;
12578
}
12579
12580
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
12581
if (BO->getOpcode() == BO_Comma) {
12582
Visit(BO->getLHS());
12583
HandleValue(BO->getRHS());
12584
return;
12585
}
12586
}
12587
12588
if (isa<MemberExpr>(E)) {
12589
if (isInitList) {
12590
if (CheckInitListMemberExpr(cast<MemberExpr>(E),
12591
false /*CheckReference*/))
12592
return;
12593
}
12594
12595
Expr *Base = E->IgnoreParenImpCasts();
12596
while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12597
// Check for static member variables and don't warn on them.
12598
if (!isa<FieldDecl>(ME->getMemberDecl()))
12599
return;
12600
Base = ME->getBase()->IgnoreParenImpCasts();
12601
}
12602
if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
12603
HandleDeclRefExpr(DRE);
12604
return;
12605
}
12606
12607
Visit(E);
12608
}
12609
12610
// Reference types not handled in HandleValue are handled here since all
12611
// uses of references are bad, not just r-value uses.
12612
void VisitDeclRefExpr(DeclRefExpr *E) {
12613
if (isReferenceType)
12614
HandleDeclRefExpr(E);
12615
}
12616
12617
void VisitImplicitCastExpr(ImplicitCastExpr *E) {
12618
if (E->getCastKind() == CK_LValueToRValue) {
12619
HandleValue(E->getSubExpr());
12620
return;
12621
}
12622
12623
Inherited::VisitImplicitCastExpr(E);
12624
}
12625
12626
void VisitMemberExpr(MemberExpr *E) {
12627
if (isInitList) {
12628
if (CheckInitListMemberExpr(E, true /*CheckReference*/))
12629
return;
12630
}
12631
12632
// Don't warn on arrays since they can be treated as pointers.
12633
if (E->getType()->canDecayToPointerType()) return;
12634
12635
// Warn when a non-static method call is followed by non-static member
12636
// field accesses, which is followed by a DeclRefExpr.
12637
CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->getMemberDecl());
12638
bool Warn = (MD && !MD->isStatic());
12639
Expr *Base = E->getBase()->IgnoreParenImpCasts();
12640
while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12641
if (!isa<FieldDecl>(ME->getMemberDecl()))
12642
Warn = false;
12643
Base = ME->getBase()->IgnoreParenImpCasts();
12644
}
12645
12646
if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
12647
if (Warn)
12648
HandleDeclRefExpr(DRE);
12649
return;
12650
}
12651
12652
// The base of a MemberExpr is not a MemberExpr or a DeclRefExpr.
12653
// Visit that expression.
12654
Visit(Base);
12655
}
12656
12657
void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
12658
Expr *Callee = E->getCallee();
12659
12660
if (isa<UnresolvedLookupExpr>(Callee))
12661
return Inherited::VisitCXXOperatorCallExpr(E);
12662
12663
Visit(Callee);
12664
for (auto Arg: E->arguments())
12665
HandleValue(Arg->IgnoreParenImpCasts());
12666
}
12667
12668
void VisitUnaryOperator(UnaryOperator *E) {
12669
// For POD record types, addresses of its own members are well-defined.
12670
if (E->getOpcode() == UO_AddrOf && isRecordType &&
12671
isa<MemberExpr>(E->getSubExpr()->IgnoreParens())) {
12672
if (!isPODType)
12673
HandleValue(E->getSubExpr());
12674
return;
12675
}
12676
12677
if (E->isIncrementDecrementOp()) {
12678
HandleValue(E->getSubExpr());
12679
return;
12680
}
12681
12682
Inherited::VisitUnaryOperator(E);
12683
}
12684
12685
void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
12686
12687
void VisitCXXConstructExpr(CXXConstructExpr *E) {
12688
if (E->getConstructor()->isCopyConstructor()) {
12689
Expr *ArgExpr = E->getArg(0);
12690
if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
12691
if (ILE->getNumInits() == 1)
12692
ArgExpr = ILE->getInit(0);
12693
if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
12694
if (ICE->getCastKind() == CK_NoOp)
12695
ArgExpr = ICE->getSubExpr();
12696
HandleValue(ArgExpr);
12697
return;
12698
}
12699
Inherited::VisitCXXConstructExpr(E);
12700
}
12701
12702
void VisitCallExpr(CallExpr *E) {
12703
// Treat std::move as a use.
12704
if (E->isCallToStdMove()) {
12705
HandleValue(E->getArg(0));
12706
return;
12707
}
12708
12709
Inherited::VisitCallExpr(E);
12710
}
12711
12712
void VisitBinaryOperator(BinaryOperator *E) {
12713
if (E->isCompoundAssignmentOp()) {
12714
HandleValue(E->getLHS());
12715
Visit(E->getRHS());
12716
return;
12717
}
12718
12719
Inherited::VisitBinaryOperator(E);
12720
}
12721
12722
// A custom visitor for BinaryConditionalOperator is needed because the
12723
// regular visitor would check the condition and true expression separately
12724
// but both point to the same place giving duplicate diagnostics.
12725
void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
12726
Visit(E->getCond());
12727
Visit(E->getFalseExpr());
12728
}
12729
12730
void HandleDeclRefExpr(DeclRefExpr *DRE) {
12731
Decl* ReferenceDecl = DRE->getDecl();
12732
if (OrigDecl != ReferenceDecl) return;
12733
unsigned diag;
12734
if (isReferenceType) {
12735
diag = diag::warn_uninit_self_reference_in_reference_init;
12736
} else if (cast<VarDecl>(OrigDecl)->isStaticLocal()) {
12737
diag = diag::warn_static_self_reference_in_init;
12738
} else if (isa<TranslationUnitDecl>(OrigDecl->getDeclContext()) ||
12739
isa<NamespaceDecl>(OrigDecl->getDeclContext()) ||
12740
DRE->getDecl()->getType()->isRecordType()) {
12741
diag = diag::warn_uninit_self_reference_in_init;
12742
} else {
12743
// Local variables will be handled by the CFG analysis.
12744
return;
12745
}
12746
12747
S.DiagRuntimeBehavior(DRE->getBeginLoc(), DRE,
12748
S.PDiag(diag)
12749
<< DRE->getDecl() << OrigDecl->getLocation()
12750
<< DRE->getSourceRange());
12751
}
12752
};
12753
12754
/// CheckSelfReference - Warns if OrigDecl is used in expression E.
12755
static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
12756
bool DirectInit) {
12757
// Parameters arguments are occassionially constructed with itself,
12758
// for instance, in recursive functions. Skip them.
12759
if (isa<ParmVarDecl>(OrigDecl))
12760
return;
12761
12762
E = E->IgnoreParens();
12763
12764
// Skip checking T a = a where T is not a record or reference type.
12765
// Doing so is a way to silence uninitialized warnings.
12766
if (!DirectInit && !cast<VarDecl>(OrigDecl)->getType()->isRecordType())
12767
if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
12768
if (ICE->getCastKind() == CK_LValueToRValue)
12769
if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
12770
if (DRE->getDecl() == OrigDecl)
12771
return;
12772
12773
SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
12774
}
12775
} // end anonymous namespace
12776
12777
namespace {
12778
// Simple wrapper to add the name of a variable or (if no variable is
12779
// available) a DeclarationName into a diagnostic.
12780
struct VarDeclOrName {
12781
VarDecl *VDecl;
12782
DeclarationName Name;
12783
12784
friend const Sema::SemaDiagnosticBuilder &
12785
operator<<(const Sema::SemaDiagnosticBuilder &Diag, VarDeclOrName VN) {
12786
return VN.VDecl ? Diag << VN.VDecl : Diag << VN.Name;
12787
}
12788
};
12789
} // end anonymous namespace
12790
12791
QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl,
12792
DeclarationName Name, QualType Type,
12793
TypeSourceInfo *TSI,
12794
SourceRange Range, bool DirectInit,
12795
Expr *Init) {
12796
bool IsInitCapture = !VDecl;
12797
assert((!VDecl || !VDecl->isInitCapture()) &&
12798
"init captures are expected to be deduced prior to initialization");
12799
12800
VarDeclOrName VN{VDecl, Name};
12801
12802
DeducedType *Deduced = Type->getContainedDeducedType();
12803
assert(Deduced && "deduceVarTypeFromInitializer for non-deduced type");
12804
12805
// Diagnose auto array declarations in C23, unless it's a supported extension.
12806
if (getLangOpts().C23 && Type->isArrayType() &&
12807
!isa_and_present<StringLiteral, InitListExpr>(Init)) {
12808
Diag(Range.getBegin(), diag::err_auto_not_allowed)
12809
<< (int)Deduced->getContainedAutoType()->getKeyword()
12810
<< /*in array decl*/ 23 << Range;
12811
return QualType();
12812
}
12813
12814
// C++11 [dcl.spec.auto]p3
12815
if (!Init) {
12816
assert(VDecl && "no init for init capture deduction?");
12817
12818
// Except for class argument deduction, and then for an initializing
12819
// declaration only, i.e. no static at class scope or extern.
12820
if (!isa<DeducedTemplateSpecializationType>(Deduced) ||
12821
VDecl->hasExternalStorage() ||
12822
VDecl->isStaticDataMember()) {
12823
Diag(VDecl->getLocation(), diag::err_auto_var_requires_init)
12824
<< VDecl->getDeclName() << Type;
12825
return QualType();
12826
}
12827
}
12828
12829
ArrayRef<Expr*> DeduceInits;
12830
if (Init)
12831
DeduceInits = Init;
12832
12833
auto *PL = dyn_cast_if_present<ParenListExpr>(Init);
12834
if (DirectInit && PL)
12835
DeduceInits = PL->exprs();
12836
12837
if (isa<DeducedTemplateSpecializationType>(Deduced)) {
12838
assert(VDecl && "non-auto type for init capture deduction?");
12839
InitializedEntity Entity = InitializedEntity::InitializeVariable(VDecl);
12840
InitializationKind Kind = InitializationKind::CreateForInit(
12841
VDecl->getLocation(), DirectInit, Init);
12842
// FIXME: Initialization should not be taking a mutable list of inits.
12843
SmallVector<Expr*, 8> InitsCopy(DeduceInits.begin(), DeduceInits.end());
12844
return DeduceTemplateSpecializationFromInitializer(TSI, Entity, Kind,
12845
InitsCopy);
12846
}
12847
12848
if (DirectInit) {
12849
if (auto *IL = dyn_cast<InitListExpr>(Init))
12850
DeduceInits = IL->inits();
12851
}
12852
12853
// Deduction only works if we have exactly one source expression.
12854
if (DeduceInits.empty()) {
12855
// It isn't possible to write this directly, but it is possible to
12856
// end up in this situation with "auto x(some_pack...);"
12857
Diag(Init->getBeginLoc(), IsInitCapture
12858
? diag::err_init_capture_no_expression
12859
: diag::err_auto_var_init_no_expression)
12860
<< VN << Type << Range;
12861
return QualType();
12862
}
12863
12864
if (DeduceInits.size() > 1) {
12865
Diag(DeduceInits[1]->getBeginLoc(),
12866
IsInitCapture ? diag::err_init_capture_multiple_expressions
12867
: diag::err_auto_var_init_multiple_expressions)
12868
<< VN << Type << Range;
12869
return QualType();
12870
}
12871
12872
Expr *DeduceInit = DeduceInits[0];
12873
if (DirectInit && isa<InitListExpr>(DeduceInit)) {
12874
Diag(Init->getBeginLoc(), IsInitCapture
12875
? diag::err_init_capture_paren_braces
12876
: diag::err_auto_var_init_paren_braces)
12877
<< isa<InitListExpr>(Init) << VN << Type << Range;
12878
return QualType();
12879
}
12880
12881
// Expressions default to 'id' when we're in a debugger.
12882
bool DefaultedAnyToId = false;
12883
if (getLangOpts().DebuggerCastResultToId &&
12884
Init->getType() == Context.UnknownAnyTy && !IsInitCapture) {
12885
ExprResult Result = forceUnknownAnyToType(Init, Context.getObjCIdType());
12886
if (Result.isInvalid()) {
12887
return QualType();
12888
}
12889
Init = Result.get();
12890
DefaultedAnyToId = true;
12891
}
12892
12893
// C++ [dcl.decomp]p1:
12894
// If the assignment-expression [...] has array type A and no ref-qualifier
12895
// is present, e has type cv A
12896
if (VDecl && isa<DecompositionDecl>(VDecl) &&
12897
Context.hasSameUnqualifiedType(Type, Context.getAutoDeductType()) &&
12898
DeduceInit->getType()->isConstantArrayType())
12899
return Context.getQualifiedType(DeduceInit->getType(),
12900
Type.getQualifiers());
12901
12902
QualType DeducedType;
12903
TemplateDeductionInfo Info(DeduceInit->getExprLoc());
12904
TemplateDeductionResult Result =
12905
DeduceAutoType(TSI->getTypeLoc(), DeduceInit, DeducedType, Info);
12906
if (Result != TemplateDeductionResult::Success &&
12907
Result != TemplateDeductionResult::AlreadyDiagnosed) {
12908
if (!IsInitCapture)
12909
DiagnoseAutoDeductionFailure(VDecl, DeduceInit);
12910
else if (isa<InitListExpr>(Init))
12911
Diag(Range.getBegin(),
12912
diag::err_init_capture_deduction_failure_from_init_list)
12913
<< VN
12914
<< (DeduceInit->getType().isNull() ? TSI->getType()
12915
: DeduceInit->getType())
12916
<< DeduceInit->getSourceRange();
12917
else
12918
Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
12919
<< VN << TSI->getType()
12920
<< (DeduceInit->getType().isNull() ? TSI->getType()
12921
: DeduceInit->getType())
12922
<< DeduceInit->getSourceRange();
12923
}
12924
12925
// Warn if we deduced 'id'. 'auto' usually implies type-safety, but using
12926
// 'id' instead of a specific object type prevents most of our usual
12927
// checks.
12928
// We only want to warn outside of template instantiations, though:
12929
// inside a template, the 'id' could have come from a parameter.
12930
if (!inTemplateInstantiation() && !DefaultedAnyToId && !IsInitCapture &&
12931
!DeducedType.isNull() && DeducedType->isObjCIdType()) {
12932
SourceLocation Loc = TSI->getTypeLoc().getBeginLoc();
12933
Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
12934
}
12935
12936
return DeducedType;
12937
}
12938
12939
bool Sema::DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit,
12940
Expr *Init) {
12941
assert(!Init || !Init->containsErrors());
12942
QualType DeducedType = deduceVarTypeFromInitializer(
12943
VDecl, VDecl->getDeclName(), VDecl->getType(), VDecl->getTypeSourceInfo(),
12944
VDecl->getSourceRange(), DirectInit, Init);
12945
if (DeducedType.isNull()) {
12946
VDecl->setInvalidDecl();
12947
return true;
12948
}
12949
12950
VDecl->setType(DeducedType);
12951
assert(VDecl->isLinkageValid());
12952
12953
// In ARC, infer lifetime.
12954
if (getLangOpts().ObjCAutoRefCount && ObjC().inferObjCARCLifetime(VDecl))
12955
VDecl->setInvalidDecl();
12956
12957
if (getLangOpts().OpenCL)
12958
deduceOpenCLAddressSpace(VDecl);
12959
12960
// If this is a redeclaration, check that the type we just deduced matches
12961
// the previously declared type.
12962
if (VarDecl *Old = VDecl->getPreviousDecl()) {
12963
// We never need to merge the type, because we cannot form an incomplete
12964
// array of auto, nor deduce such a type.
12965
MergeVarDeclTypes(VDecl, Old, /*MergeTypeWithPrevious*/ false);
12966
}
12967
12968
// Check the deduced type is valid for a variable declaration.
12969
CheckVariableDeclarationType(VDecl);
12970
return VDecl->isInvalidDecl();
12971
}
12972
12973
void Sema::checkNonTrivialCUnionInInitializer(const Expr *Init,
12974
SourceLocation Loc) {
12975
if (auto *EWC = dyn_cast<ExprWithCleanups>(Init))
12976
Init = EWC->getSubExpr();
12977
12978
if (auto *CE = dyn_cast<ConstantExpr>(Init))
12979
Init = CE->getSubExpr();
12980
12981
QualType InitType = Init->getType();
12982
assert((InitType.hasNonTrivialToPrimitiveDefaultInitializeCUnion() ||
12983
InitType.hasNonTrivialToPrimitiveCopyCUnion()) &&
12984
"shouldn't be called if type doesn't have a non-trivial C struct");
12985
if (auto *ILE = dyn_cast<InitListExpr>(Init)) {
12986
for (auto *I : ILE->inits()) {
12987
if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
12988
!I->getType().hasNonTrivialToPrimitiveCopyCUnion())
12989
continue;
12990
SourceLocation SL = I->getExprLoc();
12991
checkNonTrivialCUnionInInitializer(I, SL.isValid() ? SL : Loc);
12992
}
12993
return;
12994
}
12995
12996
if (isa<ImplicitValueInitExpr>(Init)) {
12997
if (InitType.hasNonTrivialToPrimitiveDefaultInitializeCUnion())
12998
checkNonTrivialCUnion(InitType, Loc, NTCUC_DefaultInitializedObject,
12999
NTCUK_Init);
13000
} else {
13001
// Assume all other explicit initializers involving copying some existing
13002
// object.
13003
// TODO: ignore any explicit initializers where we can guarantee
13004
// copy-elision.
13005
if (InitType.hasNonTrivialToPrimitiveCopyCUnion())
13006
checkNonTrivialCUnion(InitType, Loc, NTCUC_CopyInit, NTCUK_Copy);
13007
}
13008
}
13009
13010
namespace {
13011
13012
bool shouldIgnoreForRecordTriviality(const FieldDecl *FD) {
13013
// Ignore unavailable fields. A field can be marked as unavailable explicitly
13014
// in the source code or implicitly by the compiler if it is in a union
13015
// defined in a system header and has non-trivial ObjC ownership
13016
// qualifications. We don't want those fields to participate in determining
13017
// whether the containing union is non-trivial.
13018
return FD->hasAttr<UnavailableAttr>();
13019
}
13020
13021
struct DiagNonTrivalCUnionDefaultInitializeVisitor
13022
: DefaultInitializedTypeVisitor<DiagNonTrivalCUnionDefaultInitializeVisitor,
13023
void> {
13024
using Super =
13025
DefaultInitializedTypeVisitor<DiagNonTrivalCUnionDefaultInitializeVisitor,
13026
void>;
13027
13028
DiagNonTrivalCUnionDefaultInitializeVisitor(
13029
QualType OrigTy, SourceLocation OrigLoc,
13030
Sema::NonTrivialCUnionContext UseContext, Sema &S)
13031
: OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13032
13033
void visitWithKind(QualType::PrimitiveDefaultInitializeKind PDIK, QualType QT,
13034
const FieldDecl *FD, bool InNonTrivialUnion) {
13035
if (const auto *AT = S.Context.getAsArrayType(QT))
13036
return this->asDerived().visit(S.Context.getBaseElementType(AT), FD,
13037
InNonTrivialUnion);
13038
return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13039
}
13040
13041
void visitARCStrong(QualType QT, const FieldDecl *FD,
13042
bool InNonTrivialUnion) {
13043
if (InNonTrivialUnion)
13044
S.Diag(FD->getLocation(), diag::note_non_trivial_c_union)
13045
<< 1 << 0 << QT << FD->getName();
13046
}
13047
13048
void visitARCWeak(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {
13049
if (InNonTrivialUnion)
13050
S.Diag(FD->getLocation(), diag::note_non_trivial_c_union)
13051
<< 1 << 0 << QT << FD->getName();
13052
}
13053
13054
void visitStruct(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {
13055
const RecordDecl *RD = QT->castAs<RecordType>()->getDecl();
13056
if (RD->isUnion()) {
13057
if (OrigLoc.isValid()) {
13058
bool IsUnion = false;
13059
if (auto *OrigRD = OrigTy->getAsRecordDecl())
13060
IsUnion = OrigRD->isUnion();
13061
S.Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13062
<< 0 << OrigTy << IsUnion << UseContext;
13063
// Reset OrigLoc so that this diagnostic is emitted only once.
13064
OrigLoc = SourceLocation();
13065
}
13066
InNonTrivialUnion = true;
13067
}
13068
13069
if (InNonTrivialUnion)
13070
S.Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13071
<< 0 << 0 << QT.getUnqualifiedType() << "";
13072
13073
for (const FieldDecl *FD : RD->fields())
13074
if (!shouldIgnoreForRecordTriviality(FD))
13075
asDerived().visit(FD->getType(), FD, InNonTrivialUnion);
13076
}
13077
13078
void visitTrivial(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {}
13079
13080
// The non-trivial C union type or the struct/union type that contains a
13081
// non-trivial C union.
13082
QualType OrigTy;
13083
SourceLocation OrigLoc;
13084
Sema::NonTrivialCUnionContext UseContext;
13085
Sema &S;
13086
};
13087
13088
struct DiagNonTrivalCUnionDestructedTypeVisitor
13089
: DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void> {
13090
using Super =
13091
DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13092
13093
DiagNonTrivalCUnionDestructedTypeVisitor(
13094
QualType OrigTy, SourceLocation OrigLoc,
13095
Sema::NonTrivialCUnionContext UseContext, Sema &S)
13096
: OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13097
13098
void visitWithKind(QualType::DestructionKind DK, QualType QT,
13099
const FieldDecl *FD, bool InNonTrivialUnion) {
13100
if (const auto *AT = S.Context.getAsArrayType(QT))
13101
return this->asDerived().visit(S.Context.getBaseElementType(AT), FD,
13102
InNonTrivialUnion);
13103
return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13104
}
13105
13106
void visitARCStrong(QualType QT, const FieldDecl *FD,
13107
bool InNonTrivialUnion) {
13108
if (InNonTrivialUnion)
13109
S.Diag(FD->getLocation(), diag::note_non_trivial_c_union)
13110
<< 1 << 1 << QT << FD->getName();
13111
}
13112
13113
void visitARCWeak(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {
13114
if (InNonTrivialUnion)
13115
S.Diag(FD->getLocation(), diag::note_non_trivial_c_union)
13116
<< 1 << 1 << QT << FD->getName();
13117
}
13118
13119
void visitStruct(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {
13120
const RecordDecl *RD = QT->castAs<RecordType>()->getDecl();
13121
if (RD->isUnion()) {
13122
if (OrigLoc.isValid()) {
13123
bool IsUnion = false;
13124
if (auto *OrigRD = OrigTy->getAsRecordDecl())
13125
IsUnion = OrigRD->isUnion();
13126
S.Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13127
<< 1 << OrigTy << IsUnion << UseContext;
13128
// Reset OrigLoc so that this diagnostic is emitted only once.
13129
OrigLoc = SourceLocation();
13130
}
13131
InNonTrivialUnion = true;
13132
}
13133
13134
if (InNonTrivialUnion)
13135
S.Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13136
<< 0 << 1 << QT.getUnqualifiedType() << "";
13137
13138
for (const FieldDecl *FD : RD->fields())
13139
if (!shouldIgnoreForRecordTriviality(FD))
13140
asDerived().visit(FD->getType(), FD, InNonTrivialUnion);
13141
}
13142
13143
void visitTrivial(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {}
13144
void visitCXXDestructor(QualType QT, const FieldDecl *FD,
13145
bool InNonTrivialUnion) {}
13146
13147
// The non-trivial C union type or the struct/union type that contains a
13148
// non-trivial C union.
13149
QualType OrigTy;
13150
SourceLocation OrigLoc;
13151
Sema::NonTrivialCUnionContext UseContext;
13152
Sema &S;
13153
};
13154
13155
struct DiagNonTrivalCUnionCopyVisitor
13156
: CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void> {
13157
using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13158
13159
DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13160
Sema::NonTrivialCUnionContext UseContext,
13161
Sema &S)
13162
: OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13163
13164
void visitWithKind(QualType::PrimitiveCopyKind PCK, QualType QT,
13165
const FieldDecl *FD, bool InNonTrivialUnion) {
13166
if (const auto *AT = S.Context.getAsArrayType(QT))
13167
return this->asDerived().visit(S.Context.getBaseElementType(AT), FD,
13168
InNonTrivialUnion);
13169
return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13170
}
13171
13172
void visitARCStrong(QualType QT, const FieldDecl *FD,
13173
bool InNonTrivialUnion) {
13174
if (InNonTrivialUnion)
13175
S.Diag(FD->getLocation(), diag::note_non_trivial_c_union)
13176
<< 1 << 2 << QT << FD->getName();
13177
}
13178
13179
void visitARCWeak(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {
13180
if (InNonTrivialUnion)
13181
S.Diag(FD->getLocation(), diag::note_non_trivial_c_union)
13182
<< 1 << 2 << QT << FD->getName();
13183
}
13184
13185
void visitStruct(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {
13186
const RecordDecl *RD = QT->castAs<RecordType>()->getDecl();
13187
if (RD->isUnion()) {
13188
if (OrigLoc.isValid()) {
13189
bool IsUnion = false;
13190
if (auto *OrigRD = OrigTy->getAsRecordDecl())
13191
IsUnion = OrigRD->isUnion();
13192
S.Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13193
<< 2 << OrigTy << IsUnion << UseContext;
13194
// Reset OrigLoc so that this diagnostic is emitted only once.
13195
OrigLoc = SourceLocation();
13196
}
13197
InNonTrivialUnion = true;
13198
}
13199
13200
if (InNonTrivialUnion)
13201
S.Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13202
<< 0 << 2 << QT.getUnqualifiedType() << "";
13203
13204
for (const FieldDecl *FD : RD->fields())
13205
if (!shouldIgnoreForRecordTriviality(FD))
13206
asDerived().visit(FD->getType(), FD, InNonTrivialUnion);
13207
}
13208
13209
void preVisit(QualType::PrimitiveCopyKind PCK, QualType QT,
13210
const FieldDecl *FD, bool InNonTrivialUnion) {}
13211
void visitTrivial(QualType QT, const FieldDecl *FD, bool InNonTrivialUnion) {}
13212
void visitVolatileTrivial(QualType QT, const FieldDecl *FD,
13213
bool InNonTrivialUnion) {}
13214
13215
// The non-trivial C union type or the struct/union type that contains a
13216
// non-trivial C union.
13217
QualType OrigTy;
13218
SourceLocation OrigLoc;
13219
Sema::NonTrivialCUnionContext UseContext;
13220
Sema &S;
13221
};
13222
13223
} // namespace
13224
13225
void Sema::checkNonTrivialCUnion(QualType QT, SourceLocation Loc,
13226
NonTrivialCUnionContext UseContext,
13227
unsigned NonTrivialKind) {
13228
assert((QT.hasNonTrivialToPrimitiveDefaultInitializeCUnion() ||
13229
QT.hasNonTrivialToPrimitiveDestructCUnion() ||
13230
QT.hasNonTrivialToPrimitiveCopyCUnion()) &&
13231
"shouldn't be called if type doesn't have a non-trivial C union");
13232
13233
if ((NonTrivialKind & NTCUK_Init) &&
13234
QT.hasNonTrivialToPrimitiveDefaultInitializeCUnion())
13235
DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *this)
13236
.visit(QT, nullptr, false);
13237
if ((NonTrivialKind & NTCUK_Destruct) &&
13238
QT.hasNonTrivialToPrimitiveDestructCUnion())
13239
DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *this)
13240
.visit(QT, nullptr, false);
13241
if ((NonTrivialKind & NTCUK_Copy) && QT.hasNonTrivialToPrimitiveCopyCUnion())
13242
DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *this)
13243
.visit(QT, nullptr, false);
13244
}
13245
13246
void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
13247
// If there is no declaration, there was an error parsing it. Just ignore
13248
// the initializer.
13249
if (!RealDecl) {
13250
CorrectDelayedTyposInExpr(Init, dyn_cast_or_null<VarDecl>(RealDecl));
13251
return;
13252
}
13253
13254
if (auto *Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13255
if (!Method->isInvalidDecl()) {
13256
// Pure-specifiers are handled in ActOnPureSpecifier.
13257
Diag(Method->getLocation(), diag::err_member_function_initialization)
13258
<< Method->getDeclName() << Init->getSourceRange();
13259
Method->setInvalidDecl();
13260
}
13261
return;
13262
}
13263
13264
VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13265
if (!VDecl) {
13266
assert(!isa<FieldDecl>(RealDecl) && "field init shouldn't get here");
13267
Diag(RealDecl->getLocation(), diag::err_illegal_initializer);
13268
RealDecl->setInvalidDecl();
13269
return;
13270
}
13271
13272
if (VDecl->isInvalidDecl()) {
13273
ExprResult Res = CorrectDelayedTyposInExpr(Init, VDecl);
13274
SmallVector<Expr *> SubExprs;
13275
if (Res.isUsable())
13276
SubExprs.push_back(Res.get());
13277
ExprResult Recovery =
13278
CreateRecoveryExpr(Init->getBeginLoc(), Init->getEndLoc(), SubExprs);
13279
if (Expr *E = Recovery.get())
13280
VDecl->setInit(E);
13281
return;
13282
}
13283
13284
// WebAssembly tables can't be used to initialise a variable.
13285
if (Init && !Init->getType().isNull() &&
13286
Init->getType()->isWebAssemblyTableType()) {
13287
Diag(Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13288
VDecl->setInvalidDecl();
13289
return;
13290
}
13291
13292
// C++11 [decl.spec.auto]p6. Deduce the type which 'auto' stands in for.
13293
if (VDecl->getType()->isUndeducedType()) {
13294
// Attempt typo correction early so that the type of the init expression can
13295
// be deduced based on the chosen correction if the original init contains a
13296
// TypoExpr.
13297
ExprResult Res = CorrectDelayedTyposInExpr(Init, VDecl);
13298
if (!Res.isUsable()) {
13299
// There are unresolved typos in Init, just drop them.
13300
// FIXME: improve the recovery strategy to preserve the Init.
13301
RealDecl->setInvalidDecl();
13302
return;
13303
}
13304
if (Res.get()->containsErrors()) {
13305
// Invalidate the decl as we don't know the type for recovery-expr yet.
13306
RealDecl->setInvalidDecl();
13307
VDecl->setInit(Res.get());
13308
return;
13309
}
13310
Init = Res.get();
13311
13312
if (DeduceVariableDeclarationType(VDecl, DirectInit, Init))
13313
return;
13314
}
13315
13316
// dllimport cannot be used on variable definitions.
13317
if (VDecl->hasAttr<DLLImportAttr>() && !VDecl->isStaticDataMember()) {
13318
Diag(VDecl->getLocation(), diag::err_attribute_dllimport_data_definition);
13319
VDecl->setInvalidDecl();
13320
return;
13321
}
13322
13323
// C99 6.7.8p5. If the declaration of an identifier has block scope, and
13324
// the identifier has external or internal linkage, the declaration shall
13325
// have no initializer for the identifier.
13326
// C++14 [dcl.init]p5 is the same restriction for C++.
13327
if (VDecl->isLocalVarDecl() && VDecl->hasExternalStorage()) {
13328
Diag(VDecl->getLocation(), diag::err_block_extern_cant_init);
13329
VDecl->setInvalidDecl();
13330
return;
13331
}
13332
13333
if (!VDecl->getType()->isDependentType()) {
13334
// A definition must end up with a complete type, which means it must be
13335
// complete with the restriction that an array type might be completed by
13336
// the initializer; note that later code assumes this restriction.
13337
QualType BaseDeclType = VDecl->getType();
13338
if (const ArrayType *Array = Context.getAsIncompleteArrayType(BaseDeclType))
13339
BaseDeclType = Array->getElementType();
13340
if (RequireCompleteType(VDecl->getLocation(), BaseDeclType,
13341
diag::err_typecheck_decl_incomplete_type)) {
13342
RealDecl->setInvalidDecl();
13343
return;
13344
}
13345
13346
// The variable can not have an abstract class type.
13347
if (RequireNonAbstractType(VDecl->getLocation(), VDecl->getType(),
13348
diag::err_abstract_type_in_decl,
13349
AbstractVariableType))
13350
VDecl->setInvalidDecl();
13351
}
13352
13353
// C++ [module.import/6] external definitions are not permitted in header
13354
// units.
13355
if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() &&
13356
!VDecl->isInvalidDecl() && VDecl->isThisDeclarationADefinition() &&
13357
VDecl->getFormalLinkage() == Linkage::External && !VDecl->isInline() &&
13358
!VDecl->isTemplated() && !isa<VarTemplateSpecializationDecl>(VDecl) &&
13359
!VDecl->getInstantiatedFromStaticDataMember()) {
13360
Diag(VDecl->getLocation(), diag::err_extern_def_in_header_unit);
13361
VDecl->setInvalidDecl();
13362
}
13363
13364
// If adding the initializer will turn this declaration into a definition,
13365
// and we already have a definition for this variable, diagnose or otherwise
13366
// handle the situation.
13367
if (VarDecl *Def = VDecl->getDefinition())
13368
if (Def != VDecl &&
13369
(!VDecl->isStaticDataMember() || VDecl->isOutOfLine()) &&
13370
!VDecl->isThisDeclarationADemotedDefinition() &&
13371
checkVarDeclRedefinition(Def, VDecl))
13372
return;
13373
13374
if (getLangOpts().CPlusPlus) {
13375
// C++ [class.static.data]p4
13376
// If a static data member is of const integral or const
13377
// enumeration type, its declaration in the class definition can
13378
// specify a constant-initializer which shall be an integral
13379
// constant expression (5.19). In that case, the member can appear
13380
// in integral constant expressions. The member shall still be
13381
// defined in a namespace scope if it is used in the program and the
13382
// namespace scope definition shall not contain an initializer.
13383
//
13384
// We already performed a redefinition check above, but for static
13385
// data members we also need to check whether there was an in-class
13386
// declaration with an initializer.
13387
if (VDecl->isStaticDataMember() && VDecl->getCanonicalDecl()->hasInit()) {
13388
Diag(Init->getExprLoc(), diag::err_static_data_member_reinitialization)
13389
<< VDecl->getDeclName();
13390
Diag(VDecl->getCanonicalDecl()->getInit()->getExprLoc(),
13391
diag::note_previous_initializer)
13392
<< 0;
13393
return;
13394
}
13395
13396
if (VDecl->hasLocalStorage())
13397
setFunctionHasBranchProtectedScope();
13398
13399
if (DiagnoseUnexpandedParameterPack(Init, UPPC_Initializer)) {
13400
VDecl->setInvalidDecl();
13401
return;
13402
}
13403
}
13404
13405
// OpenCL 1.1 6.5.2: "Variables allocated in the __local address space inside
13406
// a kernel function cannot be initialized."
13407
if (VDecl->getType().getAddressSpace() == LangAS::opencl_local) {
13408
Diag(VDecl->getLocation(), diag::err_local_cant_init);
13409
VDecl->setInvalidDecl();
13410
return;
13411
}
13412
13413
// The LoaderUninitialized attribute acts as a definition (of undef).
13414
if (VDecl->hasAttr<LoaderUninitializedAttr>()) {
13415
Diag(VDecl->getLocation(), diag::err_loader_uninitialized_cant_init);
13416
VDecl->setInvalidDecl();
13417
return;
13418
}
13419
13420
// Get the decls type and save a reference for later, since
13421
// CheckInitializerTypes may change it.
13422
QualType DclT = VDecl->getType(), SavT = DclT;
13423
13424
// Expressions default to 'id' when we're in a debugger
13425
// and we are assigning it to a variable of Objective-C pointer type.
13426
if (getLangOpts().DebuggerCastResultToId && DclT->isObjCObjectPointerType() &&
13427
Init->getType() == Context.UnknownAnyTy) {
13428
ExprResult Result = forceUnknownAnyToType(Init, Context.getObjCIdType());
13429
if (Result.isInvalid()) {
13430
VDecl->setInvalidDecl();
13431
return;
13432
}
13433
Init = Result.get();
13434
}
13435
13436
// Perform the initialization.
13437
ParenListExpr *CXXDirectInit = dyn_cast<ParenListExpr>(Init);
13438
bool IsParenListInit = false;
13439
if (!VDecl->isInvalidDecl()) {
13440
InitializedEntity Entity = InitializedEntity::InitializeVariable(VDecl);
13441
InitializationKind Kind = InitializationKind::CreateForInit(
13442
VDecl->getLocation(), DirectInit, Init);
13443
13444
MultiExprArg Args = Init;
13445
if (CXXDirectInit)
13446
Args = MultiExprArg(CXXDirectInit->getExprs(),
13447
CXXDirectInit->getNumExprs());
13448
13449
// Try to correct any TypoExprs in the initialization arguments.
13450
for (size_t Idx = 0; Idx < Args.size(); ++Idx) {
13451
ExprResult Res = CorrectDelayedTyposInExpr(
13452
Args[Idx], VDecl, /*RecoverUncorrectedTypos=*/true,
13453
[this, Entity, Kind](Expr *E) {
13454
InitializationSequence Init(*this, Entity, Kind, MultiExprArg(E));
13455
return Init.Failed() ? ExprError() : E;
13456
});
13457
if (Res.isInvalid()) {
13458
VDecl->setInvalidDecl();
13459
} else if (Res.get() != Args[Idx]) {
13460
Args[Idx] = Res.get();
13461
}
13462
}
13463
if (VDecl->isInvalidDecl())
13464
return;
13465
13466
InitializationSequence InitSeq(*this, Entity, Kind, Args,
13467
/*TopLevelOfInitList=*/false,
13468
/*TreatUnavailableAsInvalid=*/false);
13469
ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Args, &DclT);
13470
if (Result.isInvalid()) {
13471
// If the provided initializer fails to initialize the var decl,
13472
// we attach a recovery expr for better recovery.
13473
auto RecoveryExpr =
13474
CreateRecoveryExpr(Init->getBeginLoc(), Init->getEndLoc(), Args);
13475
if (RecoveryExpr.get())
13476
VDecl->setInit(RecoveryExpr.get());
13477
// In general, for error recovery purposes, the initializer doesn't play
13478
// part in the valid bit of the declaration. There are a few exceptions:
13479
// 1) if the var decl has a deduced auto type, and the type cannot be
13480
// deduced by an invalid initializer;
13481
// 2) if the var decl is a decomposition decl with a non-deduced type,
13482
// and the initialization fails (e.g. `int [a] = {1, 2};`);
13483
// Case 1) was already handled elsewhere.
13484
if (isa<DecompositionDecl>(VDecl)) // Case 2)
13485
VDecl->setInvalidDecl();
13486
return;
13487
}
13488
13489
Init = Result.getAs<Expr>();
13490
IsParenListInit = !InitSeq.steps().empty() &&
13491
InitSeq.step_begin()->Kind ==
13492
InitializationSequence::SK_ParenthesizedListInit;
13493
QualType VDeclType = VDecl->getType();
13494
if (Init && !Init->getType().isNull() &&
13495
!Init->getType()->isDependentType() && !VDeclType->isDependentType() &&
13496
Context.getAsIncompleteArrayType(VDeclType) &&
13497
Context.getAsIncompleteArrayType(Init->getType())) {
13498
// Bail out if it is not possible to deduce array size from the
13499
// initializer.
13500
Diag(VDecl->getLocation(), diag::err_typecheck_decl_incomplete_type)
13501
<< VDeclType;
13502
VDecl->setInvalidDecl();
13503
return;
13504
}
13505
}
13506
13507
// Check for self-references within variable initializers.
13508
// Variables declared within a function/method body (except for references)
13509
// are handled by a dataflow analysis.
13510
// This is undefined behavior in C++, but valid in C.
13511
if (getLangOpts().CPlusPlus)
13512
if (!VDecl->hasLocalStorage() || VDecl->getType()->isRecordType() ||
13513
VDecl->getType()->isReferenceType())
13514
CheckSelfReference(*this, RealDecl, Init, DirectInit);
13515
13516
// If the type changed, it means we had an incomplete type that was
13517
// completed by the initializer. For example:
13518
// int ary[] = { 1, 3, 5 };
13519
// "ary" transitions from an IncompleteArrayType to a ConstantArrayType.
13520
if (!VDecl->isInvalidDecl() && (DclT != SavT))
13521
VDecl->setType(DclT);
13522
13523
if (!VDecl->isInvalidDecl()) {
13524
checkUnsafeAssigns(VDecl->getLocation(), VDecl->getType(), Init);
13525
13526
if (VDecl->hasAttr<BlocksAttr>())
13527
ObjC().checkRetainCycles(VDecl, Init);
13528
13529
// It is safe to assign a weak reference into a strong variable.
13530
// Although this code can still have problems:
13531
// id x = self.weakProp;
13532
// id y = self.weakProp;
13533
// we do not warn to warn spuriously when 'x' and 'y' are on separate
13534
// paths through the function. This should be revisited if
13535
// -Wrepeated-use-of-weak is made flow-sensitive.
13536
if (FunctionScopeInfo *FSI = getCurFunction())
13537
if ((VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
13538
VDecl->getType().isNonWeakInMRRWithObjCWeak(Context)) &&
13539
!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
13540
Init->getBeginLoc()))
13541
FSI->markSafeWeakUse(Init);
13542
}
13543
13544
// The initialization is usually a full-expression.
13545
//
13546
// FIXME: If this is a braced initialization of an aggregate, it is not
13547
// an expression, and each individual field initializer is a separate
13548
// full-expression. For instance, in:
13549
//
13550
// struct Temp { ~Temp(); };
13551
// struct S { S(Temp); };
13552
// struct T { S a, b; } t = { Temp(), Temp() }
13553
//
13554
// we should destroy the first Temp before constructing the second.
13555
ExprResult Result =
13556
ActOnFinishFullExpr(Init, VDecl->getLocation(),
13557
/*DiscardedValue*/ false, VDecl->isConstexpr());
13558
if (Result.isInvalid()) {
13559
VDecl->setInvalidDecl();
13560
return;
13561
}
13562
Init = Result.get();
13563
13564
// Attach the initializer to the decl.
13565
VDecl->setInit(Init);
13566
13567
if (VDecl->isLocalVarDecl()) {
13568
// Don't check the initializer if the declaration is malformed.
13569
if (VDecl->isInvalidDecl()) {
13570
// do nothing
13571
13572
// OpenCL v1.2 s6.5.3: __constant locals must be constant-initialized.
13573
// This is true even in C++ for OpenCL.
13574
} else if (VDecl->getType().getAddressSpace() == LangAS::opencl_constant) {
13575
CheckForConstantInitializer(Init);
13576
13577
// Otherwise, C++ does not restrict the initializer.
13578
} else if (getLangOpts().CPlusPlus) {
13579
// do nothing
13580
13581
// C99 6.7.8p4: All the expressions in an initializer for an object that has
13582
// static storage duration shall be constant expressions or string literals.
13583
} else if (VDecl->getStorageClass() == SC_Static) {
13584
CheckForConstantInitializer(Init);
13585
13586
// C89 is stricter than C99 for aggregate initializers.
13587
// C89 6.5.7p3: All the expressions [...] in an initializer list
13588
// for an object that has aggregate or union type shall be
13589
// constant expressions.
13590
} else if (!getLangOpts().C99 && VDecl->getType()->isAggregateType() &&
13591
isa<InitListExpr>(Init)) {
13592
CheckForConstantInitializer(Init, diag::ext_aggregate_init_not_constant);
13593
}
13594
13595
if (auto *E = dyn_cast<ExprWithCleanups>(Init))
13596
if (auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->IgnoreParens()))
13597
if (VDecl->hasLocalStorage())
13598
BE->getBlockDecl()->setCanAvoidCopyToHeap();
13599
} else if (VDecl->isStaticDataMember() && !VDecl->isInline() &&
13600
VDecl->getLexicalDeclContext()->isRecord()) {
13601
// This is an in-class initialization for a static data member, e.g.,
13602
//
13603
// struct S {
13604
// static const int value = 17;
13605
// };
13606
13607
// C++ [class.mem]p4:
13608
// A member-declarator can contain a constant-initializer only
13609
// if it declares a static member (9.4) of const integral or
13610
// const enumeration type, see 9.4.2.
13611
//
13612
// C++11 [class.static.data]p3:
13613
// If a non-volatile non-inline const static data member is of integral
13614
// or enumeration type, its declaration in the class definition can
13615
// specify a brace-or-equal-initializer in which every initializer-clause
13616
// that is an assignment-expression is a constant expression. A static
13617
// data member of literal type can be declared in the class definition
13618
// with the constexpr specifier; if so, its declaration shall specify a
13619
// brace-or-equal-initializer in which every initializer-clause that is
13620
// an assignment-expression is a constant expression.
13621
13622
// Do nothing on dependent types.
13623
if (DclT->isDependentType()) {
13624
13625
// Allow any 'static constexpr' members, whether or not they are of literal
13626
// type. We separately check that every constexpr variable is of literal
13627
// type.
13628
} else if (VDecl->isConstexpr()) {
13629
13630
// Require constness.
13631
} else if (!DclT.isConstQualified()) {
13632
Diag(VDecl->getLocation(), diag::err_in_class_initializer_non_const)
13633
<< Init->getSourceRange();
13634
VDecl->setInvalidDecl();
13635
13636
// We allow integer constant expressions in all cases.
13637
} else if (DclT->isIntegralOrEnumerationType()) {
13638
// Check whether the expression is a constant expression.
13639
SourceLocation Loc;
13640
if (getLangOpts().CPlusPlus11 && DclT.isVolatileQualified())
13641
// In C++11, a non-constexpr const static data member with an
13642
// in-class initializer cannot be volatile.
13643
Diag(VDecl->getLocation(), diag::err_in_class_initializer_volatile);
13644
else if (Init->isValueDependent())
13645
; // Nothing to check.
13646
else if (Init->isIntegerConstantExpr(Context, &Loc))
13647
; // Ok, it's an ICE!
13648
else if (Init->getType()->isScopedEnumeralType() &&
13649
Init->isCXX11ConstantExpr(Context))
13650
; // Ok, it is a scoped-enum constant expression.
13651
else if (Init->isEvaluatable(Context)) {
13652
// If we can constant fold the initializer through heroics, accept it,
13653
// but report this as a use of an extension for -pedantic.
13654
Diag(Loc, diag::ext_in_class_initializer_non_constant)
13655
<< Init->getSourceRange();
13656
} else {
13657
// Otherwise, this is some crazy unknown case. Report the issue at the
13658
// location provided by the isIntegerConstantExpr failed check.
13659
Diag(Loc, diag::err_in_class_initializer_non_constant)
13660
<< Init->getSourceRange();
13661
VDecl->setInvalidDecl();
13662
}
13663
13664
// We allow foldable floating-point constants as an extension.
13665
} else if (DclT->isFloatingType()) { // also permits complex, which is ok
13666
// In C++98, this is a GNU extension. In C++11, it is not, but we support
13667
// it anyway and provide a fixit to add the 'constexpr'.
13668
if (getLangOpts().CPlusPlus11) {
13669
Diag(VDecl->getLocation(),
13670
diag::ext_in_class_initializer_float_type_cxx11)
13671
<< DclT << Init->getSourceRange();
13672
Diag(VDecl->getBeginLoc(),
13673
diag::note_in_class_initializer_float_type_cxx11)
13674
<< FixItHint::CreateInsertion(VDecl->getBeginLoc(), "constexpr ");
13675
} else {
13676
Diag(VDecl->getLocation(), diag::ext_in_class_initializer_float_type)
13677
<< DclT << Init->getSourceRange();
13678
13679
if (!Init->isValueDependent() && !Init->isEvaluatable(Context)) {
13680
Diag(Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
13681
<< Init->getSourceRange();
13682
VDecl->setInvalidDecl();
13683
}
13684
}
13685
13686
// Suggest adding 'constexpr' in C++11 for literal types.
13687
} else if (getLangOpts().CPlusPlus11 && DclT->isLiteralType(Context)) {
13688
Diag(VDecl->getLocation(), diag::err_in_class_initializer_literal_type)
13689
<< DclT << Init->getSourceRange()
13690
<< FixItHint::CreateInsertion(VDecl->getBeginLoc(), "constexpr ");
13691
VDecl->setConstexpr(true);
13692
13693
} else {
13694
Diag(VDecl->getLocation(), diag::err_in_class_initializer_bad_type)
13695
<< DclT << Init->getSourceRange();
13696
VDecl->setInvalidDecl();
13697
}
13698
} else if (VDecl->isFileVarDecl()) {
13699
// In C, extern is typically used to avoid tentative definitions when
13700
// declaring variables in headers, but adding an initializer makes it a
13701
// definition. This is somewhat confusing, so GCC and Clang both warn on it.
13702
// In C++, extern is often used to give implicitly static const variables
13703
// external linkage, so don't warn in that case. If selectany is present,
13704
// this might be header code intended for C and C++ inclusion, so apply the
13705
// C++ rules.
13706
if (VDecl->getStorageClass() == SC_Extern &&
13707
((!getLangOpts().CPlusPlus && !VDecl->hasAttr<SelectAnyAttr>()) ||
13708
!Context.getBaseElementType(VDecl->getType()).isConstQualified()) &&
13709
!(getLangOpts().CPlusPlus && VDecl->isExternC()) &&
13710
!isTemplateInstantiation(VDecl->getTemplateSpecializationKind()))
13711
Diag(VDecl->getLocation(), diag::warn_extern_init);
13712
13713
// In Microsoft C++ mode, a const variable defined in namespace scope has
13714
// external linkage by default if the variable is declared with
13715
// __declspec(dllexport).
13716
if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13717
getLangOpts().CPlusPlus && VDecl->getType().isConstQualified() &&
13718
VDecl->hasAttr<DLLExportAttr>() && VDecl->getDefinition())
13719
VDecl->setStorageClass(SC_Extern);
13720
13721
// C99 6.7.8p4. All file scoped initializers need to be constant.
13722
// Avoid duplicate diagnostics for constexpr variables.
13723
if (!getLangOpts().CPlusPlus && !VDecl->isInvalidDecl() &&
13724
!VDecl->isConstexpr())
13725
CheckForConstantInitializer(Init);
13726
}
13727
13728
QualType InitType = Init->getType();
13729
if (!InitType.isNull() &&
13730
(InitType.hasNonTrivialToPrimitiveDefaultInitializeCUnion() ||
13731
InitType.hasNonTrivialToPrimitiveCopyCUnion()))
13732
checkNonTrivialCUnionInInitializer(Init, Init->getExprLoc());
13733
13734
// We will represent direct-initialization similarly to copy-initialization:
13735
// int x(1); -as-> int x = 1;
13736
// ClassType x(a,b,c); -as-> ClassType x = ClassType(a,b,c);
13737
//
13738
// Clients that want to distinguish between the two forms, can check for
13739
// direct initializer using VarDecl::getInitStyle().
13740
// A major benefit is that clients that don't particularly care about which
13741
// exactly form was it (like the CodeGen) can handle both cases without
13742
// special case code.
13743
13744
// C++ 8.5p11:
13745
// The form of initialization (using parentheses or '=') is generally
13746
// insignificant, but does matter when the entity being initialized has a
13747
// class type.
13748
if (CXXDirectInit) {
13749
assert(DirectInit && "Call-style initializer must be direct init.");
13750
VDecl->setInitStyle(IsParenListInit ? VarDecl::ParenListInit
13751
: VarDecl::CallInit);
13752
} else if (DirectInit) {
13753
// This must be list-initialization. No other way is direct-initialization.
13754
VDecl->setInitStyle(VarDecl::ListInit);
13755
}
13756
13757
if (LangOpts.OpenMP &&
13758
(LangOpts.OpenMPIsTargetDevice || !LangOpts.OMPTargetTriples.empty()) &&
13759
VDecl->isFileVarDecl())
13760
DeclsToCheckForDeferredDiags.insert(VDecl);
13761
CheckCompleteVariableDeclaration(VDecl);
13762
}
13763
13764
void Sema::ActOnInitializerError(Decl *D) {
13765
// Our main concern here is re-establishing invariants like "a
13766
// variable's type is either dependent or complete".
13767
if (!D || D->isInvalidDecl()) return;
13768
13769
VarDecl *VD = dyn_cast<VarDecl>(D);
13770
if (!VD) return;
13771
13772
// Bindings are not usable if we can't make sense of the initializer.
13773
if (auto *DD = dyn_cast<DecompositionDecl>(D))
13774
for (auto *BD : DD->bindings())
13775
BD->setInvalidDecl();
13776
13777
// Auto types are meaningless if we can't make sense of the initializer.
13778
if (VD->getType()->isUndeducedType()) {
13779
D->setInvalidDecl();
13780
return;
13781
}
13782
13783
QualType Ty = VD->getType();
13784
if (Ty->isDependentType()) return;
13785
13786
// Require a complete type.
13787
if (RequireCompleteType(VD->getLocation(),
13788
Context.getBaseElementType(Ty),
13789
diag::err_typecheck_decl_incomplete_type)) {
13790
VD->setInvalidDecl();
13791
return;
13792
}
13793
13794
// Require a non-abstract type.
13795
if (RequireNonAbstractType(VD->getLocation(), Ty,
13796
diag::err_abstract_type_in_decl,
13797
AbstractVariableType)) {
13798
VD->setInvalidDecl();
13799
return;
13800
}
13801
13802
// Don't bother complaining about constructors or destructors,
13803
// though.
13804
}
13805
13806
void Sema::ActOnUninitializedDecl(Decl *RealDecl) {
13807
// If there is no declaration, there was an error parsing it. Just ignore it.
13808
if (!RealDecl)
13809
return;
13810
13811
if (VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
13812
QualType Type = Var->getType();
13813
13814
// C++1z [dcl.dcl]p1 grammar implies that an initializer is mandatory.
13815
if (isa<DecompositionDecl>(RealDecl)) {
13816
Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
13817
Var->setInvalidDecl();
13818
return;
13819
}
13820
13821
if (Type->isUndeducedType() &&
13822
DeduceVariableDeclarationType(Var, false, nullptr))
13823
return;
13824
13825
// C++11 [class.static.data]p3: A static data member can be declared with
13826
// the constexpr specifier; if so, its declaration shall specify
13827
// a brace-or-equal-initializer.
13828
// C++11 [dcl.constexpr]p1: The constexpr specifier shall be applied only to
13829
// the definition of a variable [...] or the declaration of a static data
13830
// member.
13831
if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
13832
!Var->isThisDeclarationADemotedDefinition()) {
13833
if (Var->isStaticDataMember()) {
13834
// C++1z removes the relevant rule; the in-class declaration is always
13835
// a definition there.
13836
if (!getLangOpts().CPlusPlus17 &&
13837
!Context.getTargetInfo().getCXXABI().isMicrosoft()) {
13838
Diag(Var->getLocation(),
13839
diag::err_constexpr_static_mem_var_requires_init)
13840
<< Var;
13841
Var->setInvalidDecl();
13842
return;
13843
}
13844
} else {
13845
Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
13846
Var->setInvalidDecl();
13847
return;
13848
}
13849
}
13850
13851
// OpenCL v1.1 s6.5.3: variables declared in the constant address space must
13852
// be initialized.
13853
if (!Var->isInvalidDecl() &&
13854
Var->getType().getAddressSpace() == LangAS::opencl_constant &&
13855
Var->getStorageClass() != SC_Extern && !Var->getInit()) {
13856
bool HasConstExprDefaultConstructor = false;
13857
if (CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
13858
for (auto *Ctor : RD->ctors()) {
13859
if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
13860
Ctor->getMethodQualifiers().getAddressSpace() ==
13861
LangAS::opencl_constant) {
13862
HasConstExprDefaultConstructor = true;
13863
}
13864
}
13865
}
13866
if (!HasConstExprDefaultConstructor) {
13867
Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
13868
Var->setInvalidDecl();
13869
return;
13870
}
13871
}
13872
13873
if (!Var->isInvalidDecl() && RealDecl->hasAttr<LoaderUninitializedAttr>()) {
13874
if (Var->getStorageClass() == SC_Extern) {
13875
Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
13876
<< Var;
13877
Var->setInvalidDecl();
13878
return;
13879
}
13880
if (RequireCompleteType(Var->getLocation(), Var->getType(),
13881
diag::err_typecheck_decl_incomplete_type)) {
13882
Var->setInvalidDecl();
13883
return;
13884
}
13885
if (CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
13886
if (!RD->hasTrivialDefaultConstructor()) {
13887
Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
13888
Var->setInvalidDecl();
13889
return;
13890
}
13891
}
13892
// The declaration is uninitialized, no need for further checks.
13893
return;
13894
}
13895
13896
VarDecl::DefinitionKind DefKind = Var->isThisDeclarationADefinition();
13897
if (!Var->isInvalidDecl() && DefKind != VarDecl::DeclarationOnly &&
13898
Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
13899
checkNonTrivialCUnion(Var->getType(), Var->getLocation(),
13900
NTCUC_DefaultInitializedObject, NTCUK_Init);
13901
13902
13903
switch (DefKind) {
13904
case VarDecl::Definition:
13905
if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
13906
break;
13907
13908
// We have an out-of-line definition of a static data member
13909
// that has an in-class initializer, so we type-check this like
13910
// a declaration.
13911
//
13912
[[fallthrough]];
13913
13914
case VarDecl::DeclarationOnly:
13915
// It's only a declaration.
13916
13917
// Block scope. C99 6.7p7: If an identifier for an object is
13918
// declared with no linkage (C99 6.2.2p6), the type for the
13919
// object shall be complete.
13920
if (!Type->isDependentType() && Var->isLocalVarDecl() &&
13921
!Var->hasLinkage() && !Var->isInvalidDecl() &&
13922
RequireCompleteType(Var->getLocation(), Type,
13923
diag::err_typecheck_decl_incomplete_type))
13924
Var->setInvalidDecl();
13925
13926
// Make sure that the type is not abstract.
13927
if (!Type->isDependentType() && !Var->isInvalidDecl() &&
13928
RequireNonAbstractType(Var->getLocation(), Type,
13929
diag::err_abstract_type_in_decl,
13930
AbstractVariableType))
13931
Var->setInvalidDecl();
13932
if (!Type->isDependentType() && !Var->isInvalidDecl() &&
13933
Var->getStorageClass() == SC_PrivateExtern) {
13934
Diag(Var->getLocation(), diag::warn_private_extern);
13935
Diag(Var->getLocation(), diag::note_private_extern);
13936
}
13937
13938
if (Context.getTargetInfo().allowDebugInfoForExternalRef() &&
13939
!Var->isInvalidDecl())
13940
ExternalDeclarations.push_back(Var);
13941
13942
return;
13943
13944
case VarDecl::TentativeDefinition:
13945
// File scope. C99 6.9.2p2: A declaration of an identifier for an
13946
// object that has file scope without an initializer, and without a
13947
// storage-class specifier or with the storage-class specifier "static",
13948
// constitutes a tentative definition. Note: A tentative definition with
13949
// external linkage is valid (C99 6.2.2p5).
13950
if (!Var->isInvalidDecl()) {
13951
if (const IncompleteArrayType *ArrayT
13952
= Context.getAsIncompleteArrayType(Type)) {
13953
if (RequireCompleteSizedType(
13954
Var->getLocation(), ArrayT->getElementType(),
13955
diag::err_array_incomplete_or_sizeless_type))
13956
Var->setInvalidDecl();
13957
} else if (Var->getStorageClass() == SC_Static) {
13958
// C99 6.9.2p3: If the declaration of an identifier for an object is
13959
// a tentative definition and has internal linkage (C99 6.2.2p3), the
13960
// declared type shall not be an incomplete type.
13961
// NOTE: code such as the following
13962
// static struct s;
13963
// struct s { int a; };
13964
// is accepted by gcc. Hence here we issue a warning instead of
13965
// an error and we do not invalidate the static declaration.
13966
// NOTE: to avoid multiple warnings, only check the first declaration.
13967
if (Var->isFirstDecl())
13968
RequireCompleteType(Var->getLocation(), Type,
13969
diag::ext_typecheck_decl_incomplete_type);
13970
}
13971
}
13972
13973
// Record the tentative definition; we're done.
13974
if (!Var->isInvalidDecl())
13975
TentativeDefinitions.push_back(Var);
13976
return;
13977
}
13978
13979
// Provide a specific diagnostic for uninitialized variable
13980
// definitions with incomplete array type.
13981
if (Type->isIncompleteArrayType()) {
13982
if (Var->isConstexpr())
13983
Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
13984
<< Var;
13985
else
13986
Diag(Var->getLocation(),
13987
diag::err_typecheck_incomplete_array_needs_initializer);
13988
Var->setInvalidDecl();
13989
return;
13990
}
13991
13992
// Provide a specific diagnostic for uninitialized variable
13993
// definitions with reference type.
13994
if (Type->isReferenceType()) {
13995
Diag(Var->getLocation(), diag::err_reference_var_requires_init)
13996
<< Var << SourceRange(Var->getLocation(), Var->getLocation());
13997
return;
13998
}
13999
14000
// Do not attempt to type-check the default initializer for a
14001
// variable with dependent type.
14002
if (Type->isDependentType())
14003
return;
14004
14005
if (Var->isInvalidDecl())
14006
return;
14007
14008
if (!Var->hasAttr<AliasAttr>()) {
14009
if (RequireCompleteType(Var->getLocation(),
14010
Context.getBaseElementType(Type),
14011
diag::err_typecheck_decl_incomplete_type)) {
14012
Var->setInvalidDecl();
14013
return;
14014
}
14015
} else {
14016
return;
14017
}
14018
14019
// The variable can not have an abstract class type.
14020
if (RequireNonAbstractType(Var->getLocation(), Type,
14021
diag::err_abstract_type_in_decl,
14022
AbstractVariableType)) {
14023
Var->setInvalidDecl();
14024
return;
14025
}
14026
14027
// Check for jumps past the implicit initializer. C++0x
14028
// clarifies that this applies to a "variable with automatic
14029
// storage duration", not a "local variable".
14030
// C++11 [stmt.dcl]p3
14031
// A program that jumps from a point where a variable with automatic
14032
// storage duration is not in scope to a point where it is in scope is
14033
// ill-formed unless the variable has scalar type, class type with a
14034
// trivial default constructor and a trivial destructor, a cv-qualified
14035
// version of one of these types, or an array of one of the preceding
14036
// types and is declared without an initializer.
14037
if (getLangOpts().CPlusPlus && Var->hasLocalStorage()) {
14038
if (const RecordType *Record
14039
= Context.getBaseElementType(Type)->getAs<RecordType>()) {
14040
CXXRecordDecl *CXXRecord = cast<CXXRecordDecl>(Record->getDecl());
14041
// Mark the function (if we're in one) for further checking even if the
14042
// looser rules of C++11 do not require such checks, so that we can
14043
// diagnose incompatibilities with C++98.
14044
if (!CXXRecord->isPOD())
14045
setFunctionHasBranchProtectedScope();
14046
}
14047
}
14048
// In OpenCL, we can't initialize objects in the __local address space,
14049
// even implicitly, so don't synthesize an implicit initializer.
14050
if (getLangOpts().OpenCL &&
14051
Var->getType().getAddressSpace() == LangAS::opencl_local)
14052
return;
14053
// C++03 [dcl.init]p9:
14054
// If no initializer is specified for an object, and the
14055
// object is of (possibly cv-qualified) non-POD class type (or
14056
// array thereof), the object shall be default-initialized; if
14057
// the object is of const-qualified type, the underlying class
14058
// type shall have a user-declared default
14059
// constructor. Otherwise, if no initializer is specified for
14060
// a non- static object, the object and its subobjects, if
14061
// any, have an indeterminate initial value); if the object
14062
// or any of its subobjects are of const-qualified type, the
14063
// program is ill-formed.
14064
// C++0x [dcl.init]p11:
14065
// If no initializer is specified for an object, the object is
14066
// default-initialized; [...].
14067
InitializedEntity Entity = InitializedEntity::InitializeVariable(Var);
14068
InitializationKind Kind
14069
= InitializationKind::CreateDefault(Var->getLocation());
14070
14071
InitializationSequence InitSeq(*this, Entity, Kind, std::nullopt);
14072
ExprResult Init = InitSeq.Perform(*this, Entity, Kind, std::nullopt);
14073
14074
if (Init.get()) {
14075
Var->setInit(MaybeCreateExprWithCleanups(Init.get()));
14076
// This is important for template substitution.
14077
Var->setInitStyle(VarDecl::CallInit);
14078
} else if (Init.isInvalid()) {
14079
// If default-init fails, attach a recovery-expr initializer to track
14080
// that initialization was attempted and failed.
14081
auto RecoveryExpr =
14082
CreateRecoveryExpr(Var->getLocation(), Var->getLocation(), {});
14083
if (RecoveryExpr.get())
14084
Var->setInit(RecoveryExpr.get());
14085
}
14086
14087
CheckCompleteVariableDeclaration(Var);
14088
}
14089
}
14090
14091
void Sema::ActOnCXXForRangeDecl(Decl *D) {
14092
// If there is no declaration, there was an error parsing it. Ignore it.
14093
if (!D)
14094
return;
14095
14096
VarDecl *VD = dyn_cast<VarDecl>(D);
14097
if (!VD) {
14098
Diag(D->getLocation(), diag::err_for_range_decl_must_be_var);
14099
D->setInvalidDecl();
14100
return;
14101
}
14102
14103
VD->setCXXForRangeDecl(true);
14104
14105
// for-range-declaration cannot be given a storage class specifier.
14106
int Error = -1;
14107
switch (VD->getStorageClass()) {
14108
case SC_None:
14109
break;
14110
case SC_Extern:
14111
Error = 0;
14112
break;
14113
case SC_Static:
14114
Error = 1;
14115
break;
14116
case SC_PrivateExtern:
14117
Error = 2;
14118
break;
14119
case SC_Auto:
14120
Error = 3;
14121
break;
14122
case SC_Register:
14123
Error = 4;
14124
break;
14125
}
14126
14127
// for-range-declaration cannot be given a storage class specifier con't.
14128
switch (VD->getTSCSpec()) {
14129
case TSCS_thread_local:
14130
Error = 6;
14131
break;
14132
case TSCS___thread:
14133
case TSCS__Thread_local:
14134
case TSCS_unspecified:
14135
break;
14136
}
14137
14138
if (Error != -1) {
14139
Diag(VD->getOuterLocStart(), diag::err_for_range_storage_class)
14140
<< VD << Error;
14141
D->setInvalidDecl();
14142
}
14143
}
14144
14145
StmtResult Sema::ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc,
14146
IdentifierInfo *Ident,
14147
ParsedAttributes &Attrs) {
14148
// C++1y [stmt.iter]p1:
14149
// A range-based for statement of the form
14150
// for ( for-range-identifier : for-range-initializer ) statement
14151
// is equivalent to
14152
// for ( auto&& for-range-identifier : for-range-initializer ) statement
14153
DeclSpec DS(Attrs.getPool().getFactory());
14154
14155
const char *PrevSpec;
14156
unsigned DiagID;
14157
DS.SetTypeSpecType(DeclSpec::TST_auto, IdentLoc, PrevSpec, DiagID,
14158
getPrintingPolicy());
14159
14160
Declarator D(DS, ParsedAttributesView::none(), DeclaratorContext::ForInit);
14161
D.SetIdentifier(Ident, IdentLoc);
14162
D.takeAttributes(Attrs);
14163
14164
D.AddTypeInfo(DeclaratorChunk::getReference(0, IdentLoc, /*lvalue*/ false),
14165
IdentLoc);
14166
Decl *Var = ActOnDeclarator(S, D);
14167
cast<VarDecl>(Var)->setCXXForRangeDecl(true);
14168
FinalizeDeclaration(Var);
14169
return ActOnDeclStmt(FinalizeDeclaratorGroup(S, DS, Var), IdentLoc,
14170
Attrs.Range.getEnd().isValid() ? Attrs.Range.getEnd()
14171
: IdentLoc);
14172
}
14173
14174
void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {
14175
if (var->isInvalidDecl()) return;
14176
14177
CUDA().MaybeAddConstantAttr(var);
14178
14179
if (getLangOpts().OpenCL) {
14180
// OpenCL v2.0 s6.12.5 - Every block variable declaration must have an
14181
// initialiser
14182
if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14183
!var->hasInit()) {
14184
Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14185
<< 1 /*Init*/;
14186
var->setInvalidDecl();
14187
return;
14188
}
14189
}
14190
14191
// In Objective-C, don't allow jumps past the implicit initialization of a
14192
// local retaining variable.
14193
if (getLangOpts().ObjC &&
14194
var->hasLocalStorage()) {
14195
switch (var->getType().getObjCLifetime()) {
14196
case Qualifiers::OCL_None:
14197
case Qualifiers::OCL_ExplicitNone:
14198
case Qualifiers::OCL_Autoreleasing:
14199
break;
14200
14201
case Qualifiers::OCL_Weak:
14202
case Qualifiers::OCL_Strong:
14203
setFunctionHasBranchProtectedScope();
14204
break;
14205
}
14206
}
14207
14208
if (var->hasLocalStorage() &&
14209
var->getType().isDestructedType() == QualType::DK_nontrivial_c_struct)
14210
setFunctionHasBranchProtectedScope();
14211
14212
// Warn about externally-visible variables being defined without a
14213
// prior declaration. We only want to do this for global
14214
// declarations, but we also specifically need to avoid doing it for
14215
// class members because the linkage of an anonymous class can
14216
// change if it's later given a typedef name.
14217
if (var->isThisDeclarationADefinition() &&
14218
var->getDeclContext()->getRedeclContext()->isFileContext() &&
14219
var->isExternallyVisible() && var->hasLinkage() &&
14220
!var->isInline() && !var->getDescribedVarTemplate() &&
14221
var->getStorageClass() != SC_Register &&
14222
!isa<VarTemplatePartialSpecializationDecl>(var) &&
14223
!isTemplateInstantiation(var->getTemplateSpecializationKind()) &&
14224
!getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14225
var->getLocation())) {
14226
// Find a previous declaration that's not a definition.
14227
VarDecl *prev = var->getPreviousDecl();
14228
while (prev && prev->isThisDeclarationADefinition())
14229
prev = prev->getPreviousDecl();
14230
14231
if (!prev) {
14232
Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14233
Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14234
<< /* variable */ 0;
14235
}
14236
}
14237
14238
// Cache the result of checking for constant initialization.
14239
std::optional<bool> CacheHasConstInit;
14240
const Expr *CacheCulprit = nullptr;
14241
auto checkConstInit = [&]() mutable {
14242
if (!CacheHasConstInit)
14243
CacheHasConstInit = var->getInit()->isConstantInitializer(
14244
Context, var->getType()->isReferenceType(), &CacheCulprit);
14245
return *CacheHasConstInit;
14246
};
14247
14248
if (var->getTLSKind() == VarDecl::TLS_Static) {
14249
if (var->getType().isDestructedType()) {
14250
// GNU C++98 edits for __thread, [basic.start.term]p3:
14251
// The type of an object with thread storage duration shall not
14252
// have a non-trivial destructor.
14253
Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14254
if (getLangOpts().CPlusPlus11)
14255
Diag(var->getLocation(), diag::note_use_thread_local);
14256
} else if (getLangOpts().CPlusPlus && var->hasInit()) {
14257
if (!checkConstInit()) {
14258
// GNU C++98 edits for __thread, [basic.start.init]p4:
14259
// An object of thread storage duration shall not require dynamic
14260
// initialization.
14261
// FIXME: Need strict checking here.
14262
Diag(CacheCulprit->getExprLoc(), diag::err_thread_dynamic_init)
14263
<< CacheCulprit->getSourceRange();
14264
if (getLangOpts().CPlusPlus11)
14265
Diag(var->getLocation(), diag::note_use_thread_local);
14266
}
14267
}
14268
}
14269
14270
14271
if (!var->getType()->isStructureType() && var->hasInit() &&
14272
isa<InitListExpr>(var->getInit())) {
14273
const auto *ILE = cast<InitListExpr>(var->getInit());
14274
unsigned NumInits = ILE->getNumInits();
14275
if (NumInits > 2)
14276
for (unsigned I = 0; I < NumInits; ++I) {
14277
const auto *Init = ILE->getInit(I);
14278
if (!Init)
14279
break;
14280
const auto *SL = dyn_cast<StringLiteral>(Init->IgnoreImpCasts());
14281
if (!SL)
14282
break;
14283
14284
unsigned NumConcat = SL->getNumConcatenated();
14285
// Diagnose missing comma in string array initialization.
14286
// Do not warn when all the elements in the initializer are concatenated
14287
// together. Do not warn for macros too.
14288
if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14289
bool OnlyOneMissingComma = true;
14290
for (unsigned J = I + 1; J < NumInits; ++J) {
14291
const auto *Init = ILE->getInit(J);
14292
if (!Init)
14293
break;
14294
const auto *SLJ = dyn_cast<StringLiteral>(Init->IgnoreImpCasts());
14295
if (!SLJ || SLJ->getNumConcatenated() > 1) {
14296
OnlyOneMissingComma = false;
14297
break;
14298
}
14299
}
14300
14301
if (OnlyOneMissingComma) {
14302
SmallVector<FixItHint, 1> Hints;
14303
for (unsigned i = 0; i < NumConcat - 1; ++i)
14304
Hints.push_back(FixItHint::CreateInsertion(
14305
PP.getLocForEndOfToken(SL->getStrTokenLoc(i)), ","));
14306
14307
Diag(SL->getStrTokenLoc(1),
14308
diag::warn_concatenated_literal_array_init)
14309
<< Hints;
14310
Diag(SL->getBeginLoc(),
14311
diag::note_concatenated_string_literal_silence);
14312
}
14313
// In any case, stop now.
14314
break;
14315
}
14316
}
14317
}
14318
14319
14320
QualType type = var->getType();
14321
14322
if (var->hasAttr<BlocksAttr>())
14323
getCurFunction()->addByrefBlockVar(var);
14324
14325
Expr *Init = var->getInit();
14326
bool GlobalStorage = var->hasGlobalStorage();
14327
bool IsGlobal = GlobalStorage && !var->isStaticLocal();
14328
QualType baseType = Context.getBaseElementType(type);
14329
bool HasConstInit = true;
14330
14331
if (getLangOpts().C23 && var->isConstexpr() && !Init)
14332
Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
14333
<< var;
14334
14335
// Check whether the initializer is sufficiently constant.
14336
if ((getLangOpts().CPlusPlus || (getLangOpts().C23 && var->isConstexpr())) &&
14337
!type->isDependentType() && Init && !Init->isValueDependent() &&
14338
(GlobalStorage || var->isConstexpr() ||
14339
var->mightBeUsableInConstantExpressions(Context))) {
14340
// If this variable might have a constant initializer or might be usable in
14341
// constant expressions, check whether or not it actually is now. We can't
14342
// do this lazily, because the result might depend on things that change
14343
// later, such as which constexpr functions happen to be defined.
14344
SmallVector<PartialDiagnosticAt, 8> Notes;
14345
if (!getLangOpts().CPlusPlus11 && !getLangOpts().C23) {
14346
// Prior to C++11, in contexts where a constant initializer is required,
14347
// the set of valid constant initializers is described by syntactic rules
14348
// in [expr.const]p2-6.
14349
// FIXME: Stricter checking for these rules would be useful for constinit /
14350
// -Wglobal-constructors.
14351
HasConstInit = checkConstInit();
14352
14353
// Compute and cache the constant value, and remember that we have a
14354
// constant initializer.
14355
if (HasConstInit) {
14356
(void)var->checkForConstantInitialization(Notes);
14357
Notes.clear();
14358
} else if (CacheCulprit) {
14359
Notes.emplace_back(CacheCulprit->getExprLoc(),
14360
PDiag(diag::note_invalid_subexpr_in_const_expr));
14361
Notes.back().second << CacheCulprit->getSourceRange();
14362
}
14363
} else {
14364
// Evaluate the initializer to see if it's a constant initializer.
14365
HasConstInit = var->checkForConstantInitialization(Notes);
14366
}
14367
14368
if (HasConstInit) {
14369
// FIXME: Consider replacing the initializer with a ConstantExpr.
14370
} else if (var->isConstexpr()) {
14371
SourceLocation DiagLoc = var->getLocation();
14372
// If the note doesn't add any useful information other than a source
14373
// location, fold it into the primary diagnostic.
14374
if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
14375
diag::note_invalid_subexpr_in_const_expr) {
14376
DiagLoc = Notes[0].first;
14377
Notes.clear();
14378
}
14379
Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
14380
<< var << Init->getSourceRange();
14381
for (unsigned I = 0, N = Notes.size(); I != N; ++I)
14382
Diag(Notes[I].first, Notes[I].second);
14383
} else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
14384
auto *Attr = var->getAttr<ConstInitAttr>();
14385
Diag(var->getLocation(), diag::err_require_constant_init_failed)
14386
<< Init->getSourceRange();
14387
Diag(Attr->getLocation(), diag::note_declared_required_constant_init_here)
14388
<< Attr->getRange() << Attr->isConstinit();
14389
for (auto &it : Notes)
14390
Diag(it.first, it.second);
14391
} else if (IsGlobal &&
14392
!getDiagnostics().isIgnored(diag::warn_global_constructor,
14393
var->getLocation())) {
14394
// Warn about globals which don't have a constant initializer. Don't
14395
// warn about globals with a non-trivial destructor because we already
14396
// warned about them.
14397
CXXRecordDecl *RD = baseType->getAsCXXRecordDecl();
14398
if (!(RD && !RD->hasTrivialDestructor())) {
14399
// checkConstInit() here permits trivial default initialization even in
14400
// C++11 onwards, where such an initializer is not a constant initializer
14401
// but nonetheless doesn't require a global constructor.
14402
if (!checkConstInit())
14403
Diag(var->getLocation(), diag::warn_global_constructor)
14404
<< Init->getSourceRange();
14405
}
14406
}
14407
}
14408
14409
// Apply section attributes and pragmas to global variables.
14410
if (GlobalStorage && var->isThisDeclarationADefinition() &&
14411
!inTemplateInstantiation()) {
14412
PragmaStack<StringLiteral *> *Stack = nullptr;
14413
int SectionFlags = ASTContext::PSF_Read;
14414
bool MSVCEnv =
14415
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
14416
std::optional<QualType::NonConstantStorageReason> Reason;
14417
if (HasConstInit &&
14418
!(Reason = var->getType().isNonConstantStorage(Context, true, false))) {
14419
Stack = &ConstSegStack;
14420
} else {
14421
SectionFlags |= ASTContext::PSF_Write;
14422
Stack = var->hasInit() && HasConstInit ? &DataSegStack : &BSSSegStack;
14423
}
14424
if (const SectionAttr *SA = var->getAttr<SectionAttr>()) {
14425
if (SA->getSyntax() == AttributeCommonInfo::AS_Declspec)
14426
SectionFlags |= ASTContext::PSF_Implicit;
14427
UnifySection(SA->getName(), SectionFlags, var);
14428
} else if (Stack->CurrentValue) {
14429
if (Stack != &ConstSegStack && MSVCEnv &&
14430
ConstSegStack.CurrentValue != ConstSegStack.DefaultValue &&
14431
var->getType().isConstQualified()) {
14432
assert((!Reason || Reason != QualType::NonConstantStorageReason::
14433
NonConstNonReferenceType) &&
14434
"This case should've already been handled elsewhere");
14435
Diag(var->getLocation(), diag::warn_section_msvc_compat)
14436
<< var << ConstSegStack.CurrentValue << (int)(!HasConstInit
14437
? QualType::NonConstantStorageReason::NonTrivialCtor
14438
: *Reason);
14439
}
14440
SectionFlags |= ASTContext::PSF_Implicit;
14441
auto SectionName = Stack->CurrentValue->getString();
14442
var->addAttr(SectionAttr::CreateImplicit(Context, SectionName,
14443
Stack->CurrentPragmaLocation,
14444
SectionAttr::Declspec_allocate));
14445
if (UnifySection(SectionName, SectionFlags, var))
14446
var->dropAttr<SectionAttr>();
14447
}
14448
14449
// Apply the init_seg attribute if this has an initializer. If the
14450
// initializer turns out to not be dynamic, we'll end up ignoring this
14451
// attribute.
14452
if (CurInitSeg && var->getInit())
14453
var->addAttr(InitSegAttr::CreateImplicit(Context, CurInitSeg->getString(),
14454
CurInitSegLoc));
14455
}
14456
14457
// All the following checks are C++ only.
14458
if (!getLangOpts().CPlusPlus) {
14459
// If this variable must be emitted, add it as an initializer for the
14460
// current module.
14461
if (Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
14462
Context.addModuleInitializer(ModuleScopes.back().Module, var);
14463
return;
14464
}
14465
14466
// Require the destructor.
14467
if (!type->isDependentType())
14468
if (const RecordType *recordType = baseType->getAs<RecordType>())
14469
FinalizeVarWithDestructor(var, recordType);
14470
14471
// If this variable must be emitted, add it as an initializer for the current
14472
// module.
14473
if (Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
14474
Context.addModuleInitializer(ModuleScopes.back().Module, var);
14475
14476
// Build the bindings if this is a structured binding declaration.
14477
if (auto *DD = dyn_cast<DecompositionDecl>(var))
14478
CheckCompleteDecompositionDeclaration(DD);
14479
}
14480
14481
void Sema::CheckStaticLocalForDllExport(VarDecl *VD) {
14482
assert(VD->isStaticLocal());
14483
14484
auto *FD = dyn_cast_or_null<FunctionDecl>(VD->getParentFunctionOrMethod());
14485
14486
// Find outermost function when VD is in lambda function.
14487
while (FD && !getDLLAttr(FD) &&
14488
!FD->hasAttr<DLLExportStaticLocalAttr>() &&
14489
!FD->hasAttr<DLLImportStaticLocalAttr>()) {
14490
FD = dyn_cast_or_null<FunctionDecl>(FD->getParentFunctionOrMethod());
14491
}
14492
14493
if (!FD)
14494
return;
14495
14496
// Static locals inherit dll attributes from their function.
14497
if (Attr *A = getDLLAttr(FD)) {
14498
auto *NewAttr = cast<InheritableAttr>(A->clone(getASTContext()));
14499
NewAttr->setInherited(true);
14500
VD->addAttr(NewAttr);
14501
} else if (Attr *A = FD->getAttr<DLLExportStaticLocalAttr>()) {
14502
auto *NewAttr = DLLExportAttr::CreateImplicit(getASTContext(), *A);
14503
NewAttr->setInherited(true);
14504
VD->addAttr(NewAttr);
14505
14506
// Export this function to enforce exporting this static variable even
14507
// if it is not used in this compilation unit.
14508
if (!FD->hasAttr<DLLExportAttr>())
14509
FD->addAttr(NewAttr);
14510
14511
} else if (Attr *A = FD->getAttr<DLLImportStaticLocalAttr>()) {
14512
auto *NewAttr = DLLImportAttr::CreateImplicit(getASTContext(), *A);
14513
NewAttr->setInherited(true);
14514
VD->addAttr(NewAttr);
14515
}
14516
}
14517
14518
void Sema::CheckThreadLocalForLargeAlignment(VarDecl *VD) {
14519
assert(VD->getTLSKind());
14520
14521
// Perform TLS alignment check here after attributes attached to the variable
14522
// which may affect the alignment have been processed. Only perform the check
14523
// if the target has a maximum TLS alignment (zero means no constraints).
14524
if (unsigned MaxAlign = Context.getTargetInfo().getMaxTLSAlign()) {
14525
// Protect the check so that it's not performed on dependent types and
14526
// dependent alignments (we can't determine the alignment in that case).
14527
if (!VD->hasDependentAlignment()) {
14528
CharUnits MaxAlignChars = Context.toCharUnitsFromBits(MaxAlign);
14529
if (Context.getDeclAlign(VD) > MaxAlignChars) {
14530
Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
14531
<< (unsigned)Context.getDeclAlign(VD).getQuantity() << VD
14532
<< (unsigned)MaxAlignChars.getQuantity();
14533
}
14534
}
14535
}
14536
}
14537
14538
void Sema::FinalizeDeclaration(Decl *ThisDecl) {
14539
// Note that we are no longer parsing the initializer for this declaration.
14540
ParsingInitForAutoVars.erase(ThisDecl);
14541
14542
VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
14543
if (!VD)
14544
return;
14545
14546
// Apply an implicit SectionAttr if '#pragma clang section bss|data|rodata' is active
14547
if (VD->hasGlobalStorage() && VD->isThisDeclarationADefinition() &&
14548
!inTemplateInstantiation() && !VD->hasAttr<SectionAttr>()) {
14549
if (PragmaClangBSSSection.Valid)
14550
VD->addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
14551
Context, PragmaClangBSSSection.SectionName,
14552
PragmaClangBSSSection.PragmaLocation));
14553
if (PragmaClangDataSection.Valid)
14554
VD->addAttr(PragmaClangDataSectionAttr::CreateImplicit(
14555
Context, PragmaClangDataSection.SectionName,
14556
PragmaClangDataSection.PragmaLocation));
14557
if (PragmaClangRodataSection.Valid)
14558
VD->addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
14559
Context, PragmaClangRodataSection.SectionName,
14560
PragmaClangRodataSection.PragmaLocation));
14561
if (PragmaClangRelroSection.Valid)
14562
VD->addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
14563
Context, PragmaClangRelroSection.SectionName,
14564
PragmaClangRelroSection.PragmaLocation));
14565
}
14566
14567
if (auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
14568
for (auto *BD : DD->bindings()) {
14569
FinalizeDeclaration(BD);
14570
}
14571
}
14572
14573
checkAttributesAfterMerging(*this, *VD);
14574
14575
if (VD->isStaticLocal())
14576
CheckStaticLocalForDllExport(VD);
14577
14578
if (VD->getTLSKind())
14579
CheckThreadLocalForLargeAlignment(VD);
14580
14581
// Perform check for initializers of device-side global variables.
14582
// CUDA allows empty constructors as initializers (see E.2.3.1, CUDA
14583
// 7.5). We must also apply the same checks to all __shared__
14584
// variables whether they are local or not. CUDA also allows
14585
// constant initializers for __constant__ and __device__ variables.
14586
if (getLangOpts().CUDA)
14587
CUDA().checkAllowedInitializer(VD);
14588
14589
// Grab the dllimport or dllexport attribute off of the VarDecl.
14590
const InheritableAttr *DLLAttr = getDLLAttr(VD);
14591
14592
// Imported static data members cannot be defined out-of-line.
14593
if (const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
14594
if (VD->isStaticDataMember() && VD->isOutOfLine() &&
14595
VD->isThisDeclarationADefinition()) {
14596
// We allow definitions of dllimport class template static data members
14597
// with a warning.
14598
CXXRecordDecl *Context =
14599
cast<CXXRecordDecl>(VD->getFirstDecl()->getDeclContext());
14600
bool IsClassTemplateMember =
14601
isa<ClassTemplatePartialSpecializationDecl>(Context) ||
14602
Context->getDescribedClassTemplate();
14603
14604
Diag(VD->getLocation(),
14605
IsClassTemplateMember
14606
? diag::warn_attribute_dllimport_static_field_definition
14607
: diag::err_attribute_dllimport_static_field_definition);
14608
Diag(IA->getLocation(), diag::note_attribute);
14609
if (!IsClassTemplateMember)
14610
VD->setInvalidDecl();
14611
}
14612
}
14613
14614
// dllimport/dllexport variables cannot be thread local, their TLS index
14615
// isn't exported with the variable.
14616
if (DLLAttr && VD->getTLSKind()) {
14617
auto *F = dyn_cast_or_null<FunctionDecl>(VD->getParentFunctionOrMethod());
14618
if (F && getDLLAttr(F)) {
14619
assert(VD->isStaticLocal());
14620
// But if this is a static local in a dlimport/dllexport function, the
14621
// function will never be inlined, which means the var would never be
14622
// imported, so having it marked import/export is safe.
14623
} else {
14624
Diag(VD->getLocation(), diag::err_attribute_dll_thread_local) << VD
14625
<< DLLAttr;
14626
VD->setInvalidDecl();
14627
}
14628
}
14629
14630
if (UsedAttr *Attr = VD->getAttr<UsedAttr>()) {
14631
if (!Attr->isInherited() && !VD->isThisDeclarationADefinition()) {
14632
Diag(Attr->getLocation(), diag::warn_attribute_ignored_on_non_definition)
14633
<< Attr;
14634
VD->dropAttr<UsedAttr>();
14635
}
14636
}
14637
if (RetainAttr *Attr = VD->getAttr<RetainAttr>()) {
14638
if (!Attr->isInherited() && !VD->isThisDeclarationADefinition()) {
14639
Diag(Attr->getLocation(), diag::warn_attribute_ignored_on_non_definition)
14640
<< Attr;
14641
VD->dropAttr<RetainAttr>();
14642
}
14643
}
14644
14645
const DeclContext *DC = VD->getDeclContext();
14646
// If there's a #pragma GCC visibility in scope, and this isn't a class
14647
// member, set the visibility of this variable.
14648
if (DC->getRedeclContext()->isFileContext() && VD->isExternallyVisible())
14649
AddPushedVisibilityAttribute(VD);
14650
14651
// FIXME: Warn on unused var template partial specializations.
14652
if (VD->isFileVarDecl() && !isa<VarTemplatePartialSpecializationDecl>(VD))
14653
MarkUnusedFileScopedDecl(VD);
14654
14655
// Now we have parsed the initializer and can update the table of magic
14656
// tag values.
14657
if (!VD->hasAttr<TypeTagForDatatypeAttr>() ||
14658
!VD->getType()->isIntegralOrEnumerationType())
14659
return;
14660
14661
for (const auto *I : ThisDecl->specific_attrs<TypeTagForDatatypeAttr>()) {
14662
const Expr *MagicValueExpr = VD->getInit();
14663
if (!MagicValueExpr) {
14664
continue;
14665
}
14666
std::optional<llvm::APSInt> MagicValueInt;
14667
if (!(MagicValueInt = MagicValueExpr->getIntegerConstantExpr(Context))) {
14668
Diag(I->getRange().getBegin(),
14669
diag::err_type_tag_for_datatype_not_ice)
14670
<< LangOpts.CPlusPlus << MagicValueExpr->getSourceRange();
14671
continue;
14672
}
14673
if (MagicValueInt->getActiveBits() > 64) {
14674
Diag(I->getRange().getBegin(),
14675
diag::err_type_tag_for_datatype_too_large)
14676
<< LangOpts.CPlusPlus << MagicValueExpr->getSourceRange();
14677
continue;
14678
}
14679
uint64_t MagicValue = MagicValueInt->getZExtValue();
14680
RegisterTypeTagForDatatype(I->getArgumentKind(),
14681
MagicValue,
14682
I->getMatchingCType(),
14683
I->getLayoutCompatible(),
14684
I->getMustBeNull());
14685
}
14686
}
14687
14688
static bool hasDeducedAuto(DeclaratorDecl *DD) {
14689
auto *VD = dyn_cast<VarDecl>(DD);
14690
return VD && !VD->getType()->hasAutoForTrailingReturnType();
14691
}
14692
14693
Sema::DeclGroupPtrTy Sema::FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS,
14694
ArrayRef<Decl *> Group) {
14695
SmallVector<Decl*, 8> Decls;
14696
14697
if (DS.isTypeSpecOwned())
14698
Decls.push_back(DS.getRepAsDecl());
14699
14700
DeclaratorDecl *FirstDeclaratorInGroup = nullptr;
14701
DecompositionDecl *FirstDecompDeclaratorInGroup = nullptr;
14702
bool DiagnosedMultipleDecomps = false;
14703
DeclaratorDecl *FirstNonDeducedAutoInGroup = nullptr;
14704
bool DiagnosedNonDeducedAuto = false;
14705
14706
for (Decl *D : Group) {
14707
if (!D)
14708
continue;
14709
// Check if the Decl has been declared in '#pragma omp declare target'
14710
// directive and has static storage duration.
14711
if (auto *VD = dyn_cast<VarDecl>(D);
14712
LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
14713
VD->hasGlobalStorage())
14714
OpenMP().ActOnOpenMPDeclareTargetInitializer(D);
14715
// For declarators, there are some additional syntactic-ish checks we need
14716
// to perform.
14717
if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {
14718
if (!FirstDeclaratorInGroup)
14719
FirstDeclaratorInGroup = DD;
14720
if (!FirstDecompDeclaratorInGroup)
14721
FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
14722
if (!FirstNonDeducedAutoInGroup && DS.hasAutoTypeSpec() &&
14723
!hasDeducedAuto(DD))
14724
FirstNonDeducedAutoInGroup = DD;
14725
14726
if (FirstDeclaratorInGroup != DD) {
14727
// A decomposition declaration cannot be combined with any other
14728
// declaration in the same group.
14729
if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
14730
Diag(FirstDecompDeclaratorInGroup->getLocation(),
14731
diag::err_decomp_decl_not_alone)
14732
<< FirstDeclaratorInGroup->getSourceRange()
14733
<< DD->getSourceRange();
14734
DiagnosedMultipleDecomps = true;
14735
}
14736
14737
// A declarator that uses 'auto' in any way other than to declare a
14738
// variable with a deduced type cannot be combined with any other
14739
// declarator in the same group.
14740
if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
14741
Diag(FirstNonDeducedAutoInGroup->getLocation(),
14742
diag::err_auto_non_deduced_not_alone)
14743
<< FirstNonDeducedAutoInGroup->getType()
14744
->hasAutoForTrailingReturnType()
14745
<< FirstDeclaratorInGroup->getSourceRange()
14746
<< DD->getSourceRange();
14747
DiagnosedNonDeducedAuto = true;
14748
}
14749
}
14750
}
14751
14752
Decls.push_back(D);
14753
}
14754
14755
if (DeclSpec::isDeclRep(DS.getTypeSpecType())) {
14756
if (TagDecl *Tag = dyn_cast_or_null<TagDecl>(DS.getRepAsDecl())) {
14757
handleTagNumbering(Tag, S);
14758
if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
14759
getLangOpts().CPlusPlus)
14760
Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
14761
}
14762
}
14763
14764
return BuildDeclaratorGroup(Decls);
14765
}
14766
14767
Sema::DeclGroupPtrTy
14768
Sema::BuildDeclaratorGroup(MutableArrayRef<Decl *> Group) {
14769
// C++14 [dcl.spec.auto]p7: (DR1347)
14770
// If the type that replaces the placeholder type is not the same in each
14771
// deduction, the program is ill-formed.
14772
if (Group.size() > 1) {
14773
QualType Deduced;
14774
VarDecl *DeducedDecl = nullptr;
14775
for (unsigned i = 0, e = Group.size(); i != e; ++i) {
14776
VarDecl *D = dyn_cast<VarDecl>(Group[i]);
14777
if (!D || D->isInvalidDecl())
14778
break;
14779
DeducedType *DT = D->getType()->getContainedDeducedType();
14780
if (!DT || DT->getDeducedType().isNull())
14781
continue;
14782
if (Deduced.isNull()) {
14783
Deduced = DT->getDeducedType();
14784
DeducedDecl = D;
14785
} else if (!Context.hasSameType(DT->getDeducedType(), Deduced)) {
14786
auto *AT = dyn_cast<AutoType>(DT);
14787
auto Dia = Diag(D->getTypeSourceInfo()->getTypeLoc().getBeginLoc(),
14788
diag::err_auto_different_deductions)
14789
<< (AT ? (unsigned)AT->getKeyword() : 3) << Deduced
14790
<< DeducedDecl->getDeclName() << DT->getDeducedType()
14791
<< D->getDeclName();
14792
if (DeducedDecl->hasInit())
14793
Dia << DeducedDecl->getInit()->getSourceRange();
14794
if (D->getInit())
14795
Dia << D->getInit()->getSourceRange();
14796
D->setInvalidDecl();
14797
break;
14798
}
14799
}
14800
}
14801
14802
ActOnDocumentableDecls(Group);
14803
14804
return DeclGroupPtrTy::make(
14805
DeclGroupRef::Create(Context, Group.data(), Group.size()));
14806
}
14807
14808
void Sema::ActOnDocumentableDecl(Decl *D) {
14809
ActOnDocumentableDecls(D);
14810
}
14811
14812
void Sema::ActOnDocumentableDecls(ArrayRef<Decl *> Group) {
14813
// Don't parse the comment if Doxygen diagnostics are ignored.
14814
if (Group.empty() || !Group[0])
14815
return;
14816
14817
if (Diags.isIgnored(diag::warn_doc_param_not_found,
14818
Group[0]->getLocation()) &&
14819
Diags.isIgnored(diag::warn_unknown_comment_command_name,
14820
Group[0]->getLocation()))
14821
return;
14822
14823
if (Group.size() >= 2) {
14824
// This is a decl group. Normally it will contain only declarations
14825
// produced from declarator list. But in case we have any definitions or
14826
// additional declaration references:
14827
// 'typedef struct S {} S;'
14828
// 'typedef struct S *S;'
14829
// 'struct S *pS;'
14830
// FinalizeDeclaratorGroup adds these as separate declarations.
14831
Decl *MaybeTagDecl = Group[0];
14832
if (MaybeTagDecl && isa<TagDecl>(MaybeTagDecl)) {
14833
Group = Group.slice(1);
14834
}
14835
}
14836
14837
// FIMXE: We assume every Decl in the group is in the same file.
14838
// This is false when preprocessor constructs the group from decls in
14839
// different files (e. g. macros or #include).
14840
Context.attachCommentsToJustParsedDecls(Group, &getPreprocessor());
14841
}
14842
14843
void Sema::CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D) {
14844
// Check that there are no default arguments inside the type of this
14845
// parameter.
14846
if (getLangOpts().CPlusPlus)
14847
CheckExtraCXXDefaultArguments(D);
14848
14849
// Parameter declarators cannot be qualified (C++ [dcl.meaning]p1).
14850
if (D.getCXXScopeSpec().isSet()) {
14851
Diag(D.getIdentifierLoc(), diag::err_qualified_param_declarator)
14852
<< D.getCXXScopeSpec().getRange();
14853
}
14854
14855
// [dcl.meaning]p1: An unqualified-id occurring in a declarator-id shall be a
14856
// simple identifier except [...irrelevant cases...].
14857
switch (D.getName().getKind()) {
14858
case UnqualifiedIdKind::IK_Identifier:
14859
break;
14860
14861
case UnqualifiedIdKind::IK_OperatorFunctionId:
14862
case UnqualifiedIdKind::IK_ConversionFunctionId:
14863
case UnqualifiedIdKind::IK_LiteralOperatorId:
14864
case UnqualifiedIdKind::IK_ConstructorName:
14865
case UnqualifiedIdKind::IK_DestructorName:
14866
case UnqualifiedIdKind::IK_ImplicitSelfParam:
14867
case UnqualifiedIdKind::IK_DeductionGuideName:
14868
Diag(D.getIdentifierLoc(), diag::err_bad_parameter_name)
14869
<< GetNameForDeclarator(D).getName();
14870
break;
14871
14872
case UnqualifiedIdKind::IK_TemplateId:
14873
case UnqualifiedIdKind::IK_ConstructorTemplateId:
14874
// GetNameForDeclarator would not produce a useful name in this case.
14875
Diag(D.getIdentifierLoc(), diag::err_bad_parameter_name_template_id);
14876
break;
14877
}
14878
}
14879
14880
static void CheckExplicitObjectParameter(Sema &S, ParmVarDecl *P,
14881
SourceLocation ExplicitThisLoc) {
14882
if (!ExplicitThisLoc.isValid())
14883
return;
14884
assert(S.getLangOpts().CPlusPlus &&
14885
"explicit parameter in non-cplusplus mode");
14886
if (!S.getLangOpts().CPlusPlus23)
14887
S.Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
14888
<< P->getSourceRange();
14889
14890
// C++2b [dcl.fct/7] An explicit object parameter shall not be a function
14891
// parameter pack.
14892
if (P->isParameterPack()) {
14893
S.Diag(P->getBeginLoc(), diag::err_explicit_object_parameter_pack)
14894
<< P->getSourceRange();
14895
return;
14896
}
14897
P->setExplicitObjectParameterLoc(ExplicitThisLoc);
14898
if (LambdaScopeInfo *LSI = S.getCurLambda())
14899
LSI->ExplicitObjectParameter = P;
14900
}
14901
14902
Decl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D,
14903
SourceLocation ExplicitThisLoc) {
14904
const DeclSpec &DS = D.getDeclSpec();
14905
14906
// Verify C99 6.7.5.3p2: The only SCS allowed is 'register'.
14907
14908
// C++03 [dcl.stc]p2 also permits 'auto'.
14909
StorageClass SC = SC_None;
14910
if (DS.getStorageClassSpec() == DeclSpec::SCS_register) {
14911
SC = SC_Register;
14912
// In C++11, the 'register' storage class specifier is deprecated.
14913
// In C++17, it is not allowed, but we tolerate it as an extension.
14914
if (getLangOpts().CPlusPlus11) {
14915
Diag(DS.getStorageClassSpecLoc(),
14916
getLangOpts().CPlusPlus17 ? diag::ext_register_storage_class
14917
: diag::warn_deprecated_register)
14918
<< FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());
14919
}
14920
} else if (getLangOpts().CPlusPlus &&
14921
DS.getStorageClassSpec() == DeclSpec::SCS_auto) {
14922
SC = SC_Auto;
14923
} else if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified) {
14924
Diag(DS.getStorageClassSpecLoc(),
14925
diag::err_invalid_storage_class_in_func_decl);
14926
D.getMutableDeclSpec().ClearStorageClassSpecs();
14927
}
14928
14929
if (DeclSpec::TSCS TSCS = DS.getThreadStorageClassSpec())
14930
Diag(DS.getThreadStorageClassSpecLoc(), diag::err_invalid_thread)
14931
<< DeclSpec::getSpecifierName(TSCS);
14932
if (DS.isInlineSpecified())
14933
Diag(DS.getInlineSpecLoc(), diag::err_inline_non_function)
14934
<< getLangOpts().CPlusPlus17;
14935
if (DS.hasConstexprSpecifier())
14936
Diag(DS.getConstexprSpecLoc(), diag::err_invalid_constexpr)
14937
<< 0 << static_cast<int>(D.getDeclSpec().getConstexprSpecifier());
14938
14939
DiagnoseFunctionSpecifiers(DS);
14940
14941
CheckFunctionOrTemplateParamDeclarator(S, D);
14942
14943
TypeSourceInfo *TInfo = GetTypeForDeclarator(D);
14944
QualType parmDeclType = TInfo->getType();
14945
14946
// Check for redeclaration of parameters, e.g. int foo(int x, int x);
14947
const IdentifierInfo *II = D.getIdentifier();
14948
if (II) {
14949
LookupResult R(*this, II, D.getIdentifierLoc(), LookupOrdinaryName,
14950
RedeclarationKind::ForVisibleRedeclaration);
14951
LookupName(R, S);
14952
if (!R.empty()) {
14953
NamedDecl *PrevDecl = *R.begin();
14954
if (R.isSingleResult() && PrevDecl->isTemplateParameter()) {
14955
// Maybe we will complain about the shadowed template parameter.
14956
DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl);
14957
// Just pretend that we didn't see the previous declaration.
14958
PrevDecl = nullptr;
14959
}
14960
if (PrevDecl && S->isDeclScope(PrevDecl)) {
14961
Diag(D.getIdentifierLoc(), diag::err_param_redefinition) << II;
14962
Diag(PrevDecl->getLocation(), diag::note_previous_declaration);
14963
// Recover by removing the name
14964
II = nullptr;
14965
D.SetIdentifier(nullptr, D.getIdentifierLoc());
14966
D.setInvalidType(true);
14967
}
14968
}
14969
}
14970
14971
// Temporarily put parameter variables in the translation unit, not
14972
// the enclosing context. This prevents them from accidentally
14973
// looking like class members in C++.
14974
ParmVarDecl *New =
14975
CheckParameter(Context.getTranslationUnitDecl(), D.getBeginLoc(),
14976
D.getIdentifierLoc(), II, parmDeclType, TInfo, SC);
14977
14978
if (D.isInvalidType())
14979
New->setInvalidDecl();
14980
14981
CheckExplicitObjectParameter(*this, New, ExplicitThisLoc);
14982
14983
assert(S->isFunctionPrototypeScope());
14984
assert(S->getFunctionPrototypeDepth() >= 1);
14985
New->setScopeInfo(S->getFunctionPrototypeDepth() - 1,
14986
S->getNextFunctionPrototypeIndex());
14987
14988
// Add the parameter declaration into this scope.
14989
S->AddDecl(New);
14990
if (II)
14991
IdResolver.AddDecl(New);
14992
14993
ProcessDeclAttributes(S, New, D);
14994
14995
if (D.getDeclSpec().isModulePrivateSpecified())
14996
Diag(New->getLocation(), diag::err_module_private_local)
14997
<< 1 << New << SourceRange(D.getDeclSpec().getModulePrivateSpecLoc())
14998
<< FixItHint::CreateRemoval(D.getDeclSpec().getModulePrivateSpecLoc());
14999
15000
if (New->hasAttr<BlocksAttr>()) {
15001
Diag(New->getLocation(), diag::err_block_on_nonlocal);
15002
}
15003
15004
if (getLangOpts().OpenCL)
15005
deduceOpenCLAddressSpace(New);
15006
15007
return New;
15008
}
15009
15010
ParmVarDecl *Sema::BuildParmVarDeclForTypedef(DeclContext *DC,
15011
SourceLocation Loc,
15012
QualType T) {
15013
/* FIXME: setting StartLoc == Loc.
15014
Would it be worth to modify callers so as to provide proper source
15015
location for the unnamed parameters, embedding the parameter's type? */
15016
ParmVarDecl *Param = ParmVarDecl::Create(Context, DC, Loc, Loc, nullptr,
15017
T, Context.getTrivialTypeSourceInfo(T, Loc),
15018
SC_None, nullptr);
15019
Param->setImplicit();
15020
return Param;
15021
}
15022
15023
void Sema::DiagnoseUnusedParameters(ArrayRef<ParmVarDecl *> Parameters) {
15024
// Don't diagnose unused-parameter errors in template instantiations; we
15025
// will already have done so in the template itself.
15026
if (inTemplateInstantiation())
15027
return;
15028
15029
for (const ParmVarDecl *Parameter : Parameters) {
15030
if (!Parameter->isReferenced() && Parameter->getDeclName() &&
15031
!Parameter->hasAttr<UnusedAttr>() &&
15032
!Parameter->getIdentifier()->isPlaceholder()) {
15033
Diag(Parameter->getLocation(), diag::warn_unused_parameter)
15034
<< Parameter->getDeclName();
15035
}
15036
}
15037
}
15038
15039
void Sema::DiagnoseSizeOfParametersAndReturnValue(
15040
ArrayRef<ParmVarDecl *> Parameters, QualType ReturnTy, NamedDecl *D) {
15041
if (LangOpts.NumLargeByValueCopy == 0) // No check.
15042
return;
15043
15044
// Warn if the return value is pass-by-value and larger than the specified
15045
// threshold.
15046
if (!ReturnTy->isDependentType() && ReturnTy.isPODType(Context)) {
15047
unsigned Size = Context.getTypeSizeInChars(ReturnTy).getQuantity();
15048
if (Size > LangOpts.NumLargeByValueCopy)
15049
Diag(D->getLocation(), diag::warn_return_value_size) << D << Size;
15050
}
15051
15052
// Warn if any parameter is pass-by-value and larger than the specified
15053
// threshold.
15054
for (const ParmVarDecl *Parameter : Parameters) {
15055
QualType T = Parameter->getType();
15056
if (T->isDependentType() || !T.isPODType(Context))
15057
continue;
15058
unsigned Size = Context.getTypeSizeInChars(T).getQuantity();
15059
if (Size > LangOpts.NumLargeByValueCopy)
15060
Diag(Parameter->getLocation(), diag::warn_parameter_size)
15061
<< Parameter << Size;
15062
}
15063
}
15064
15065
ParmVarDecl *Sema::CheckParameter(DeclContext *DC, SourceLocation StartLoc,
15066
SourceLocation NameLoc,
15067
const IdentifierInfo *Name, QualType T,
15068
TypeSourceInfo *TSInfo, StorageClass SC) {
15069
// In ARC, infer a lifetime qualifier for appropriate parameter types.
15070
if (getLangOpts().ObjCAutoRefCount &&
15071
T.getObjCLifetime() == Qualifiers::OCL_None &&
15072
T->isObjCLifetimeType()) {
15073
15074
Qualifiers::ObjCLifetime lifetime;
15075
15076
// Special cases for arrays:
15077
// - if it's const, use __unsafe_unretained
15078
// - otherwise, it's an error
15079
if (T->isArrayType()) {
15080
if (!T.isConstQualified()) {
15081
if (DelayedDiagnostics.shouldDelayDiagnostics())
15082
DelayedDiagnostics.add(
15083
sema::DelayedDiagnostic::makeForbiddenType(
15084
NameLoc, diag::err_arc_array_param_no_ownership, T, false));
15085
else
15086
Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15087
<< TSInfo->getTypeLoc().getSourceRange();
15088
}
15089
lifetime = Qualifiers::OCL_ExplicitNone;
15090
} else {
15091
lifetime = T->getObjCARCImplicitLifetime();
15092
}
15093
T = Context.getLifetimeQualifiedType(T, lifetime);
15094
}
15095
15096
ParmVarDecl *New = ParmVarDecl::Create(Context, DC, StartLoc, NameLoc, Name,
15097
Context.getAdjustedParameterType(T),
15098
TSInfo, SC, nullptr);
15099
15100
// Make a note if we created a new pack in the scope of a lambda, so that
15101
// we know that references to that pack must also be expanded within the
15102
// lambda scope.
15103
if (New->isParameterPack())
15104
if (auto *LSI = getEnclosingLambda())
15105
LSI->LocalPacks.push_back(New);
15106
15107
if (New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15108
New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15109
checkNonTrivialCUnion(New->getType(), New->getLocation(),
15110
NTCUC_FunctionParam, NTCUK_Destruct|NTCUK_Copy);
15111
15112
// Parameter declarators cannot be interface types. All ObjC objects are
15113
// passed by reference.
15114
if (T->isObjCObjectType()) {
15115
SourceLocation TypeEndLoc =
15116
getLocForEndOfToken(TSInfo->getTypeLoc().getEndLoc());
15117
Diag(NameLoc,
15118
diag::err_object_cannot_be_passed_returned_by_value) << 1 << T
15119
<< FixItHint::CreateInsertion(TypeEndLoc, "*");
15120
T = Context.getObjCObjectPointerType(T);
15121
New->setType(T);
15122
}
15123
15124
// ISO/IEC TR 18037 S6.7.3: "The type of an object with automatic storage
15125
// duration shall not be qualified by an address-space qualifier."
15126
// Since all parameters have automatic store duration, they can not have
15127
// an address space.
15128
if (T.getAddressSpace() != LangAS::Default &&
15129
// OpenCL allows function arguments declared to be an array of a type
15130
// to be qualified with an address space.
15131
!(getLangOpts().OpenCL &&
15132
(T->isArrayType() || T.getAddressSpace() == LangAS::opencl_private)) &&
15133
// WebAssembly allows reference types as parameters. Funcref in particular
15134
// lives in a different address space.
15135
!(T->isFunctionPointerType() &&
15136
T.getAddressSpace() == LangAS::wasm_funcref)) {
15137
Diag(NameLoc, diag::err_arg_with_address_space);
15138
New->setInvalidDecl();
15139
}
15140
15141
// PPC MMA non-pointer types are not allowed as function argument types.
15142
if (Context.getTargetInfo().getTriple().isPPC64() &&
15143
PPC().CheckPPCMMAType(New->getOriginalType(), New->getLocation())) {
15144
New->setInvalidDecl();
15145
}
15146
15147
return New;
15148
}
15149
15150
void Sema::ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D,
15151
SourceLocation LocAfterDecls) {
15152
DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
15153
15154
// C99 6.9.1p6 "If a declarator includes an identifier list, each declaration
15155
// in the declaration list shall have at least one declarator, those
15156
// declarators shall only declare identifiers from the identifier list, and
15157
// every identifier in the identifier list shall be declared.
15158
//
15159
// C89 3.7.1p5 "If a declarator includes an identifier list, only the
15160
// identifiers it names shall be declared in the declaration list."
15161
//
15162
// This is why we only diagnose in C99 and later. Note, the other conditions
15163
// listed are checked elsewhere.
15164
if (!FTI.hasPrototype) {
15165
for (int i = FTI.NumParams; i != 0; /* decrement in loop */) {
15166
--i;
15167
if (FTI.Params[i].Param == nullptr) {
15168
if (getLangOpts().C99) {
15169
SmallString<256> Code;
15170
llvm::raw_svector_ostream(Code)
15171
<< " int " << FTI.Params[i].Ident->getName() << ";\n";
15172
Diag(FTI.Params[i].IdentLoc, diag::ext_param_not_declared)
15173
<< FTI.Params[i].Ident
15174
<< FixItHint::CreateInsertion(LocAfterDecls, Code);
15175
}
15176
15177
// Implicitly declare the argument as type 'int' for lack of a better
15178
// type.
15179
AttributeFactory attrs;
15180
DeclSpec DS(attrs);
15181
const char* PrevSpec; // unused
15182
unsigned DiagID; // unused
15183
DS.SetTypeSpecType(DeclSpec::TST_int, FTI.Params[i].IdentLoc, PrevSpec,
15184
DiagID, Context.getPrintingPolicy());
15185
// Use the identifier location for the type source range.
15186
DS.SetRangeStart(FTI.Params[i].IdentLoc);
15187
DS.SetRangeEnd(FTI.Params[i].IdentLoc);
15188
Declarator ParamD(DS, ParsedAttributesView::none(),
15189
DeclaratorContext::KNRTypeList);
15190
ParamD.SetIdentifier(FTI.Params[i].Ident, FTI.Params[i].IdentLoc);
15191
FTI.Params[i].Param = ActOnParamDeclarator(S, ParamD);
15192
}
15193
}
15194
}
15195
}
15196
15197
Decl *
15198
Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Declarator &D,
15199
MultiTemplateParamsArg TemplateParameterLists,
15200
SkipBodyInfo *SkipBody, FnBodyKind BodyKind) {
15201
assert(getCurFunctionDecl() == nullptr && "Function parsing confused");
15202
assert(D.isFunctionDeclarator() && "Not a function declarator!");
15203
Scope *ParentScope = FnBodyScope->getParent();
15204
15205
// Check if we are in an `omp begin/end declare variant` scope. If we are, and
15206
// we define a non-templated function definition, we will create a declaration
15207
// instead (=BaseFD), and emit the definition with a mangled name afterwards.
15208
// The base function declaration will have the equivalent of an `omp declare
15209
// variant` annotation which specifies the mangled definition as a
15210
// specialization function under the OpenMP context defined as part of the
15211
// `omp begin declare variant`.
15212
SmallVector<FunctionDecl *, 4> Bases;
15213
if (LangOpts.OpenMP && OpenMP().isInOpenMPDeclareVariantScope())
15214
OpenMP().ActOnStartOfFunctionDefinitionInOpenMPDeclareVariantScope(
15215
ParentScope, D, TemplateParameterLists, Bases);
15216
15217
D.setFunctionDefinitionKind(FunctionDefinitionKind::Definition);
15218
Decl *DP = HandleDeclarator(ParentScope, D, TemplateParameterLists);
15219
Decl *Dcl = ActOnStartOfFunctionDef(FnBodyScope, DP, SkipBody, BodyKind);
15220
15221
if (!Bases.empty())
15222
OpenMP().ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope(Dcl,
15223
Bases);
15224
15225
return Dcl;
15226
}
15227
15228
void Sema::ActOnFinishInlineFunctionDef(FunctionDecl *D) {
15229
Consumer.HandleInlineFunctionDefinition(D);
15230
}
15231
15232
static bool FindPossiblePrototype(const FunctionDecl *FD,
15233
const FunctionDecl *&PossiblePrototype) {
15234
for (const FunctionDecl *Prev = FD->getPreviousDecl(); Prev;
15235
Prev = Prev->getPreviousDecl()) {
15236
// Ignore any declarations that occur in function or method
15237
// scope, because they aren't visible from the header.
15238
if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
15239
continue;
15240
15241
PossiblePrototype = Prev;
15242
return Prev->getType()->isFunctionProtoType();
15243
}
15244
return false;
15245
}
15246
15247
static bool
15248
ShouldWarnAboutMissingPrototype(const FunctionDecl *FD,
15249
const FunctionDecl *&PossiblePrototype) {
15250
// Don't warn about invalid declarations.
15251
if (FD->isInvalidDecl())
15252
return false;
15253
15254
// Or declarations that aren't global.
15255
if (!FD->isGlobal())
15256
return false;
15257
15258
// Don't warn about C++ member functions.
15259
if (isa<CXXMethodDecl>(FD))
15260
return false;
15261
15262
// Don't warn about 'main'.
15263
if (isa<TranslationUnitDecl>(FD->getDeclContext()->getRedeclContext()))
15264
if (IdentifierInfo *II = FD->getIdentifier())
15265
if (II->isStr("main") || II->isStr("efi_main"))
15266
return false;
15267
15268
if (FD->isMSVCRTEntryPoint())
15269
return false;
15270
15271
// Don't warn about inline functions.
15272
if (FD->isInlined())
15273
return false;
15274
15275
// Don't warn about function templates.
15276
if (FD->getDescribedFunctionTemplate())
15277
return false;
15278
15279
// Don't warn about function template specializations.
15280
if (FD->isFunctionTemplateSpecialization())
15281
return false;
15282
15283
// Don't warn for OpenCL kernels.
15284
if (FD->hasAttr<OpenCLKernelAttr>())
15285
return false;
15286
15287
// Don't warn on explicitly deleted functions.
15288
if (FD->isDeleted())
15289
return false;
15290
15291
// Don't warn on implicitly local functions (such as having local-typed
15292
// parameters).
15293
if (!FD->isExternallyVisible())
15294
return false;
15295
15296
// If we were able to find a potential prototype, don't warn.
15297
if (FindPossiblePrototype(FD, PossiblePrototype))
15298
return false;
15299
15300
return true;
15301
}
15302
15303
void
15304
Sema::CheckForFunctionRedefinition(FunctionDecl *FD,
15305
const FunctionDecl *EffectiveDefinition,
15306
SkipBodyInfo *SkipBody) {
15307
const FunctionDecl *Definition = EffectiveDefinition;
15308
if (!Definition &&
15309
!FD->isDefined(Definition, /*CheckForPendingFriendDefinition*/ true))
15310
return;
15311
15312
if (Definition->getFriendObjectKind() != Decl::FOK_None) {
15313
if (FunctionDecl *OrigDef = Definition->getInstantiatedFromMemberFunction()) {
15314
if (FunctionDecl *OrigFD = FD->getInstantiatedFromMemberFunction()) {
15315
// A merged copy of the same function, instantiated as a member of
15316
// the same class, is OK.
15317
if (declaresSameEntity(OrigFD, OrigDef) &&
15318
declaresSameEntity(cast<Decl>(Definition->getLexicalDeclContext()),
15319
cast<Decl>(FD->getLexicalDeclContext())))
15320
return;
15321
}
15322
}
15323
}
15324
15325
if (canRedefineFunction(Definition, getLangOpts()))
15326
return;
15327
15328
// Don't emit an error when this is redefinition of a typo-corrected
15329
// definition.
15330
if (TypoCorrectedFunctionDefinitions.count(Definition))
15331
return;
15332
15333
// If we don't have a visible definition of the function, and it's inline or
15334
// a template, skip the new definition.
15335
if (SkipBody && !hasVisibleDefinition(Definition) &&
15336
(Definition->getFormalLinkage() == Linkage::Internal ||
15337
Definition->isInlined() || Definition->getDescribedFunctionTemplate() ||
15338
Definition->getNumTemplateParameterLists())) {
15339
SkipBody->ShouldSkip = true;
15340
SkipBody->Previous = const_cast<FunctionDecl*>(Definition);
15341
if (auto *TD = Definition->getDescribedFunctionTemplate())
15342
makeMergedDefinitionVisible(TD);
15343
makeMergedDefinitionVisible(const_cast<FunctionDecl*>(Definition));
15344
return;
15345
}
15346
15347
if (getLangOpts().GNUMode && Definition->isInlineSpecified() &&
15348
Definition->getStorageClass() == SC_Extern)
15349
Diag(FD->getLocation(), diag::err_redefinition_extern_inline)
15350
<< FD << getLangOpts().CPlusPlus;
15351
else
15352
Diag(FD->getLocation(), diag::err_redefinition) << FD;
15353
15354
Diag(Definition->getLocation(), diag::note_previous_definition);
15355
FD->setInvalidDecl();
15356
}
15357
15358
LambdaScopeInfo *Sema::RebuildLambdaScopeInfo(CXXMethodDecl *CallOperator) {
15359
CXXRecordDecl *LambdaClass = CallOperator->getParent();
15360
15361
LambdaScopeInfo *LSI = PushLambdaScope();
15362
LSI->CallOperator = CallOperator;
15363
LSI->Lambda = LambdaClass;
15364
LSI->ReturnType = CallOperator->getReturnType();
15365
// This function in calls in situation where the context of the call operator
15366
// is not entered, so we set AfterParameterList to false, so that
15367
// `tryCaptureVariable` finds explicit captures in the appropriate context.
15368
LSI->AfterParameterList = false;
15369
const LambdaCaptureDefault LCD = LambdaClass->getLambdaCaptureDefault();
15370
15371
if (LCD == LCD_None)
15372
LSI->ImpCaptureStyle = CapturingScopeInfo::ImpCap_None;
15373
else if (LCD == LCD_ByCopy)
15374
LSI->ImpCaptureStyle = CapturingScopeInfo::ImpCap_LambdaByval;
15375
else if (LCD == LCD_ByRef)
15376
LSI->ImpCaptureStyle = CapturingScopeInfo::ImpCap_LambdaByref;
15377
DeclarationNameInfo DNI = CallOperator->getNameInfo();
15378
15379
LSI->IntroducerRange = DNI.getCXXOperatorNameRange();
15380
LSI->Mutable = !CallOperator->isConst();
15381
if (CallOperator->isExplicitObjectMemberFunction())
15382
LSI->ExplicitObjectParameter = CallOperator->getParamDecl(0);
15383
15384
// Add the captures to the LSI so they can be noted as already
15385
// captured within tryCaptureVar.
15386
auto I = LambdaClass->field_begin();
15387
for (const auto &C : LambdaClass->captures()) {
15388
if (C.capturesVariable()) {
15389
ValueDecl *VD = C.getCapturedVar();
15390
if (VD->isInitCapture())
15391
CurrentInstantiationScope->InstantiatedLocal(VD, VD);
15392
const bool ByRef = C.getCaptureKind() == LCK_ByRef;
15393
LSI->addCapture(VD, /*IsBlock*/false, ByRef,
15394
/*RefersToEnclosingVariableOrCapture*/true, C.getLocation(),
15395
/*EllipsisLoc*/C.isPackExpansion()
15396
? C.getEllipsisLoc() : SourceLocation(),
15397
I->getType(), /*Invalid*/false);
15398
15399
} else if (C.capturesThis()) {
15400
LSI->addThisCapture(/*Nested*/ false, C.getLocation(), I->getType(),
15401
C.getCaptureKind() == LCK_StarThis);
15402
} else {
15403
LSI->addVLATypeCapture(C.getLocation(), I->getCapturedVLAType(),
15404
I->getType());
15405
}
15406
++I;
15407
}
15408
return LSI;
15409
}
15410
15411
Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D,
15412
SkipBodyInfo *SkipBody,
15413
FnBodyKind BodyKind) {
15414
if (!D) {
15415
// Parsing the function declaration failed in some way. Push on a fake scope
15416
// anyway so we can try to parse the function body.
15417
PushFunctionScope();
15418
PushExpressionEvaluationContext(ExprEvalContexts.back().Context);
15419
return D;
15420
}
15421
15422
FunctionDecl *FD = nullptr;
15423
15424
if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
15425
FD = FunTmpl->getTemplatedDecl();
15426
else
15427
FD = cast<FunctionDecl>(D);
15428
15429
// Do not push if it is a lambda because one is already pushed when building
15430
// the lambda in ActOnStartOfLambdaDefinition().
15431
if (!isLambdaCallOperator(FD))
15432
// [expr.const]/p14.1
15433
// An expression or conversion is in an immediate function context if it is
15434
// potentially evaluated and either: its innermost enclosing non-block scope
15435
// is a function parameter scope of an immediate function.
15436
PushExpressionEvaluationContext(
15437
FD->isConsteval() ? ExpressionEvaluationContext::ImmediateFunctionContext
15438
: ExprEvalContexts.back().Context);
15439
15440
// Each ExpressionEvaluationContextRecord also keeps track of whether the
15441
// context is nested in an immediate function context, so smaller contexts
15442
// that appear inside immediate functions (like variable initializers) are
15443
// considered to be inside an immediate function context even though by
15444
// themselves they are not immediate function contexts. But when a new
15445
// function is entered, we need to reset this tracking, since the entered
15446
// function might be not an immediate function.
15447
ExprEvalContexts.back().InImmediateFunctionContext = FD->isConsteval();
15448
ExprEvalContexts.back().InImmediateEscalatingFunctionContext =
15449
getLangOpts().CPlusPlus20 && FD->isImmediateEscalating();
15450
15451
// Check for defining attributes before the check for redefinition.
15452
if (const auto *Attr = FD->getAttr<AliasAttr>()) {
15453
Diag(Attr->getLocation(), diag::err_alias_is_definition) << FD << 0;
15454
FD->dropAttr<AliasAttr>();
15455
FD->setInvalidDecl();
15456
}
15457
if (const auto *Attr = FD->getAttr<IFuncAttr>()) {
15458
Diag(Attr->getLocation(), diag::err_alias_is_definition) << FD << 1;
15459
FD->dropAttr<IFuncAttr>();
15460
FD->setInvalidDecl();
15461
}
15462
if (const auto *Attr = FD->getAttr<TargetVersionAttr>()) {
15463
if (!Context.getTargetInfo().hasFeature("fmv") &&
15464
!Attr->isDefaultVersion()) {
15465
// If function multi versioning disabled skip parsing function body
15466
// defined with non-default target_version attribute
15467
if (SkipBody)
15468
SkipBody->ShouldSkip = true;
15469
return nullptr;
15470
}
15471
}
15472
15473
if (auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
15474
if (Ctor->getTemplateSpecializationKind() == TSK_ExplicitSpecialization &&
15475
Ctor->isDefaultConstructor() &&
15476
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
15477
// If this is an MS ABI dllexport default constructor, instantiate any
15478
// default arguments.
15479
InstantiateDefaultCtorDefaultArgs(Ctor);
15480
}
15481
}
15482
15483
// See if this is a redefinition. If 'will have body' (or similar) is already
15484
// set, then these checks were already performed when it was set.
15485
if (!FD->willHaveBody() && !FD->isLateTemplateParsed() &&
15486
!FD->isThisDeclarationInstantiatedFromAFriendDefinition()) {
15487
CheckForFunctionRedefinition(FD, nullptr, SkipBody);
15488
15489
// If we're skipping the body, we're done. Don't enter the scope.
15490
if (SkipBody && SkipBody->ShouldSkip)
15491
return D;
15492
}
15493
15494
// Mark this function as "will have a body eventually". This lets users to
15495
// call e.g. isInlineDefinitionExternallyVisible while we're still parsing
15496
// this function.
15497
FD->setWillHaveBody();
15498
15499
// If we are instantiating a generic lambda call operator, push
15500
// a LambdaScopeInfo onto the function stack. But use the information
15501
// that's already been calculated (ActOnLambdaExpr) to prime the current
15502
// LambdaScopeInfo.
15503
// When the template operator is being specialized, the LambdaScopeInfo,
15504
// has to be properly restored so that tryCaptureVariable doesn't try
15505
// and capture any new variables. In addition when calculating potential
15506
// captures during transformation of nested lambdas, it is necessary to
15507
// have the LSI properly restored.
15508
if (isGenericLambdaCallOperatorSpecialization(FD)) {
15509
// C++2c 7.5.5.2p17 A member of a closure type shall not be explicitly
15510
// instantiated, explicitly specialized.
15511
if (FD->getTemplateSpecializationInfo()
15512
->isExplicitInstantiationOrSpecialization()) {
15513
Diag(FD->getLocation(), diag::err_lambda_explicit_spec);
15514
FD->setInvalidDecl();
15515
PushFunctionScope();
15516
} else {
15517
assert(inTemplateInstantiation() &&
15518
"There should be an active template instantiation on the stack "
15519
"when instantiating a generic lambda!");
15520
RebuildLambdaScopeInfo(cast<CXXMethodDecl>(D));
15521
}
15522
} else {
15523
// Enter a new function scope
15524
PushFunctionScope();
15525
}
15526
15527
// Builtin functions cannot be defined.
15528
if (unsigned BuiltinID = FD->getBuiltinID()) {
15529
if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
15530
!Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
15531
Diag(FD->getLocation(), diag::err_builtin_definition) << FD;
15532
FD->setInvalidDecl();
15533
}
15534
}
15535
15536
// The return type of a function definition must be complete (C99 6.9.1p3).
15537
// C++23 [dcl.fct.def.general]/p2
15538
// The type of [...] the return for a function definition
15539
// shall not be a (possibly cv-qualified) class type that is incomplete
15540
// or abstract within the function body unless the function is deleted.
15541
QualType ResultType = FD->getReturnType();
15542
if (!ResultType->isDependentType() && !ResultType->isVoidType() &&
15543
!FD->isInvalidDecl() && BodyKind != FnBodyKind::Delete &&
15544
(RequireCompleteType(FD->getLocation(), ResultType,
15545
diag::err_func_def_incomplete_result) ||
15546
RequireNonAbstractType(FD->getLocation(), FD->getReturnType(),
15547
diag::err_abstract_type_in_decl,
15548
AbstractReturnType)))
15549
FD->setInvalidDecl();
15550
15551
if (FnBodyScope)
15552
PushDeclContext(FnBodyScope, FD);
15553
15554
// Check the validity of our function parameters
15555
if (BodyKind != FnBodyKind::Delete)
15556
CheckParmsForFunctionDef(FD->parameters(),
15557
/*CheckParameterNames=*/true);
15558
15559
// Add non-parameter declarations already in the function to the current
15560
// scope.
15561
if (FnBodyScope) {
15562
for (Decl *NPD : FD->decls()) {
15563
auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
15564
if (!NonParmDecl)
15565
continue;
15566
assert(!isa<ParmVarDecl>(NonParmDecl) &&
15567
"parameters should not be in newly created FD yet");
15568
15569
// If the decl has a name, make it accessible in the current scope.
15570
if (NonParmDecl->getDeclName())
15571
PushOnScopeChains(NonParmDecl, FnBodyScope, /*AddToContext=*/false);
15572
15573
// Similarly, dive into enums and fish their constants out, making them
15574
// accessible in this scope.
15575
if (auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
15576
for (auto *EI : ED->enumerators())
15577
PushOnScopeChains(EI, FnBodyScope, /*AddToContext=*/false);
15578
}
15579
}
15580
}
15581
15582
// Introduce our parameters into the function scope
15583
for (auto *Param : FD->parameters()) {
15584
Param->setOwningFunction(FD);
15585
15586
// If this has an identifier, add it to the scope stack.
15587
if (Param->getIdentifier() && FnBodyScope) {
15588
CheckShadow(FnBodyScope, Param);
15589
15590
PushOnScopeChains(Param, FnBodyScope);
15591
}
15592
}
15593
15594
// C++ [module.import/6] external definitions are not permitted in header
15595
// units. Deleted and Defaulted functions are implicitly inline (but the
15596
// inline state is not set at this point, so check the BodyKind explicitly).
15597
// FIXME: Consider an alternate location for the test where the inlined()
15598
// state is complete.
15599
if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() &&
15600
!FD->isInvalidDecl() && !FD->isInlined() &&
15601
BodyKind != FnBodyKind::Delete && BodyKind != FnBodyKind::Default &&
15602
FD->getFormalLinkage() == Linkage::External && !FD->isTemplated() &&
15603
!FD->isTemplateInstantiation()) {
15604
assert(FD->isThisDeclarationADefinition());
15605
Diag(FD->getLocation(), diag::err_extern_def_in_header_unit);
15606
FD->setInvalidDecl();
15607
}
15608
15609
// Ensure that the function's exception specification is instantiated.
15610
if (const FunctionProtoType *FPT = FD->getType()->getAs<FunctionProtoType>())
15611
ResolveExceptionSpec(D->getLocation(), FPT);
15612
15613
// dllimport cannot be applied to non-inline function definitions.
15614
if (FD->hasAttr<DLLImportAttr>() && !FD->isInlined() &&
15615
!FD->isTemplateInstantiation()) {
15616
assert(!FD->hasAttr<DLLExportAttr>());
15617
Diag(FD->getLocation(), diag::err_attribute_dllimport_function_definition);
15618
FD->setInvalidDecl();
15619
return D;
15620
}
15621
15622
// Some function attributes (like OptimizeNoneAttr) need actions before
15623
// parsing body started.
15624
applyFunctionAttributesBeforeParsingBody(D);
15625
15626
// We want to attach documentation to original Decl (which might be
15627
// a function template).
15628
ActOnDocumentableDecl(D);
15629
if (getCurLexicalContext()->isObjCContainer() &&
15630
getCurLexicalContext()->getDeclKind() != Decl::ObjCCategoryImpl &&
15631
getCurLexicalContext()->getDeclKind() != Decl::ObjCImplementation)
15632
Diag(FD->getLocation(), diag::warn_function_def_in_objc_container);
15633
15634
return D;
15635
}
15636
15637
void Sema::applyFunctionAttributesBeforeParsingBody(Decl *FD) {
15638
if (!FD || FD->isInvalidDecl())
15639
return;
15640
if (auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
15641
FD = TD->getTemplatedDecl();
15642
if (FD && FD->hasAttr<OptimizeNoneAttr>()) {
15643
FPOptionsOverride FPO;
15644
FPO.setDisallowOptimizations();
15645
CurFPFeatures.applyChanges(FPO);
15646
FpPragmaStack.CurrentValue =
15647
CurFPFeatures.getChangesFrom(FPOptions(LangOpts));
15648
}
15649
}
15650
15651
void Sema::computeNRVO(Stmt *Body, FunctionScopeInfo *Scope) {
15652
ReturnStmt **Returns = Scope->Returns.data();
15653
15654
for (unsigned I = 0, E = Scope->Returns.size(); I != E; ++I) {
15655
if (const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
15656
if (!NRVOCandidate->isNRVOVariable())
15657
Returns[I]->setNRVOCandidate(nullptr);
15658
}
15659
}
15660
}
15661
15662
bool Sema::canDelayFunctionBody(const Declarator &D) {
15663
// We can't delay parsing the body of a constexpr function template (yet).
15664
if (D.getDeclSpec().hasConstexprSpecifier())
15665
return false;
15666
15667
// We can't delay parsing the body of a function template with a deduced
15668
// return type (yet).
15669
if (D.getDeclSpec().hasAutoTypeSpec()) {
15670
// If the placeholder introduces a non-deduced trailing return type,
15671
// we can still delay parsing it.
15672
if (D.getNumTypeObjects()) {
15673
const auto &Outer = D.getTypeObject(D.getNumTypeObjects() - 1);
15674
if (Outer.Kind == DeclaratorChunk::Function &&
15675
Outer.Fun.hasTrailingReturnType()) {
15676
QualType Ty = GetTypeFromParser(Outer.Fun.getTrailingReturnType());
15677
return Ty.isNull() || !Ty->isUndeducedType();
15678
}
15679
}
15680
return false;
15681
}
15682
15683
return true;
15684
}
15685
15686
bool Sema::canSkipFunctionBody(Decl *D) {
15687
// We cannot skip the body of a function (or function template) which is
15688
// constexpr, since we may need to evaluate its body in order to parse the
15689
// rest of the file.
15690
// We cannot skip the body of a function with an undeduced return type,
15691
// because any callers of that function need to know the type.
15692
if (const FunctionDecl *FD = D->getAsFunction()) {
15693
if (FD->isConstexpr())
15694
return false;
15695
// We can't simply call Type::isUndeducedType here, because inside template
15696
// auto can be deduced to a dependent type, which is not considered
15697
// "undeduced".
15698
if (FD->getReturnType()->getContainedDeducedType())
15699
return false;
15700
}
15701
return Consumer.shouldSkipFunctionBody(D);
15702
}
15703
15704
Decl *Sema::ActOnSkippedFunctionBody(Decl *Decl) {
15705
if (!Decl)
15706
return nullptr;
15707
if (FunctionDecl *FD = Decl->getAsFunction())
15708
FD->setHasSkippedBody();
15709
else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(Decl))
15710
MD->setHasSkippedBody();
15711
return Decl;
15712
}
15713
15714
Decl *Sema::ActOnFinishFunctionBody(Decl *D, Stmt *BodyArg) {
15715
return ActOnFinishFunctionBody(D, BodyArg, /*IsInstantiation=*/false);
15716
}
15717
15718
/// RAII object that pops an ExpressionEvaluationContext when exiting a function
15719
/// body.
15720
class ExitFunctionBodyRAII {
15721
public:
15722
ExitFunctionBodyRAII(Sema &S, bool IsLambda) : S(S), IsLambda(IsLambda) {}
15723
~ExitFunctionBodyRAII() {
15724
if (!IsLambda)
15725
S.PopExpressionEvaluationContext();
15726
}
15727
15728
private:
15729
Sema &S;
15730
bool IsLambda = false;
15731
};
15732
15733
static void diagnoseImplicitlyRetainedSelf(Sema &S) {
15734
llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
15735
15736
auto IsOrNestedInEscapingBlock = [&](const BlockDecl *BD) {
15737
if (EscapeInfo.count(BD))
15738
return EscapeInfo[BD];
15739
15740
bool R = false;
15741
const BlockDecl *CurBD = BD;
15742
15743
do {
15744
R = !CurBD->doesNotEscape();
15745
if (R)
15746
break;
15747
CurBD = CurBD->getParent()->getInnermostBlockDecl();
15748
} while (CurBD);
15749
15750
return EscapeInfo[BD] = R;
15751
};
15752
15753
// If the location where 'self' is implicitly retained is inside a escaping
15754
// block, emit a diagnostic.
15755
for (const std::pair<SourceLocation, const BlockDecl *> &P :
15756
S.ImplicitlyRetainedSelfLocs)
15757
if (IsOrNestedInEscapingBlock(P.second))
15758
S.Diag(P.first, diag::warn_implicitly_retains_self)
15759
<< FixItHint::CreateInsertion(P.first, "self->");
15760
}
15761
15762
static bool methodHasName(const FunctionDecl *FD, StringRef Name) {
15763
return isa<CXXMethodDecl>(FD) && FD->param_empty() &&
15764
FD->getDeclName().isIdentifier() && FD->getName() == Name;
15765
}
15766
15767
bool Sema::CanBeGetReturnObject(const FunctionDecl *FD) {
15768
return methodHasName(FD, "get_return_object");
15769
}
15770
15771
bool Sema::CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD) {
15772
return FD->isStatic() &&
15773
methodHasName(FD, "get_return_object_on_allocation_failure");
15774
}
15775
15776
void Sema::CheckCoroutineWrapper(FunctionDecl *FD) {
15777
RecordDecl *RD = FD->getReturnType()->getAsRecordDecl();
15778
if (!RD || !RD->getUnderlyingDecl()->hasAttr<CoroReturnTypeAttr>())
15779
return;
15780
// Allow some_promise_type::get_return_object().
15781
if (CanBeGetReturnObject(FD) || CanBeGetReturnTypeOnAllocFailure(FD))
15782
return;
15783
if (!FD->hasAttr<CoroWrapperAttr>())
15784
Diag(FD->getLocation(), diag::err_coroutine_return_type) << RD;
15785
}
15786
15787
Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
15788
bool IsInstantiation) {
15789
FunctionScopeInfo *FSI = getCurFunction();
15790
FunctionDecl *FD = dcl ? dcl->getAsFunction() : nullptr;
15791
15792
if (FSI->UsesFPIntrin && FD && !FD->hasAttr<StrictFPAttr>())
15793
FD->addAttr(StrictFPAttr::CreateImplicit(Context));
15794
15795
sema::AnalysisBasedWarnings::Policy WP = AnalysisWarnings.getDefaultPolicy();
15796
sema::AnalysisBasedWarnings::Policy *ActivePolicy = nullptr;
15797
15798
// If we skip function body, we can't tell if a function is a coroutine.
15799
if (getLangOpts().Coroutines && FD && !FD->hasSkippedBody()) {
15800
if (FSI->isCoroutine())
15801
CheckCompletedCoroutineBody(FD, Body);
15802
else
15803
CheckCoroutineWrapper(FD);
15804
}
15805
15806
{
15807
// Do not call PopExpressionEvaluationContext() if it is a lambda because
15808
// one is already popped when finishing the lambda in BuildLambdaExpr().
15809
// This is meant to pop the context added in ActOnStartOfFunctionDef().
15810
ExitFunctionBodyRAII ExitRAII(*this, isLambdaCallOperator(FD));
15811
if (FD) {
15812
// If this is called by Parser::ParseFunctionDefinition() after marking
15813
// the declaration as deleted, and if the deleted-function-body contains
15814
// a message (C++26), then a DefaultedOrDeletedInfo will have already been
15815
// added to store that message; do not overwrite it in that case.
15816
//
15817
// Since this would always set the body to 'nullptr' in that case anyway,
15818
// which is already done when the function decl is initially created,
15819
// always skipping this irrespective of whether there is a delete message
15820
// should not be a problem.
15821
if (!FD->isDeletedAsWritten())
15822
FD->setBody(Body);
15823
FD->setWillHaveBody(false);
15824
CheckImmediateEscalatingFunctionDefinition(FD, FSI);
15825
15826
if (getLangOpts().CPlusPlus14) {
15827
if (!FD->isInvalidDecl() && Body && !FD->isDependentContext() &&
15828
FD->getReturnType()->isUndeducedType()) {
15829
// For a function with a deduced result type to return void,
15830
// the result type as written must be 'auto' or 'decltype(auto)',
15831
// possibly cv-qualified or constrained, but not ref-qualified.
15832
if (!FD->getReturnType()->getAs<AutoType>()) {
15833
Diag(dcl->getLocation(), diag::err_auto_fn_no_return_but_not_auto)
15834
<< FD->getReturnType();
15835
FD->setInvalidDecl();
15836
} else {
15837
// Falling off the end of the function is the same as 'return;'.
15838
Expr *Dummy = nullptr;
15839
if (DeduceFunctionTypeFromReturnExpr(
15840
FD, dcl->getLocation(), Dummy,
15841
FD->getReturnType()->getAs<AutoType>()))
15842
FD->setInvalidDecl();
15843
}
15844
}
15845
} else if (getLangOpts().CPlusPlus && isLambdaCallOperator(FD)) {
15846
// In C++11, we don't use 'auto' deduction rules for lambda call
15847
// operators because we don't support return type deduction.
15848
auto *LSI = getCurLambda();
15849
if (LSI->HasImplicitReturnType) {
15850
deduceClosureReturnType(*LSI);
15851
15852
// C++11 [expr.prim.lambda]p4:
15853
// [...] if there are no return statements in the compound-statement
15854
// [the deduced type is] the type void
15855
QualType RetType =
15856
LSI->ReturnType.isNull() ? Context.VoidTy : LSI->ReturnType;
15857
15858
// Update the return type to the deduced type.
15859
const auto *Proto = FD->getType()->castAs<FunctionProtoType>();
15860
FD->setType(Context.getFunctionType(RetType, Proto->getParamTypes(),
15861
Proto->getExtProtoInfo()));
15862
}
15863
}
15864
15865
// If the function implicitly returns zero (like 'main') or is naked,
15866
// don't complain about missing return statements.
15867
if (FD->hasImplicitReturnZero() || FD->hasAttr<NakedAttr>())
15868
WP.disableCheckFallThrough();
15869
15870
// MSVC permits the use of pure specifier (=0) on function definition,
15871
// defined at class scope, warn about this non-standard construct.
15872
if (getLangOpts().MicrosoftExt && FD->isPureVirtual() &&
15873
!FD->isOutOfLine())
15874
Diag(FD->getLocation(), diag::ext_pure_function_definition);
15875
15876
if (!FD->isInvalidDecl()) {
15877
// Don't diagnose unused parameters of defaulted, deleted or naked
15878
// functions.
15879
if (!FD->isDeleted() && !FD->isDefaulted() && !FD->hasSkippedBody() &&
15880
!FD->hasAttr<NakedAttr>())
15881
DiagnoseUnusedParameters(FD->parameters());
15882
DiagnoseSizeOfParametersAndReturnValue(FD->parameters(),
15883
FD->getReturnType(), FD);
15884
15885
// If this is a structor, we need a vtable.
15886
if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(FD))
15887
MarkVTableUsed(FD->getLocation(), Constructor->getParent());
15888
else if (CXXDestructorDecl *Destructor =
15889
dyn_cast<CXXDestructorDecl>(FD))
15890
MarkVTableUsed(FD->getLocation(), Destructor->getParent());
15891
15892
// Try to apply the named return value optimization. We have to check
15893
// if we can do this here because lambdas keep return statements around
15894
// to deduce an implicit return type.
15895
if (FD->getReturnType()->isRecordType() &&
15896
(!getLangOpts().CPlusPlus || !FD->isDependentContext()))
15897
computeNRVO(Body, FSI);
15898
}
15899
15900
// GNU warning -Wmissing-prototypes:
15901
// Warn if a global function is defined without a previous
15902
// prototype declaration. This warning is issued even if the
15903
// definition itself provides a prototype. The aim is to detect
15904
// global functions that fail to be declared in header files.
15905
const FunctionDecl *PossiblePrototype = nullptr;
15906
if (ShouldWarnAboutMissingPrototype(FD, PossiblePrototype)) {
15907
Diag(FD->getLocation(), diag::warn_missing_prototype) << FD;
15908
15909
if (PossiblePrototype) {
15910
// We found a declaration that is not a prototype,
15911
// but that could be a zero-parameter prototype
15912
if (TypeSourceInfo *TI = PossiblePrototype->getTypeSourceInfo()) {
15913
TypeLoc TL = TI->getTypeLoc();
15914
if (FunctionNoProtoTypeLoc FTL = TL.getAs<FunctionNoProtoTypeLoc>())
15915
Diag(PossiblePrototype->getLocation(),
15916
diag::note_declaration_not_a_prototype)
15917
<< (FD->getNumParams() != 0)
15918
<< (FD->getNumParams() == 0 ? FixItHint::CreateInsertion(
15919
FTL.getRParenLoc(), "void")
15920
: FixItHint{});
15921
}
15922
} else {
15923
// Returns true if the token beginning at this Loc is `const`.
15924
auto isLocAtConst = [&](SourceLocation Loc, const SourceManager &SM,
15925
const LangOptions &LangOpts) {
15926
std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
15927
if (LocInfo.first.isInvalid())
15928
return false;
15929
15930
bool Invalid = false;
15931
StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid);
15932
if (Invalid)
15933
return false;
15934
15935
if (LocInfo.second > Buffer.size())
15936
return false;
15937
15938
const char *LexStart = Buffer.data() + LocInfo.second;
15939
StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
15940
15941
return StartTok.consume_front("const") &&
15942
(StartTok.empty() || isWhitespace(StartTok[0]) ||
15943
StartTok.starts_with("/*") || StartTok.starts_with("//"));
15944
};
15945
15946
auto findBeginLoc = [&]() {
15947
// If the return type has `const` qualifier, we want to insert
15948
// `static` before `const` (and not before the typename).
15949
if ((FD->getReturnType()->isAnyPointerType() &&
15950
FD->getReturnType()->getPointeeType().isConstQualified()) ||
15951
FD->getReturnType().isConstQualified()) {
15952
// But only do this if we can determine where the `const` is.
15953
15954
if (isLocAtConst(FD->getBeginLoc(), getSourceManager(),
15955
getLangOpts()))
15956
15957
return FD->getBeginLoc();
15958
}
15959
return FD->getTypeSpecStartLoc();
15960
};
15961
Diag(FD->getTypeSpecStartLoc(),
15962
diag::note_static_for_internal_linkage)
15963
<< /* function */ 1
15964
<< (FD->getStorageClass() == SC_None
15965
? FixItHint::CreateInsertion(findBeginLoc(), "static ")
15966
: FixItHint{});
15967
}
15968
}
15969
15970
// We might not have found a prototype because we didn't wish to warn on
15971
// the lack of a missing prototype. Try again without the checks for
15972
// whether we want to warn on the missing prototype.
15973
if (!PossiblePrototype)
15974
(void)FindPossiblePrototype(FD, PossiblePrototype);
15975
15976
// If the function being defined does not have a prototype, then we may
15977
// need to diagnose it as changing behavior in C23 because we now know
15978
// whether the function accepts arguments or not. This only handles the
15979
// case where the definition has no prototype but does have parameters
15980
// and either there is no previous potential prototype, or the previous
15981
// potential prototype also has no actual prototype. This handles cases
15982
// like:
15983
// void f(); void f(a) int a; {}
15984
// void g(a) int a; {}
15985
// See MergeFunctionDecl() for other cases of the behavior change
15986
// diagnostic. See GetFullTypeForDeclarator() for handling of a function
15987
// type without a prototype.
15988
if (!FD->hasWrittenPrototype() && FD->getNumParams() != 0 &&
15989
(!PossiblePrototype || (!PossiblePrototype->hasWrittenPrototype() &&
15990
!PossiblePrototype->isImplicit()))) {
15991
// The function definition has parameters, so this will change behavior
15992
// in C23. If there is a possible prototype, it comes before the
15993
// function definition.
15994
// FIXME: The declaration may have already been diagnosed as being
15995
// deprecated in GetFullTypeForDeclarator() if it had no arguments, but
15996
// there's no way to test for the "changes behavior" condition in
15997
// SemaType.cpp when forming the declaration's function type. So, we do
15998
// this awkward dance instead.
15999
//
16000
// If we have a possible prototype and it declares a function with a
16001
// prototype, we don't want to diagnose it; if we have a possible
16002
// prototype and it has no prototype, it may have already been
16003
// diagnosed in SemaType.cpp as deprecated depending on whether
16004
// -Wstrict-prototypes is enabled. If we already warned about it being
16005
// deprecated, add a note that it also changes behavior. If we didn't
16006
// warn about it being deprecated (because the diagnostic is not
16007
// enabled), warn now that it is deprecated and changes behavior.
16008
16009
// This K&R C function definition definitely changes behavior in C23,
16010
// so diagnose it.
16011
Diag(FD->getLocation(), diag::warn_non_prototype_changes_behavior)
16012
<< /*definition*/ 1 << /* not supported in C23 */ 0;
16013
16014
// If we have a possible prototype for the function which is a user-
16015
// visible declaration, we already tested that it has no prototype.
16016
// This will change behavior in C23. This gets a warning rather than a
16017
// note because it's the same behavior-changing problem as with the
16018
// definition.
16019
if (PossiblePrototype)
16020
Diag(PossiblePrototype->getLocation(),
16021
diag::warn_non_prototype_changes_behavior)
16022
<< /*declaration*/ 0 << /* conflicting */ 1 << /*subsequent*/ 1
16023
<< /*definition*/ 1;
16024
}
16025
16026
// Warn on CPUDispatch with an actual body.
16027
if (FD->isMultiVersion() && FD->hasAttr<CPUDispatchAttr>() && Body)
16028
if (const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16029
if (!CmpndBody->body_empty())
16030
Diag(CmpndBody->body_front()->getBeginLoc(),
16031
diag::warn_dispatch_body_ignored);
16032
16033
if (auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16034
const CXXMethodDecl *KeyFunction;
16035
if (MD->isOutOfLine() && (MD = MD->getCanonicalDecl()) &&
16036
MD->isVirtual() &&
16037
(KeyFunction = Context.getCurrentKeyFunction(MD->getParent())) &&
16038
MD == KeyFunction->getCanonicalDecl()) {
16039
// Update the key-function state if necessary for this ABI.
16040
if (FD->isInlined() &&
16041
!Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16042
Context.setNonKeyFunction(MD);
16043
16044
// If the newly-chosen key function is already defined, then we
16045
// need to mark the vtable as used retroactively.
16046
KeyFunction = Context.getCurrentKeyFunction(MD->getParent());
16047
const FunctionDecl *Definition;
16048
if (KeyFunction && KeyFunction->isDefined(Definition))
16049
MarkVTableUsed(Definition->getLocation(), MD->getParent(), true);
16050
} else {
16051
// We just defined they key function; mark the vtable as used.
16052
MarkVTableUsed(FD->getLocation(), MD->getParent(), true);
16053
}
16054
}
16055
}
16056
16057
assert((FD == getCurFunctionDecl(/*AllowLambdas=*/true)) &&
16058
"Function parsing confused");
16059
} else if (ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16060
assert(MD == getCurMethodDecl() && "Method parsing confused");
16061
MD->setBody(Body);
16062
if (!MD->isInvalidDecl()) {
16063
DiagnoseSizeOfParametersAndReturnValue(MD->parameters(),
16064
MD->getReturnType(), MD);
16065
16066
if (Body)
16067
computeNRVO(Body, FSI);
16068
}
16069
if (FSI->ObjCShouldCallSuper) {
16070
Diag(MD->getEndLoc(), diag::warn_objc_missing_super_call)
16071
<< MD->getSelector().getAsString();
16072
FSI->ObjCShouldCallSuper = false;
16073
}
16074
if (FSI->ObjCWarnForNoDesignatedInitChain) {
16075
const ObjCMethodDecl *InitMethod = nullptr;
16076
bool isDesignated =
16077
MD->isDesignatedInitializerForTheInterface(&InitMethod);
16078
assert(isDesignated && InitMethod);
16079
(void)isDesignated;
16080
16081
auto superIsNSObject = [&](const ObjCMethodDecl *MD) {
16082
auto IFace = MD->getClassInterface();
16083
if (!IFace)
16084
return false;
16085
auto SuperD = IFace->getSuperClass();
16086
if (!SuperD)
16087
return false;
16088
return SuperD->getIdentifier() ==
16089
ObjC().NSAPIObj->getNSClassId(NSAPI::ClassId_NSObject);
16090
};
16091
// Don't issue this warning for unavailable inits or direct subclasses
16092
// of NSObject.
16093
if (!MD->isUnavailable() && !superIsNSObject(MD)) {
16094
Diag(MD->getLocation(),
16095
diag::warn_objc_designated_init_missing_super_call);
16096
Diag(InitMethod->getLocation(),
16097
diag::note_objc_designated_init_marked_here);
16098
}
16099
FSI->ObjCWarnForNoDesignatedInitChain = false;
16100
}
16101
if (FSI->ObjCWarnForNoInitDelegation) {
16102
// Don't issue this warning for unavailable inits.
16103
if (!MD->isUnavailable())
16104
Diag(MD->getLocation(),
16105
diag::warn_objc_secondary_init_missing_init_call);
16106
FSI->ObjCWarnForNoInitDelegation = false;
16107
}
16108
16109
diagnoseImplicitlyRetainedSelf(*this);
16110
} else {
16111
// Parsing the function declaration failed in some way. Pop the fake scope
16112
// we pushed on.
16113
PopFunctionScopeInfo(ActivePolicy, dcl);
16114
return nullptr;
16115
}
16116
16117
if (Body && FSI->HasPotentialAvailabilityViolations)
16118
DiagnoseUnguardedAvailabilityViolations(dcl);
16119
16120
assert(!FSI->ObjCShouldCallSuper &&
16121
"This should only be set for ObjC methods, which should have been "
16122
"handled in the block above.");
16123
16124
// Verify and clean out per-function state.
16125
if (Body && (!FD || !FD->isDefaulted())) {
16126
// C++ constructors that have function-try-blocks can't have return
16127
// statements in the handlers of that block. (C++ [except.handle]p14)
16128
// Verify this.
16129
if (FD && isa<CXXConstructorDecl>(FD) && isa<CXXTryStmt>(Body))
16130
DiagnoseReturnInConstructorExceptionHandler(cast<CXXTryStmt>(Body));
16131
16132
// Verify that gotos and switch cases don't jump into scopes illegally.
16133
if (FSI->NeedsScopeChecking() && !PP.isCodeCompletionEnabled())
16134
DiagnoseInvalidJumps(Body);
16135
16136
if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(dcl)) {
16137
if (!Destructor->getParent()->isDependentType())
16138
CheckDestructor(Destructor);
16139
16140
MarkBaseAndMemberDestructorsReferenced(Destructor->getLocation(),
16141
Destructor->getParent());
16142
}
16143
16144
// If any errors have occurred, clear out any temporaries that may have
16145
// been leftover. This ensures that these temporaries won't be picked up
16146
// for deletion in some later function.
16147
if (hasUncompilableErrorOccurred() ||
16148
hasAnyUnrecoverableErrorsInThisFunction() ||
16149
getDiagnostics().getSuppressAllDiagnostics()) {
16150
DiscardCleanupsInEvaluationContext();
16151
}
16152
if (!hasUncompilableErrorOccurred() && !isa<FunctionTemplateDecl>(dcl)) {
16153
// Since the body is valid, issue any analysis-based warnings that are
16154
// enabled.
16155
ActivePolicy = &WP;
16156
}
16157
16158
if (!IsInstantiation && FD &&
16159
(FD->isConstexpr() || FD->hasAttr<MSConstexprAttr>()) &&
16160
!FD->isInvalidDecl() &&
16161
!CheckConstexprFunctionDefinition(FD, CheckConstexprKind::Diagnose))
16162
FD->setInvalidDecl();
16163
16164
if (FD && FD->hasAttr<NakedAttr>()) {
16165
for (const Stmt *S : Body->children()) {
16166
// Allow local register variables without initializer as they don't
16167
// require prologue.
16168
bool RegisterVariables = false;
16169
if (auto *DS = dyn_cast<DeclStmt>(S)) {
16170
for (const auto *Decl : DS->decls()) {
16171
if (const auto *Var = dyn_cast<VarDecl>(Decl)) {
16172
RegisterVariables =
16173
Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
16174
if (!RegisterVariables)
16175
break;
16176
}
16177
}
16178
}
16179
if (RegisterVariables)
16180
continue;
16181
if (!isa<AsmStmt>(S) && !isa<NullStmt>(S)) {
16182
Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
16183
Diag(FD->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
16184
FD->setInvalidDecl();
16185
break;
16186
}
16187
}
16188
}
16189
16190
assert(ExprCleanupObjects.size() ==
16191
ExprEvalContexts.back().NumCleanupObjects &&
16192
"Leftover temporaries in function");
16193
assert(!Cleanup.exprNeedsCleanups() &&
16194
"Unaccounted cleanups in function");
16195
assert(MaybeODRUseExprs.empty() &&
16196
"Leftover expressions for odr-use checking");
16197
}
16198
} // Pops the ExitFunctionBodyRAII scope, which needs to happen before we pop
16199
// the declaration context below. Otherwise, we're unable to transform
16200
// 'this' expressions when transforming immediate context functions.
16201
16202
if (!IsInstantiation)
16203
PopDeclContext();
16204
16205
PopFunctionScopeInfo(ActivePolicy, dcl);
16206
// If any errors have occurred, clear out any temporaries that may have
16207
// been leftover. This ensures that these temporaries won't be picked up for
16208
// deletion in some later function.
16209
if (hasUncompilableErrorOccurred()) {
16210
DiscardCleanupsInEvaluationContext();
16211
}
16212
16213
if (FD && ((LangOpts.OpenMP && (LangOpts.OpenMPIsTargetDevice ||
16214
!LangOpts.OMPTargetTriples.empty())) ||
16215
LangOpts.CUDA || LangOpts.SYCLIsDevice)) {
16216
auto ES = getEmissionStatus(FD);
16217
if (ES == Sema::FunctionEmissionStatus::Emitted ||
16218
ES == Sema::FunctionEmissionStatus::Unknown)
16219
DeclsToCheckForDeferredDiags.insert(FD);
16220
}
16221
16222
if (FD && !FD->isDeleted())
16223
checkTypeSupport(FD->getType(), FD->getLocation(), FD);
16224
16225
return dcl;
16226
}
16227
16228
/// When we finish delayed parsing of an attribute, we must attach it to the
16229
/// relevant Decl.
16230
void Sema::ActOnFinishDelayedAttribute(Scope *S, Decl *D,
16231
ParsedAttributes &Attrs) {
16232
// Always attach attributes to the underlying decl.
16233
if (TemplateDecl *TD = dyn_cast<TemplateDecl>(D))
16234
D = TD->getTemplatedDecl();
16235
ProcessDeclAttributeList(S, D, Attrs);
16236
ProcessAPINotes(D);
16237
16238
if (CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(D))
16239
if (Method->isStatic())
16240
checkThisInStaticMemberFunctionAttributes(Method);
16241
}
16242
16243
NamedDecl *Sema::ImplicitlyDefineFunction(SourceLocation Loc,
16244
IdentifierInfo &II, Scope *S) {
16245
// It is not valid to implicitly define a function in C23.
16246
assert(LangOpts.implicitFunctionsAllowed() &&
16247
"Implicit function declarations aren't allowed in this language mode");
16248
16249
// Find the scope in which the identifier is injected and the corresponding
16250
// DeclContext.
16251
// FIXME: C89 does not say what happens if there is no enclosing block scope.
16252
// In that case, we inject the declaration into the translation unit scope
16253
// instead.
16254
Scope *BlockScope = S;
16255
while (!BlockScope->isCompoundStmtScope() && BlockScope->getParent())
16256
BlockScope = BlockScope->getParent();
16257
16258
// Loop until we find a DeclContext that is either a function/method or the
16259
// translation unit, which are the only two valid places to implicitly define
16260
// a function. This avoids accidentally defining the function within a tag
16261
// declaration, for example.
16262
Scope *ContextScope = BlockScope;
16263
while (!ContextScope->getEntity() ||
16264
(!ContextScope->getEntity()->isFunctionOrMethod() &&
16265
!ContextScope->getEntity()->isTranslationUnit()))
16266
ContextScope = ContextScope->getParent();
16267
ContextRAII SavedContext(*this, ContextScope->getEntity());
16268
16269
// Before we produce a declaration for an implicitly defined
16270
// function, see whether there was a locally-scoped declaration of
16271
// this name as a function or variable. If so, use that
16272
// (non-visible) declaration, and complain about it.
16273
NamedDecl *ExternCPrev = findLocallyScopedExternCDecl(&II);
16274
if (ExternCPrev) {
16275
// We still need to inject the function into the enclosing block scope so
16276
// that later (non-call) uses can see it.
16277
PushOnScopeChains(ExternCPrev, BlockScope, /*AddToContext*/false);
16278
16279
// C89 footnote 38:
16280
// If in fact it is not defined as having type "function returning int",
16281
// the behavior is undefined.
16282
if (!isa<FunctionDecl>(ExternCPrev) ||
16283
!Context.typesAreCompatible(
16284
cast<FunctionDecl>(ExternCPrev)->getType(),
16285
Context.getFunctionNoProtoType(Context.IntTy))) {
16286
Diag(Loc, diag::ext_use_out_of_scope_declaration)
16287
<< ExternCPrev << !getLangOpts().C99;
16288
Diag(ExternCPrev->getLocation(), diag::note_previous_declaration);
16289
return ExternCPrev;
16290
}
16291
}
16292
16293
// Extension in C99 (defaults to error). Legal in C89, but warn about it.
16294
unsigned diag_id;
16295
if (II.getName().starts_with("__builtin_"))
16296
diag_id = diag::warn_builtin_unknown;
16297
// OpenCL v2.0 s6.9.u - Implicit function declaration is not supported.
16298
else if (getLangOpts().C99)
16299
diag_id = diag::ext_implicit_function_decl_c99;
16300
else
16301
diag_id = diag::warn_implicit_function_decl;
16302
16303
TypoCorrection Corrected;
16304
// Because typo correction is expensive, only do it if the implicit
16305
// function declaration is going to be treated as an error.
16306
//
16307
// Perform the correction before issuing the main diagnostic, as some
16308
// consumers use typo-correction callbacks to enhance the main diagnostic.
16309
if (S && !ExternCPrev &&
16310
(Diags.getDiagnosticLevel(diag_id, Loc) >= DiagnosticsEngine::Error)) {
16311
DeclFilterCCC<FunctionDecl> CCC{};
16312
Corrected = CorrectTypo(DeclarationNameInfo(&II, Loc), LookupOrdinaryName,
16313
S, nullptr, CCC, CTK_NonError);
16314
}
16315
16316
Diag(Loc, diag_id) << &II;
16317
if (Corrected) {
16318
// If the correction is going to suggest an implicitly defined function,
16319
// skip the correction as not being a particularly good idea.
16320
bool Diagnose = true;
16321
if (const auto *D = Corrected.getCorrectionDecl())
16322
Diagnose = !D->isImplicit();
16323
if (Diagnose)
16324
diagnoseTypo(Corrected, PDiag(diag::note_function_suggestion),
16325
/*ErrorRecovery*/ false);
16326
}
16327
16328
// If we found a prior declaration of this function, don't bother building
16329
// another one. We've already pushed that one into scope, so there's nothing
16330
// more to do.
16331
if (ExternCPrev)
16332
return ExternCPrev;
16333
16334
// Set a Declarator for the implicit definition: int foo();
16335
const char *Dummy;
16336
AttributeFactory attrFactory;
16337
DeclSpec DS(attrFactory);
16338
unsigned DiagID;
16339
bool Error = DS.SetTypeSpecType(DeclSpec::TST_int, Loc, Dummy, DiagID,
16340
Context.getPrintingPolicy());
16341
(void)Error; // Silence warning.
16342
assert(!Error && "Error setting up implicit decl!");
16343
SourceLocation NoLoc;
16344
Declarator D(DS, ParsedAttributesView::none(), DeclaratorContext::Block);
16345
D.AddTypeInfo(DeclaratorChunk::getFunction(/*HasProto=*/false,
16346
/*IsAmbiguous=*/false,
16347
/*LParenLoc=*/NoLoc,
16348
/*Params=*/nullptr,
16349
/*NumParams=*/0,
16350
/*EllipsisLoc=*/NoLoc,
16351
/*RParenLoc=*/NoLoc,
16352
/*RefQualifierIsLvalueRef=*/true,
16353
/*RefQualifierLoc=*/NoLoc,
16354
/*MutableLoc=*/NoLoc, EST_None,
16355
/*ESpecRange=*/SourceRange(),
16356
/*Exceptions=*/nullptr,
16357
/*ExceptionRanges=*/nullptr,
16358
/*NumExceptions=*/0,
16359
/*NoexceptExpr=*/nullptr,
16360
/*ExceptionSpecTokens=*/nullptr,
16361
/*DeclsInPrototype=*/std::nullopt,
16362
Loc, Loc, D),
16363
std::move(DS.getAttributes()), SourceLocation());
16364
D.SetIdentifier(&II, Loc);
16365
16366
// Insert this function into the enclosing block scope.
16367
FunctionDecl *FD = cast<FunctionDecl>(ActOnDeclarator(BlockScope, D));
16368
FD->setImplicit();
16369
16370
AddKnownFunctionAttributes(FD);
16371
16372
return FD;
16373
}
16374
16375
void Sema::AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(
16376
FunctionDecl *FD) {
16377
if (FD->isInvalidDecl())
16378
return;
16379
16380
if (FD->getDeclName().getCXXOverloadedOperator() != OO_New &&
16381
FD->getDeclName().getCXXOverloadedOperator() != OO_Array_New)
16382
return;
16383
16384
std::optional<unsigned> AlignmentParam;
16385
bool IsNothrow = false;
16386
if (!FD->isReplaceableGlobalAllocationFunction(&AlignmentParam, &IsNothrow))
16387
return;
16388
16389
// C++2a [basic.stc.dynamic.allocation]p4:
16390
// An allocation function that has a non-throwing exception specification
16391
// indicates failure by returning a null pointer value. Any other allocation
16392
// function never returns a null pointer value and indicates failure only by
16393
// throwing an exception [...]
16394
//
16395
// However, -fcheck-new invalidates this possible assumption, so don't add
16396
// NonNull when that is enabled.
16397
if (!IsNothrow && !FD->hasAttr<ReturnsNonNullAttr>() &&
16398
!getLangOpts().CheckNew)
16399
FD->addAttr(ReturnsNonNullAttr::CreateImplicit(Context, FD->getLocation()));
16400
16401
// C++2a [basic.stc.dynamic.allocation]p2:
16402
// An allocation function attempts to allocate the requested amount of
16403
// storage. [...] If the request succeeds, the value returned by a
16404
// replaceable allocation function is a [...] pointer value p0 different
16405
// from any previously returned value p1 [...]
16406
//
16407
// However, this particular information is being added in codegen,
16408
// because there is an opt-out switch for it (-fno-assume-sane-operator-new)
16409
16410
// C++2a [basic.stc.dynamic.allocation]p2:
16411
// An allocation function attempts to allocate the requested amount of
16412
// storage. If it is successful, it returns the address of the start of a
16413
// block of storage whose length in bytes is at least as large as the
16414
// requested size.
16415
if (!FD->hasAttr<AllocSizeAttr>()) {
16416
FD->addAttr(AllocSizeAttr::CreateImplicit(
16417
Context, /*ElemSizeParam=*/ParamIdx(1, FD),
16418
/*NumElemsParam=*/ParamIdx(), FD->getLocation()));
16419
}
16420
16421
// C++2a [basic.stc.dynamic.allocation]p3:
16422
// For an allocation function [...], the pointer returned on a successful
16423
// call shall represent the address of storage that is aligned as follows:
16424
// (3.1) If the allocation function takes an argument of type
16425
// std​::​align_­val_­t, the storage will have the alignment
16426
// specified by the value of this argument.
16427
if (AlignmentParam && !FD->hasAttr<AllocAlignAttr>()) {
16428
FD->addAttr(AllocAlignAttr::CreateImplicit(
16429
Context, ParamIdx(*AlignmentParam, FD), FD->getLocation()));
16430
}
16431
16432
// FIXME:
16433
// C++2a [basic.stc.dynamic.allocation]p3:
16434
// For an allocation function [...], the pointer returned on a successful
16435
// call shall represent the address of storage that is aligned as follows:
16436
// (3.2) Otherwise, if the allocation function is named operator new[],
16437
// the storage is aligned for any object that does not have
16438
// new-extended alignment ([basic.align]) and is no larger than the
16439
// requested size.
16440
// (3.3) Otherwise, the storage is aligned for any object that does not
16441
// have new-extended alignment and is of the requested size.
16442
}
16443
16444
void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
16445
if (FD->isInvalidDecl())
16446
return;
16447
16448
// If this is a built-in function, map its builtin attributes to
16449
// actual attributes.
16450
if (unsigned BuiltinID = FD->getBuiltinID()) {
16451
// Handle printf-formatting attributes.
16452
unsigned FormatIdx;
16453
bool HasVAListArg;
16454
if (Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
16455
if (!FD->hasAttr<FormatAttr>()) {
16456
const char *fmt = "printf";
16457
unsigned int NumParams = FD->getNumParams();
16458
if (FormatIdx < NumParams && // NumParams may be 0 (e.g. vfprintf)
16459
FD->getParamDecl(FormatIdx)->getType()->isObjCObjectPointerType())
16460
fmt = "NSString";
16461
FD->addAttr(FormatAttr::CreateImplicit(Context,
16462
&Context.Idents.get(fmt),
16463
FormatIdx+1,
16464
HasVAListArg ? 0 : FormatIdx+2,
16465
FD->getLocation()));
16466
}
16467
}
16468
if (Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
16469
HasVAListArg)) {
16470
if (!FD->hasAttr<FormatAttr>())
16471
FD->addAttr(FormatAttr::CreateImplicit(Context,
16472
&Context.Idents.get("scanf"),
16473
FormatIdx+1,
16474
HasVAListArg ? 0 : FormatIdx+2,
16475
FD->getLocation()));
16476
}
16477
16478
// Handle automatically recognized callbacks.
16479
SmallVector<int, 4> Encoding;
16480
if (!FD->hasAttr<CallbackAttr>() &&
16481
Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
16482
FD->addAttr(CallbackAttr::CreateImplicit(
16483
Context, Encoding.data(), Encoding.size(), FD->getLocation()));
16484
16485
// Mark const if we don't care about errno and/or floating point exceptions
16486
// that are the only thing preventing the function from being const. This
16487
// allows IRgen to use LLVM intrinsics for such functions.
16488
bool NoExceptions =
16489
getLangOpts().getDefaultExceptionMode() == LangOptions::FPE_Ignore;
16490
bool ConstWithoutErrnoAndExceptions =
16491
Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
16492
bool ConstWithoutExceptions =
16493
Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
16494
if (!FD->hasAttr<ConstAttr>() &&
16495
(ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
16496
(!ConstWithoutErrnoAndExceptions ||
16497
(!getLangOpts().MathErrno && NoExceptions)) &&
16498
(!ConstWithoutExceptions || NoExceptions))
16499
FD->addAttr(ConstAttr::CreateImplicit(Context, FD->getLocation()));
16500
16501
// We make "fma" on GNU or Windows const because we know it does not set
16502
// errno in those environments even though it could set errno based on the
16503
// C standard.
16504
const llvm::Triple &Trip = Context.getTargetInfo().getTriple();
16505
if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
16506
!FD->hasAttr<ConstAttr>()) {
16507
switch (BuiltinID) {
16508
case Builtin::BI__builtin_fma:
16509
case Builtin::BI__builtin_fmaf:
16510
case Builtin::BI__builtin_fmal:
16511
case Builtin::BIfma:
16512
case Builtin::BIfmaf:
16513
case Builtin::BIfmal:
16514
FD->addAttr(ConstAttr::CreateImplicit(Context, FD->getLocation()));
16515
break;
16516
default:
16517
break;
16518
}
16519
}
16520
16521
if (Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
16522
!FD->hasAttr<ReturnsTwiceAttr>())
16523
FD->addAttr(ReturnsTwiceAttr::CreateImplicit(Context,
16524
FD->getLocation()));
16525
if (Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->hasAttr<NoThrowAttr>())
16526
FD->addAttr(NoThrowAttr::CreateImplicit(Context, FD->getLocation()));
16527
if (Context.BuiltinInfo.isPure(BuiltinID) && !FD->hasAttr<PureAttr>())
16528
FD->addAttr(PureAttr::CreateImplicit(Context, FD->getLocation()));
16529
if (Context.BuiltinInfo.isConst(BuiltinID) && !FD->hasAttr<ConstAttr>())
16530
FD->addAttr(ConstAttr::CreateImplicit(Context, FD->getLocation()));
16531
if (getLangOpts().CUDA && Context.BuiltinInfo.isTSBuiltin(BuiltinID) &&
16532
!FD->hasAttr<CUDADeviceAttr>() && !FD->hasAttr<CUDAHostAttr>()) {
16533
// Add the appropriate attribute, depending on the CUDA compilation mode
16534
// and which target the builtin belongs to. For example, during host
16535
// compilation, aux builtins are __device__, while the rest are __host__.
16536
if (getLangOpts().CUDAIsDevice !=
16537
Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
16538
FD->addAttr(CUDADeviceAttr::CreateImplicit(Context, FD->getLocation()));
16539
else
16540
FD->addAttr(CUDAHostAttr::CreateImplicit(Context, FD->getLocation()));
16541
}
16542
16543
// Add known guaranteed alignment for allocation functions.
16544
switch (BuiltinID) {
16545
case Builtin::BImemalign:
16546
case Builtin::BIaligned_alloc:
16547
if (!FD->hasAttr<AllocAlignAttr>())
16548
FD->addAttr(AllocAlignAttr::CreateImplicit(Context, ParamIdx(1, FD),
16549
FD->getLocation()));
16550
break;
16551
default:
16552
break;
16553
}
16554
16555
// Add allocsize attribute for allocation functions.
16556
switch (BuiltinID) {
16557
case Builtin::BIcalloc:
16558
FD->addAttr(AllocSizeAttr::CreateImplicit(
16559
Context, ParamIdx(1, FD), ParamIdx(2, FD), FD->getLocation()));
16560
break;
16561
case Builtin::BImemalign:
16562
case Builtin::BIaligned_alloc:
16563
case Builtin::BIrealloc:
16564
FD->addAttr(AllocSizeAttr::CreateImplicit(Context, ParamIdx(2, FD),
16565
ParamIdx(), FD->getLocation()));
16566
break;
16567
case Builtin::BImalloc:
16568
FD->addAttr(AllocSizeAttr::CreateImplicit(Context, ParamIdx(1, FD),
16569
ParamIdx(), FD->getLocation()));
16570
break;
16571
default:
16572
break;
16573
}
16574
16575
// Add lifetime attribute to std::move, std::fowrard et al.
16576
switch (BuiltinID) {
16577
case Builtin::BIaddressof:
16578
case Builtin::BI__addressof:
16579
case Builtin::BI__builtin_addressof:
16580
case Builtin::BIas_const:
16581
case Builtin::BIforward:
16582
case Builtin::BIforward_like:
16583
case Builtin::BImove:
16584
case Builtin::BImove_if_noexcept:
16585
if (ParmVarDecl *P = FD->getParamDecl(0u);
16586
!P->hasAttr<LifetimeBoundAttr>())
16587
P->addAttr(
16588
LifetimeBoundAttr::CreateImplicit(Context, FD->getLocation()));
16589
break;
16590
default:
16591
break;
16592
}
16593
}
16594
16595
AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FD);
16596
16597
// If C++ exceptions are enabled but we are told extern "C" functions cannot
16598
// throw, add an implicit nothrow attribute to any extern "C" function we come
16599
// across.
16600
if (getLangOpts().CXXExceptions && getLangOpts().ExternCNoUnwind &&
16601
FD->isExternC() && !FD->hasAttr<NoThrowAttr>()) {
16602
const auto *FPT = FD->getType()->getAs<FunctionProtoType>();
16603
if (!FPT || FPT->getExceptionSpecType() == EST_None)
16604
FD->addAttr(NoThrowAttr::CreateImplicit(Context, FD->getLocation()));
16605
}
16606
16607
IdentifierInfo *Name = FD->getIdentifier();
16608
if (!Name)
16609
return;
16610
if ((!getLangOpts().CPlusPlus && FD->getDeclContext()->isTranslationUnit()) ||
16611
(isa<LinkageSpecDecl>(FD->getDeclContext()) &&
16612
cast<LinkageSpecDecl>(FD->getDeclContext())->getLanguage() ==
16613
LinkageSpecLanguageIDs::C)) {
16614
// Okay: this could be a libc/libm/Objective-C function we know
16615
// about.
16616
} else
16617
return;
16618
16619
if (Name->isStr("asprintf") || Name->isStr("vasprintf")) {
16620
// FIXME: asprintf and vasprintf aren't C99 functions. Should they be
16621
// target-specific builtins, perhaps?
16622
if (!FD->hasAttr<FormatAttr>())
16623
FD->addAttr(FormatAttr::CreateImplicit(Context,
16624
&Context.Idents.get("printf"), 2,
16625
Name->isStr("vasprintf") ? 0 : 3,
16626
FD->getLocation()));
16627
}
16628
16629
if (Name->isStr("__CFStringMakeConstantString")) {
16630
// We already have a __builtin___CFStringMakeConstantString,
16631
// but builds that use -fno-constant-cfstrings don't go through that.
16632
if (!FD->hasAttr<FormatArgAttr>())
16633
FD->addAttr(FormatArgAttr::CreateImplicit(Context, ParamIdx(1, FD),
16634
FD->getLocation()));
16635
}
16636
}
16637
16638
TypedefDecl *Sema::ParseTypedefDecl(Scope *S, Declarator &D, QualType T,
16639
TypeSourceInfo *TInfo) {
16640
assert(D.getIdentifier() && "Wrong callback for declspec without declarator");
16641
assert(!T.isNull() && "GetTypeForDeclarator() returned null type");
16642
16643
if (!TInfo) {
16644
assert(D.isInvalidType() && "no declarator info for valid type");
16645
TInfo = Context.getTrivialTypeSourceInfo(T);
16646
}
16647
16648
// Scope manipulation handled by caller.
16649
TypedefDecl *NewTD =
16650
TypedefDecl::Create(Context, CurContext, D.getBeginLoc(),
16651
D.getIdentifierLoc(), D.getIdentifier(), TInfo);
16652
16653
// Bail out immediately if we have an invalid declaration.
16654
if (D.isInvalidType()) {
16655
NewTD->setInvalidDecl();
16656
return NewTD;
16657
}
16658
16659
if (D.getDeclSpec().isModulePrivateSpecified()) {
16660
if (CurContext->isFunctionOrMethod())
16661
Diag(NewTD->getLocation(), diag::err_module_private_local)
16662
<< 2 << NewTD
16663
<< SourceRange(D.getDeclSpec().getModulePrivateSpecLoc())
16664
<< FixItHint::CreateRemoval(
16665
D.getDeclSpec().getModulePrivateSpecLoc());
16666
else
16667
NewTD->setModulePrivate();
16668
}
16669
16670
// C++ [dcl.typedef]p8:
16671
// If the typedef declaration defines an unnamed class (or
16672
// enum), the first typedef-name declared by the declaration
16673
// to be that class type (or enum type) is used to denote the
16674
// class type (or enum type) for linkage purposes only.
16675
// We need to check whether the type was declared in the declaration.
16676
switch (D.getDeclSpec().getTypeSpecType()) {
16677
case TST_enum:
16678
case TST_struct:
16679
case TST_interface:
16680
case TST_union:
16681
case TST_class: {
16682
TagDecl *tagFromDeclSpec = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
16683
setTagNameForLinkagePurposes(tagFromDeclSpec, NewTD);
16684
break;
16685
}
16686
16687
default:
16688
break;
16689
}
16690
16691
return NewTD;
16692
}
16693
16694
bool Sema::CheckEnumUnderlyingType(TypeSourceInfo *TI) {
16695
SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
16696
QualType T = TI->getType();
16697
16698
if (T->isDependentType())
16699
return false;
16700
16701
// This doesn't use 'isIntegralType' despite the error message mentioning
16702
// integral type because isIntegralType would also allow enum types in C.
16703
if (const BuiltinType *BT = T->getAs<BuiltinType>())
16704
if (BT->isInteger())
16705
return false;
16706
16707
return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
16708
<< T << T->isBitIntType();
16709
}
16710
16711
bool Sema::CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
16712
QualType EnumUnderlyingTy, bool IsFixed,
16713
const EnumDecl *Prev) {
16714
if (IsScoped != Prev->isScoped()) {
16715
Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
16716
<< Prev->isScoped();
16717
Diag(Prev->getLocation(), diag::note_previous_declaration);
16718
return true;
16719
}
16720
16721
if (IsFixed && Prev->isFixed()) {
16722
if (!EnumUnderlyingTy->isDependentType() &&
16723
!Prev->getIntegerType()->isDependentType() &&
16724
!Context.hasSameUnqualifiedType(EnumUnderlyingTy,
16725
Prev->getIntegerType())) {
16726
// TODO: Highlight the underlying type of the redeclaration.
16727
Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
16728
<< EnumUnderlyingTy << Prev->getIntegerType();
16729
Diag(Prev->getLocation(), diag::note_previous_declaration)
16730
<< Prev->getIntegerTypeRange();
16731
return true;
16732
}
16733
} else if (IsFixed != Prev->isFixed()) {
16734
Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
16735
<< Prev->isFixed();
16736
Diag(Prev->getLocation(), diag::note_previous_declaration);
16737
return true;
16738
}
16739
16740
return false;
16741
}
16742
16743
/// Get diagnostic %select index for tag kind for
16744
/// redeclaration diagnostic message.
16745
/// WARNING: Indexes apply to particular diagnostics only!
16746
///
16747
/// \returns diagnostic %select index.
16748
static unsigned getRedeclDiagFromTagKind(TagTypeKind Tag) {
16749
switch (Tag) {
16750
case TagTypeKind::Struct:
16751
return 0;
16752
case TagTypeKind::Interface:
16753
return 1;
16754
case TagTypeKind::Class:
16755
return 2;
16756
default: llvm_unreachable("Invalid tag kind for redecl diagnostic!");
16757
}
16758
}
16759
16760
/// Determine if tag kind is a class-key compatible with
16761
/// class for redeclaration (class, struct, or __interface).
16762
///
16763
/// \returns true iff the tag kind is compatible.
16764
static bool isClassCompatTagKind(TagTypeKind Tag)
16765
{
16766
return Tag == TagTypeKind::Struct || Tag == TagTypeKind::Class ||
16767
Tag == TagTypeKind::Interface;
16768
}
16769
16770
Sema::NonTagKind Sema::getNonTagTypeDeclKind(const Decl *PrevDecl,
16771
TagTypeKind TTK) {
16772
if (isa<TypedefDecl>(PrevDecl))
16773
return NTK_Typedef;
16774
else if (isa<TypeAliasDecl>(PrevDecl))
16775
return NTK_TypeAlias;
16776
else if (isa<ClassTemplateDecl>(PrevDecl))
16777
return NTK_Template;
16778
else if (isa<TypeAliasTemplateDecl>(PrevDecl))
16779
return NTK_TypeAliasTemplate;
16780
else if (isa<TemplateTemplateParmDecl>(PrevDecl))
16781
return NTK_TemplateTemplateArgument;
16782
switch (TTK) {
16783
case TagTypeKind::Struct:
16784
case TagTypeKind::Interface:
16785
case TagTypeKind::Class:
16786
return getLangOpts().CPlusPlus ? NTK_NonClass : NTK_NonStruct;
16787
case TagTypeKind::Union:
16788
return NTK_NonUnion;
16789
case TagTypeKind::Enum:
16790
return NTK_NonEnum;
16791
}
16792
llvm_unreachable("invalid TTK");
16793
}
16794
16795
bool Sema::isAcceptableTagRedeclaration(const TagDecl *Previous,
16796
TagTypeKind NewTag, bool isDefinition,
16797
SourceLocation NewTagLoc,
16798
const IdentifierInfo *Name) {
16799
// C++ [dcl.type.elab]p3:
16800
// The class-key or enum keyword present in the
16801
// elaborated-type-specifier shall agree in kind with the
16802
// declaration to which the name in the elaborated-type-specifier
16803
// refers. This rule also applies to the form of
16804
// elaborated-type-specifier that declares a class-name or
16805
// friend class since it can be construed as referring to the
16806
// definition of the class. Thus, in any
16807
// elaborated-type-specifier, the enum keyword shall be used to
16808
// refer to an enumeration (7.2), the union class-key shall be
16809
// used to refer to a union (clause 9), and either the class or
16810
// struct class-key shall be used to refer to a class (clause 9)
16811
// declared using the class or struct class-key.
16812
TagTypeKind OldTag = Previous->getTagKind();
16813
if (OldTag != NewTag &&
16814
!(isClassCompatTagKind(OldTag) && isClassCompatTagKind(NewTag)))
16815
return false;
16816
16817
// Tags are compatible, but we might still want to warn on mismatched tags.
16818
// Non-class tags can't be mismatched at this point.
16819
if (!isClassCompatTagKind(NewTag))
16820
return true;
16821
16822
// Declarations for which -Wmismatched-tags is disabled are entirely ignored
16823
// by our warning analysis. We don't want to warn about mismatches with (eg)
16824
// declarations in system headers that are designed to be specialized, but if
16825
// a user asks us to warn, we should warn if their code contains mismatched
16826
// declarations.
16827
auto IsIgnoredLoc = [&](SourceLocation Loc) {
16828
return getDiagnostics().isIgnored(diag::warn_struct_class_tag_mismatch,
16829
Loc);
16830
};
16831
if (IsIgnoredLoc(NewTagLoc))
16832
return true;
16833
16834
auto IsIgnored = [&](const TagDecl *Tag) {
16835
return IsIgnoredLoc(Tag->getLocation());
16836
};
16837
while (IsIgnored(Previous)) {
16838
Previous = Previous->getPreviousDecl();
16839
if (!Previous)
16840
return true;
16841
OldTag = Previous->getTagKind();
16842
}
16843
16844
bool isTemplate = false;
16845
if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Previous))
16846
isTemplate = Record->getDescribedClassTemplate();
16847
16848
if (inTemplateInstantiation()) {
16849
if (OldTag != NewTag) {
16850
// In a template instantiation, do not offer fix-its for tag mismatches
16851
// since they usually mess up the template instead of fixing the problem.
16852
Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
16853
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << Name
16854
<< getRedeclDiagFromTagKind(OldTag);
16855
// FIXME: Note previous location?
16856
}
16857
return true;
16858
}
16859
16860
if (isDefinition) {
16861
// On definitions, check all previous tags and issue a fix-it for each
16862
// one that doesn't match the current tag.
16863
if (Previous->getDefinition()) {
16864
// Don't suggest fix-its for redefinitions.
16865
return true;
16866
}
16867
16868
bool previousMismatch = false;
16869
for (const TagDecl *I : Previous->redecls()) {
16870
if (I->getTagKind() != NewTag) {
16871
// Ignore previous declarations for which the warning was disabled.
16872
if (IsIgnored(I))
16873
continue;
16874
16875
if (!previousMismatch) {
16876
previousMismatch = true;
16877
Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
16878
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << Name
16879
<< getRedeclDiagFromTagKind(I->getTagKind());
16880
}
16881
Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
16882
<< getRedeclDiagFromTagKind(NewTag)
16883
<< FixItHint::CreateReplacement(I->getInnerLocStart(),
16884
TypeWithKeyword::getTagTypeKindName(NewTag));
16885
}
16886
}
16887
return true;
16888
}
16889
16890
// Identify the prevailing tag kind: this is the kind of the definition (if
16891
// there is a non-ignored definition), or otherwise the kind of the prior
16892
// (non-ignored) declaration.
16893
const TagDecl *PrevDef = Previous->getDefinition();
16894
if (PrevDef && IsIgnored(PrevDef))
16895
PrevDef = nullptr;
16896
const TagDecl *Redecl = PrevDef ? PrevDef : Previous;
16897
if (Redecl->getTagKind() != NewTag) {
16898
Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
16899
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << Name
16900
<< getRedeclDiagFromTagKind(OldTag);
16901
Diag(Redecl->getLocation(), diag::note_previous_use);
16902
16903
// If there is a previous definition, suggest a fix-it.
16904
if (PrevDef) {
16905
Diag(NewTagLoc, diag::note_struct_class_suggestion)
16906
<< getRedeclDiagFromTagKind(Redecl->getTagKind())
16907
<< FixItHint::CreateReplacement(SourceRange(NewTagLoc),
16908
TypeWithKeyword::getTagTypeKindName(Redecl->getTagKind()));
16909
}
16910
}
16911
16912
return true;
16913
}
16914
16915
/// Add a minimal nested name specifier fixit hint to allow lookup of a tag name
16916
/// from an outer enclosing namespace or file scope inside a friend declaration.
16917
/// This should provide the commented out code in the following snippet:
16918
/// namespace N {
16919
/// struct X;
16920
/// namespace M {
16921
/// struct Y { friend struct /*N::*/ X; };
16922
/// }
16923
/// }
16924
static FixItHint createFriendTagNNSFixIt(Sema &SemaRef, NamedDecl *ND, Scope *S,
16925
SourceLocation NameLoc) {
16926
// While the decl is in a namespace, do repeated lookup of that name and see
16927
// if we get the same namespace back. If we do not, continue until
16928
// translation unit scope, at which point we have a fully qualified NNS.
16929
SmallVector<IdentifierInfo *, 4> Namespaces;
16930
DeclContext *DC = ND->getDeclContext()->getRedeclContext();
16931
for (; !DC->isTranslationUnit(); DC = DC->getParent()) {
16932
// This tag should be declared in a namespace, which can only be enclosed by
16933
// other namespaces. Bail if there's an anonymous namespace in the chain.
16934
NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(DC);
16935
if (!Namespace || Namespace->isAnonymousNamespace())
16936
return FixItHint();
16937
IdentifierInfo *II = Namespace->getIdentifier();
16938
Namespaces.push_back(II);
16939
NamedDecl *Lookup = SemaRef.LookupSingleName(
16940
S, II, NameLoc, Sema::LookupNestedNameSpecifierName);
16941
if (Lookup == Namespace)
16942
break;
16943
}
16944
16945
// Once we have all the namespaces, reverse them to go outermost first, and
16946
// build an NNS.
16947
SmallString<64> Insertion;
16948
llvm::raw_svector_ostream OS(Insertion);
16949
if (DC->isTranslationUnit())
16950
OS << "::";
16951
std::reverse(Namespaces.begin(), Namespaces.end());
16952
for (auto *II : Namespaces)
16953
OS << II->getName() << "::";
16954
return FixItHint::CreateInsertion(NameLoc, Insertion);
16955
}
16956
16957
/// Determine whether a tag originally declared in context \p OldDC can
16958
/// be redeclared with an unqualified name in \p NewDC (assuming name lookup
16959
/// found a declaration in \p OldDC as a previous decl, perhaps through a
16960
/// using-declaration).
16961
static bool isAcceptableTagRedeclContext(Sema &S, DeclContext *OldDC,
16962
DeclContext *NewDC) {
16963
OldDC = OldDC->getRedeclContext();
16964
NewDC = NewDC->getRedeclContext();
16965
16966
if (OldDC->Equals(NewDC))
16967
return true;
16968
16969
// In MSVC mode, we allow a redeclaration if the contexts are related (either
16970
// encloses the other).
16971
if (S.getLangOpts().MSVCCompat &&
16972
(OldDC->Encloses(NewDC) || NewDC->Encloses(OldDC)))
16973
return true;
16974
16975
return false;
16976
}
16977
16978
DeclResult
16979
Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
16980
CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
16981
const ParsedAttributesView &Attrs, AccessSpecifier AS,
16982
SourceLocation ModulePrivateLoc,
16983
MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl,
16984
bool &IsDependent, SourceLocation ScopedEnumKWLoc,
16985
bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
16986
bool IsTypeSpecifier, bool IsTemplateParamOrArg,
16987
OffsetOfKind OOK, SkipBodyInfo *SkipBody) {
16988
// If this is not a definition, it must have a name.
16989
IdentifierInfo *OrigName = Name;
16990
assert((Name != nullptr || TUK == TagUseKind::Definition) &&
16991
"Nameless record must be a definition!");
16992
assert(TemplateParameterLists.size() == 0 || TUK != TagUseKind::Reference);
16993
16994
OwnedDecl = false;
16995
TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForTypeSpec(TagSpec);
16996
bool ScopedEnum = ScopedEnumKWLoc.isValid();
16997
16998
// FIXME: Check member specializations more carefully.
16999
bool isMemberSpecialization = false;
17000
bool Invalid = false;
17001
17002
// We only need to do this matching if we have template parameters
17003
// or a scope specifier, which also conveniently avoids this work
17004
// for non-C++ cases.
17005
if (TemplateParameterLists.size() > 0 ||
17006
(SS.isNotEmpty() && TUK != TagUseKind::Reference)) {
17007
TemplateParameterList *TemplateParams =
17008
MatchTemplateParametersToScopeSpecifier(
17009
KWLoc, NameLoc, SS, nullptr, TemplateParameterLists,
17010
TUK == TagUseKind::Friend, isMemberSpecialization, Invalid);
17011
17012
// C++23 [dcl.type.elab] p2:
17013
// If an elaborated-type-specifier is the sole constituent of a
17014
// declaration, the declaration is ill-formed unless it is an explicit
17015
// specialization, an explicit instantiation or it has one of the
17016
// following forms: [...]
17017
// C++23 [dcl.enum] p1:
17018
// If the enum-head-name of an opaque-enum-declaration contains a
17019
// nested-name-specifier, the declaration shall be an explicit
17020
// specialization.
17021
//
17022
// FIXME: Class template partial specializations can be forward declared
17023
// per CWG2213, but the resolution failed to allow qualified forward
17024
// declarations. This is almost certainly unintentional, so we allow them.
17025
if (TUK == TagUseKind::Declaration && SS.isNotEmpty() &&
17026
!isMemberSpecialization)
17027
Diag(SS.getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17028
<< TypeWithKeyword::getTagTypeKindName(Kind) << SS.getRange();
17029
17030
if (TemplateParams) {
17031
if (Kind == TagTypeKind::Enum) {
17032
Diag(KWLoc, diag::err_enum_template);
17033
return true;
17034
}
17035
17036
if (TemplateParams->size() > 0) {
17037
// This is a declaration or definition of a class template (which may
17038
// be a member of another template).
17039
17040
if (Invalid)
17041
return true;
17042
17043
OwnedDecl = false;
17044
DeclResult Result = CheckClassTemplate(
17045
S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17046
AS, ModulePrivateLoc,
17047
/*FriendLoc*/ SourceLocation(), TemplateParameterLists.size() - 1,
17048
TemplateParameterLists.data(), SkipBody);
17049
return Result.get();
17050
} else {
17051
// The "template<>" header is extraneous.
17052
Diag(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams)
17053
<< TypeWithKeyword::getTagTypeKindName(Kind) << Name;
17054
isMemberSpecialization = true;
17055
}
17056
}
17057
17058
if (!TemplateParameterLists.empty() && isMemberSpecialization &&
17059
CheckTemplateDeclScope(S, TemplateParameterLists.back()))
17060
return true;
17061
}
17062
17063
if (TUK == TagUseKind::Friend && Kind == TagTypeKind::Enum) {
17064
// C++23 [dcl.type.elab]p4:
17065
// If an elaborated-type-specifier appears with the friend specifier as
17066
// an entire member-declaration, the member-declaration shall have one
17067
// of the following forms:
17068
// friend class-key nested-name-specifier(opt) identifier ;
17069
// friend class-key simple-template-id ;
17070
// friend class-key nested-name-specifier template(opt)
17071
// simple-template-id ;
17072
//
17073
// Since enum is not a class-key, so declarations like "friend enum E;"
17074
// are ill-formed. Although CWG2363 reaffirms that such declarations are
17075
// invalid, most implementations accept so we issue a pedantic warning.
17076
Diag(KWLoc, diag::ext_enum_friend) << FixItHint::CreateRemoval(
17077
ScopedEnum ? SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
17078
assert(ScopedEnum || !ScopedEnumUsesClassTag);
17079
Diag(KWLoc, diag::note_enum_friend)
17080
<< (ScopedEnum + ScopedEnumUsesClassTag);
17081
}
17082
17083
// Figure out the underlying type if this a enum declaration. We need to do
17084
// this early, because it's needed to detect if this is an incompatible
17085
// redeclaration.
17086
llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
17087
bool IsFixed = !UnderlyingType.isUnset() || ScopedEnum;
17088
17089
if (Kind == TagTypeKind::Enum) {
17090
if (UnderlyingType.isInvalid() || (!UnderlyingType.get() && ScopedEnum)) {
17091
// No underlying type explicitly specified, or we failed to parse the
17092
// type, default to int.
17093
EnumUnderlying = Context.IntTy.getTypePtr();
17094
} else if (UnderlyingType.get()) {
17095
// C++0x 7.2p2: The type-specifier-seq of an enum-base shall name an
17096
// integral type; any cv-qualification is ignored.
17097
TypeSourceInfo *TI = nullptr;
17098
GetTypeFromParser(UnderlyingType.get(), &TI);
17099
EnumUnderlying = TI;
17100
17101
if (CheckEnumUnderlyingType(TI))
17102
// Recover by falling back to int.
17103
EnumUnderlying = Context.IntTy.getTypePtr();
17104
17105
if (DiagnoseUnexpandedParameterPack(TI->getTypeLoc().getBeginLoc(), TI,
17106
UPPC_FixedUnderlyingType))
17107
EnumUnderlying = Context.IntTy.getTypePtr();
17108
17109
} else if (Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
17110
// For MSVC ABI compatibility, unfixed enums must use an underlying type
17111
// of 'int'. However, if this is an unfixed forward declaration, don't set
17112
// the underlying type unless the user enables -fms-compatibility. This
17113
// makes unfixed forward declared enums incomplete and is more conforming.
17114
if (TUK == TagUseKind::Definition || getLangOpts().MSVCCompat)
17115
EnumUnderlying = Context.IntTy.getTypePtr();
17116
}
17117
}
17118
17119
DeclContext *SearchDC = CurContext;
17120
DeclContext *DC = CurContext;
17121
bool isStdBadAlloc = false;
17122
bool isStdAlignValT = false;
17123
17124
RedeclarationKind Redecl = forRedeclarationInCurContext();
17125
if (TUK == TagUseKind::Friend || TUK == TagUseKind::Reference)
17126
Redecl = RedeclarationKind::NotForRedeclaration;
17127
17128
/// Create a new tag decl in C/ObjC. Since the ODR-like semantics for ObjC/C
17129
/// implemented asks for structural equivalence checking, the returned decl
17130
/// here is passed back to the parser, allowing the tag body to be parsed.
17131
auto createTagFromNewDecl = [&]() -> TagDecl * {
17132
assert(!getLangOpts().CPlusPlus && "not meant for C++ usage");
17133
// If there is an identifier, use the location of the identifier as the
17134
// location of the decl, otherwise use the location of the struct/union
17135
// keyword.
17136
SourceLocation Loc = NameLoc.isValid() ? NameLoc : KWLoc;
17137
TagDecl *New = nullptr;
17138
17139
if (Kind == TagTypeKind::Enum) {
17140
New = EnumDecl::Create(Context, SearchDC, KWLoc, Loc, Name, nullptr,
17141
ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
17142
// If this is an undefined enum, bail.
17143
if (TUK != TagUseKind::Definition && !Invalid)
17144
return nullptr;
17145
if (EnumUnderlying) {
17146
EnumDecl *ED = cast<EnumDecl>(New);
17147
if (TypeSourceInfo *TI = EnumUnderlying.dyn_cast<TypeSourceInfo *>())
17148
ED->setIntegerTypeSourceInfo(TI);
17149
else
17150
ED->setIntegerType(QualType(EnumUnderlying.get<const Type *>(), 0));
17151
QualType EnumTy = ED->getIntegerType();
17152
ED->setPromotionType(Context.isPromotableIntegerType(EnumTy)
17153
? Context.getPromotedIntegerType(EnumTy)
17154
: EnumTy);
17155
}
17156
} else { // struct/union
17157
New = RecordDecl::Create(Context, Kind, SearchDC, KWLoc, Loc, Name,
17158
nullptr);
17159
}
17160
17161
if (RecordDecl *RD = dyn_cast<RecordDecl>(New)) {
17162
// Add alignment attributes if necessary; these attributes are checked
17163
// when the ASTContext lays out the structure.
17164
//
17165
// It is important for implementing the correct semantics that this
17166
// happen here (in ActOnTag). The #pragma pack stack is
17167
// maintained as a result of parser callbacks which can occur at
17168
// many points during the parsing of a struct declaration (because
17169
// the #pragma tokens are effectively skipped over during the
17170
// parsing of the struct).
17171
if (TUK == TagUseKind::Definition &&
17172
(!SkipBody || !SkipBody->ShouldSkip)) {
17173
AddAlignmentAttributesForRecord(RD);
17174
AddMsStructLayoutForRecord(RD);
17175
}
17176
}
17177
New->setLexicalDeclContext(CurContext);
17178
return New;
17179
};
17180
17181
LookupResult Previous(*this, Name, NameLoc, LookupTagName, Redecl);
17182
if (Name && SS.isNotEmpty()) {
17183
// We have a nested-name tag ('struct foo::bar').
17184
17185
// Check for invalid 'foo::'.
17186
if (SS.isInvalid()) {
17187
Name = nullptr;
17188
goto CreateNewDecl;
17189
}
17190
17191
// If this is a friend or a reference to a class in a dependent
17192
// context, don't try to make a decl for it.
17193
if (TUK == TagUseKind::Friend || TUK == TagUseKind::Reference) {
17194
DC = computeDeclContext(SS, false);
17195
if (!DC) {
17196
IsDependent = true;
17197
return true;
17198
}
17199
} else {
17200
DC = computeDeclContext(SS, true);
17201
if (!DC) {
17202
Diag(SS.getRange().getBegin(), diag::err_dependent_nested_name_spec)
17203
<< SS.getRange();
17204
return true;
17205
}
17206
}
17207
17208
if (RequireCompleteDeclContext(SS, DC))
17209
return true;
17210
17211
SearchDC = DC;
17212
// Look-up name inside 'foo::'.
17213
LookupQualifiedName(Previous, DC);
17214
17215
if (Previous.isAmbiguous())
17216
return true;
17217
17218
if (Previous.empty()) {
17219
// Name lookup did not find anything. However, if the
17220
// nested-name-specifier refers to the current instantiation,
17221
// and that current instantiation has any dependent base
17222
// classes, we might find something at instantiation time: treat
17223
// this as a dependent elaborated-type-specifier.
17224
// But this only makes any sense for reference-like lookups.
17225
if (Previous.wasNotFoundInCurrentInstantiation() &&
17226
(TUK == TagUseKind::Reference || TUK == TagUseKind::Friend)) {
17227
IsDependent = true;
17228
return true;
17229
}
17230
17231
// A tag 'foo::bar' must already exist.
17232
Diag(NameLoc, diag::err_not_tag_in_scope)
17233
<< llvm::to_underlying(Kind) << Name << DC << SS.getRange();
17234
Name = nullptr;
17235
Invalid = true;
17236
goto CreateNewDecl;
17237
}
17238
} else if (Name) {
17239
// C++14 [class.mem]p14:
17240
// If T is the name of a class, then each of the following shall have a
17241
// name different from T:
17242
// -- every member of class T that is itself a type
17243
if (TUK != TagUseKind::Reference && TUK != TagUseKind::Friend &&
17244
DiagnoseClassNameShadow(SearchDC, DeclarationNameInfo(Name, NameLoc)))
17245
return true;
17246
17247
// If this is a named struct, check to see if there was a previous forward
17248
// declaration or definition.
17249
// FIXME: We're looking into outer scopes here, even when we
17250
// shouldn't be. Doing so can result in ambiguities that we
17251
// shouldn't be diagnosing.
17252
LookupName(Previous, S);
17253
17254
// When declaring or defining a tag, ignore ambiguities introduced
17255
// by types using'ed into this scope.
17256
if (Previous.isAmbiguous() &&
17257
(TUK == TagUseKind::Definition || TUK == TagUseKind::Declaration)) {
17258
LookupResult::Filter F = Previous.makeFilter();
17259
while (F.hasNext()) {
17260
NamedDecl *ND = F.next();
17261
if (!ND->getDeclContext()->getRedeclContext()->Equals(
17262
SearchDC->getRedeclContext()))
17263
F.erase();
17264
}
17265
F.done();
17266
}
17267
17268
// C++11 [namespace.memdef]p3:
17269
// If the name in a friend declaration is neither qualified nor
17270
// a template-id and the declaration is a function or an
17271
// elaborated-type-specifier, the lookup to determine whether
17272
// the entity has been previously declared shall not consider
17273
// any scopes outside the innermost enclosing namespace.
17274
//
17275
// MSVC doesn't implement the above rule for types, so a friend tag
17276
// declaration may be a redeclaration of a type declared in an enclosing
17277
// scope. They do implement this rule for friend functions.
17278
//
17279
// Does it matter that this should be by scope instead of by
17280
// semantic context?
17281
if (!Previous.empty() && TUK == TagUseKind::Friend) {
17282
DeclContext *EnclosingNS = SearchDC->getEnclosingNamespaceContext();
17283
LookupResult::Filter F = Previous.makeFilter();
17284
bool FriendSawTagOutsideEnclosingNamespace = false;
17285
while (F.hasNext()) {
17286
NamedDecl *ND = F.next();
17287
DeclContext *DC = ND->getDeclContext()->getRedeclContext();
17288
if (DC->isFileContext() &&
17289
!EnclosingNS->Encloses(ND->getDeclContext())) {
17290
if (getLangOpts().MSVCCompat)
17291
FriendSawTagOutsideEnclosingNamespace = true;
17292
else
17293
F.erase();
17294
}
17295
}
17296
F.done();
17297
17298
// Diagnose this MSVC extension in the easy case where lookup would have
17299
// unambiguously found something outside the enclosing namespace.
17300
if (Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
17301
NamedDecl *ND = Previous.getFoundDecl();
17302
Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
17303
<< createFriendTagNNSFixIt(*this, ND, S, NameLoc);
17304
}
17305
}
17306
17307
// Note: there used to be some attempt at recovery here.
17308
if (Previous.isAmbiguous())
17309
return true;
17310
17311
if (!getLangOpts().CPlusPlus && TUK != TagUseKind::Reference) {
17312
// FIXME: This makes sure that we ignore the contexts associated
17313
// with C structs, unions, and enums when looking for a matching
17314
// tag declaration or definition. See the similar lookup tweak
17315
// in Sema::LookupName; is there a better way to deal with this?
17316
while (isa<RecordDecl, EnumDecl, ObjCContainerDecl>(SearchDC))
17317
SearchDC = SearchDC->getParent();
17318
} else if (getLangOpts().CPlusPlus) {
17319
// Inside ObjCContainer want to keep it as a lexical decl context but go
17320
// past it (most often to TranslationUnit) to find the semantic decl
17321
// context.
17322
while (isa<ObjCContainerDecl>(SearchDC))
17323
SearchDC = SearchDC->getParent();
17324
}
17325
} else if (getLangOpts().CPlusPlus) {
17326
// Don't use ObjCContainerDecl as the semantic decl context for anonymous
17327
// TagDecl the same way as we skip it for named TagDecl.
17328
while (isa<ObjCContainerDecl>(SearchDC))
17329
SearchDC = SearchDC->getParent();
17330
}
17331
17332
if (Previous.isSingleResult() &&
17333
Previous.getFoundDecl()->isTemplateParameter()) {
17334
// Maybe we will complain about the shadowed template parameter.
17335
DiagnoseTemplateParameterShadow(NameLoc, Previous.getFoundDecl());
17336
// Just pretend that we didn't see the previous declaration.
17337
Previous.clear();
17338
}
17339
17340
if (getLangOpts().CPlusPlus && Name && DC && StdNamespace &&
17341
DC->Equals(getStdNamespace())) {
17342
if (Name->isStr("bad_alloc")) {
17343
// This is a declaration of or a reference to "std::bad_alloc".
17344
isStdBadAlloc = true;
17345
17346
// If std::bad_alloc has been implicitly declared (but made invisible to
17347
// name lookup), fill in this implicit declaration as the previous
17348
// declaration, so that the declarations get chained appropriately.
17349
if (Previous.empty() && StdBadAlloc)
17350
Previous.addDecl(getStdBadAlloc());
17351
} else if (Name->isStr("align_val_t")) {
17352
isStdAlignValT = true;
17353
if (Previous.empty() && StdAlignValT)
17354
Previous.addDecl(getStdAlignValT());
17355
}
17356
}
17357
17358
// If we didn't find a previous declaration, and this is a reference
17359
// (or friend reference), move to the correct scope. In C++, we
17360
// also need to do a redeclaration lookup there, just in case
17361
// there's a shadow friend decl.
17362
if (Name && Previous.empty() &&
17363
(TUK == TagUseKind::Reference || TUK == TagUseKind::Friend ||
17364
IsTemplateParamOrArg)) {
17365
if (Invalid) goto CreateNewDecl;
17366
assert(SS.isEmpty());
17367
17368
if (TUK == TagUseKind::Reference || IsTemplateParamOrArg) {
17369
// C++ [basic.scope.pdecl]p5:
17370
// -- for an elaborated-type-specifier of the form
17371
//
17372
// class-key identifier
17373
//
17374
// if the elaborated-type-specifier is used in the
17375
// decl-specifier-seq or parameter-declaration-clause of a
17376
// function defined in namespace scope, the identifier is
17377
// declared as a class-name in the namespace that contains
17378
// the declaration; otherwise, except as a friend
17379
// declaration, the identifier is declared in the smallest
17380
// non-class, non-function-prototype scope that contains the
17381
// declaration.
17382
//
17383
// C99 6.7.2.3p8 has a similar (but not identical!) provision for
17384
// C structs and unions.
17385
//
17386
// It is an error in C++ to declare (rather than define) an enum
17387
// type, including via an elaborated type specifier. We'll
17388
// diagnose that later; for now, declare the enum in the same
17389
// scope as we would have picked for any other tag type.
17390
//
17391
// GNU C also supports this behavior as part of its incomplete
17392
// enum types extension, while GNU C++ does not.
17393
//
17394
// Find the context where we'll be declaring the tag.
17395
// FIXME: We would like to maintain the current DeclContext as the
17396
// lexical context,
17397
SearchDC = getTagInjectionContext(SearchDC);
17398
17399
// Find the scope where we'll be declaring the tag.
17400
S = getTagInjectionScope(S, getLangOpts());
17401
} else {
17402
assert(TUK == TagUseKind::Friend);
17403
CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(SearchDC);
17404
17405
// C++ [namespace.memdef]p3:
17406
// If a friend declaration in a non-local class first declares a
17407
// class or function, the friend class or function is a member of
17408
// the innermost enclosing namespace.
17409
SearchDC = RD->isLocalClass() ? RD->isLocalClass()
17410
: SearchDC->getEnclosingNamespaceContext();
17411
}
17412
17413
// In C++, we need to do a redeclaration lookup to properly
17414
// diagnose some problems.
17415
// FIXME: redeclaration lookup is also used (with and without C++) to find a
17416
// hidden declaration so that we don't get ambiguity errors when using a
17417
// type declared by an elaborated-type-specifier. In C that is not correct
17418
// and we should instead merge compatible types found by lookup.
17419
if (getLangOpts().CPlusPlus) {
17420
// FIXME: This can perform qualified lookups into function contexts,
17421
// which are meaningless.
17422
Previous.setRedeclarationKind(forRedeclarationInCurContext());
17423
LookupQualifiedName(Previous, SearchDC);
17424
} else {
17425
Previous.setRedeclarationKind(forRedeclarationInCurContext());
17426
LookupName(Previous, S);
17427
}
17428
}
17429
17430
// If we have a known previous declaration to use, then use it.
17431
if (Previous.empty() && SkipBody && SkipBody->Previous)
17432
Previous.addDecl(SkipBody->Previous);
17433
17434
if (!Previous.empty()) {
17435
NamedDecl *PrevDecl = Previous.getFoundDecl();
17436
NamedDecl *DirectPrevDecl = Previous.getRepresentativeDecl();
17437
17438
// It's okay to have a tag decl in the same scope as a typedef
17439
// which hides a tag decl in the same scope. Finding this
17440
// with a redeclaration lookup can only actually happen in C++.
17441
//
17442
// This is also okay for elaborated-type-specifiers, which is
17443
// technically forbidden by the current standard but which is
17444
// okay according to the likely resolution of an open issue;
17445
// see http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
17446
if (getLangOpts().CPlusPlus) {
17447
if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(PrevDecl)) {
17448
if (const TagType *TT = TD->getUnderlyingType()->getAs<TagType>()) {
17449
TagDecl *Tag = TT->getDecl();
17450
if (Tag->getDeclName() == Name &&
17451
Tag->getDeclContext()->getRedeclContext()
17452
->Equals(TD->getDeclContext()->getRedeclContext())) {
17453
PrevDecl = Tag;
17454
Previous.clear();
17455
Previous.addDecl(Tag);
17456
Previous.resolveKind();
17457
}
17458
}
17459
}
17460
}
17461
17462
// If this is a redeclaration of a using shadow declaration, it must
17463
// declare a tag in the same context. In MSVC mode, we allow a
17464
// redefinition if either context is within the other.
17465
if (auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
17466
auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
17467
if (SS.isEmpty() && TUK != TagUseKind::Reference &&
17468
TUK != TagUseKind::Friend &&
17469
isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
17470
!(OldTag && isAcceptableTagRedeclContext(
17471
*this, OldTag->getDeclContext(), SearchDC))) {
17472
Diag(KWLoc, diag::err_using_decl_conflict_reverse);
17473
Diag(Shadow->getTargetDecl()->getLocation(),
17474
diag::note_using_decl_target);
17475
Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
17476
<< 0;
17477
// Recover by ignoring the old declaration.
17478
Previous.clear();
17479
goto CreateNewDecl;
17480
}
17481
}
17482
17483
if (TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
17484
// If this is a use of a previous tag, or if the tag is already declared
17485
// in the same scope (so that the definition/declaration completes or
17486
// rementions the tag), reuse the decl.
17487
if (TUK == TagUseKind::Reference || TUK == TagUseKind::Friend ||
17488
isDeclInScope(DirectPrevDecl, SearchDC, S,
17489
SS.isNotEmpty() || isMemberSpecialization)) {
17490
// Make sure that this wasn't declared as an enum and now used as a
17491
// struct or something similar.
17492
if (!isAcceptableTagRedeclaration(PrevTagDecl, Kind,
17493
TUK == TagUseKind::Definition, KWLoc,
17494
Name)) {
17495
bool SafeToContinue =
17496
(PrevTagDecl->getTagKind() != TagTypeKind::Enum &&
17497
Kind != TagTypeKind::Enum);
17498
if (SafeToContinue)
17499
Diag(KWLoc, diag::err_use_with_wrong_tag)
17500
<< Name
17501
<< FixItHint::CreateReplacement(SourceRange(KWLoc),
17502
PrevTagDecl->getKindName());
17503
else
17504
Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
17505
Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
17506
17507
if (SafeToContinue)
17508
Kind = PrevTagDecl->getTagKind();
17509
else {
17510
// Recover by making this an anonymous redefinition.
17511
Name = nullptr;
17512
Previous.clear();
17513
Invalid = true;
17514
}
17515
}
17516
17517
if (Kind == TagTypeKind::Enum &&
17518
PrevTagDecl->getTagKind() == TagTypeKind::Enum) {
17519
const EnumDecl *PrevEnum = cast<EnumDecl>(PrevTagDecl);
17520
if (TUK == TagUseKind::Reference || TUK == TagUseKind::Friend)
17521
return PrevTagDecl;
17522
17523
QualType EnumUnderlyingTy;
17524
if (TypeSourceInfo *TI = EnumUnderlying.dyn_cast<TypeSourceInfo*>())
17525
EnumUnderlyingTy = TI->getType().getUnqualifiedType();
17526
else if (const Type *T = EnumUnderlying.dyn_cast<const Type*>())
17527
EnumUnderlyingTy = QualType(T, 0);
17528
17529
// All conflicts with previous declarations are recovered by
17530
// returning the previous declaration, unless this is a definition,
17531
// in which case we want the caller to bail out.
17532
if (CheckEnumRedeclaration(NameLoc.isValid() ? NameLoc : KWLoc,
17533
ScopedEnum, EnumUnderlyingTy,
17534
IsFixed, PrevEnum))
17535
return TUK == TagUseKind::Declaration ? PrevTagDecl : nullptr;
17536
}
17537
17538
// C++11 [class.mem]p1:
17539
// A member shall not be declared twice in the member-specification,
17540
// except that a nested class or member class template can be declared
17541
// and then later defined.
17542
if (TUK == TagUseKind::Declaration && PrevDecl->isCXXClassMember() &&
17543
S->isDeclScope(PrevDecl)) {
17544
Diag(NameLoc, diag::ext_member_redeclared);
17545
Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
17546
}
17547
17548
if (!Invalid) {
17549
// If this is a use, just return the declaration we found, unless
17550
// we have attributes.
17551
if (TUK == TagUseKind::Reference || TUK == TagUseKind::Friend) {
17552
if (!Attrs.empty()) {
17553
// FIXME: Diagnose these attributes. For now, we create a new
17554
// declaration to hold them.
17555
} else if (TUK == TagUseKind::Reference &&
17556
(PrevTagDecl->getFriendObjectKind() ==
17557
Decl::FOK_Undeclared ||
17558
PrevDecl->getOwningModule() != getCurrentModule()) &&
17559
SS.isEmpty()) {
17560
// This declaration is a reference to an existing entity, but
17561
// has different visibility from that entity: it either makes
17562
// a friend visible or it makes a type visible in a new module.
17563
// In either case, create a new declaration. We only do this if
17564
// the declaration would have meant the same thing if no prior
17565
// declaration were found, that is, if it was found in the same
17566
// scope where we would have injected a declaration.
17567
if (!getTagInjectionContext(CurContext)->getRedeclContext()
17568
->Equals(PrevDecl->getDeclContext()->getRedeclContext()))
17569
return PrevTagDecl;
17570
// This is in the injected scope, create a new declaration in
17571
// that scope.
17572
S = getTagInjectionScope(S, getLangOpts());
17573
} else {
17574
return PrevTagDecl;
17575
}
17576
}
17577
17578
// Diagnose attempts to redefine a tag.
17579
if (TUK == TagUseKind::Definition) {
17580
if (NamedDecl *Def = PrevTagDecl->getDefinition()) {
17581
// If we're defining a specialization and the previous definition
17582
// is from an implicit instantiation, don't emit an error
17583
// here; we'll catch this in the general case below.
17584
bool IsExplicitSpecializationAfterInstantiation = false;
17585
if (isMemberSpecialization) {
17586
if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(Def))
17587
IsExplicitSpecializationAfterInstantiation =
17588
RD->getTemplateSpecializationKind() !=
17589
TSK_ExplicitSpecialization;
17590
else if (EnumDecl *ED = dyn_cast<EnumDecl>(Def))
17591
IsExplicitSpecializationAfterInstantiation =
17592
ED->getTemplateSpecializationKind() !=
17593
TSK_ExplicitSpecialization;
17594
}
17595
17596
// Note that clang allows ODR-like semantics for ObjC/C, i.e., do
17597
// not keep more that one definition around (merge them). However,
17598
// ensure the decl passes the structural compatibility check in
17599
// C11 6.2.7/1 (or 6.1.2.6/1 in C89).
17600
NamedDecl *Hidden = nullptr;
17601
if (SkipBody && !hasVisibleDefinition(Def, &Hidden)) {
17602
// There is a definition of this tag, but it is not visible. We
17603
// explicitly make use of C++'s one definition rule here, and
17604
// assume that this definition is identical to the hidden one
17605
// we already have. Make the existing definition visible and
17606
// use it in place of this one.
17607
if (!getLangOpts().CPlusPlus) {
17608
// Postpone making the old definition visible until after we
17609
// complete parsing the new one and do the structural
17610
// comparison.
17611
SkipBody->CheckSameAsPrevious = true;
17612
SkipBody->New = createTagFromNewDecl();
17613
SkipBody->Previous = Def;
17614
return Def;
17615
} else {
17616
SkipBody->ShouldSkip = true;
17617
SkipBody->Previous = Def;
17618
makeMergedDefinitionVisible(Hidden);
17619
// Carry on and handle it like a normal definition. We'll
17620
// skip starting the definition later.
17621
}
17622
} else if (!IsExplicitSpecializationAfterInstantiation) {
17623
// A redeclaration in function prototype scope in C isn't
17624
// visible elsewhere, so merely issue a warning.
17625
if (!getLangOpts().CPlusPlus && S->containedInPrototypeScope())
17626
Diag(NameLoc, diag::warn_redefinition_in_param_list) << Name;
17627
else
17628
Diag(NameLoc, diag::err_redefinition) << Name;
17629
notePreviousDefinition(Def,
17630
NameLoc.isValid() ? NameLoc : KWLoc);
17631
// If this is a redefinition, recover by making this
17632
// struct be anonymous, which will make any later
17633
// references get the previous definition.
17634
Name = nullptr;
17635
Previous.clear();
17636
Invalid = true;
17637
}
17638
} else {
17639
// If the type is currently being defined, complain
17640
// about a nested redefinition.
17641
auto *TD = Context.getTagDeclType(PrevTagDecl)->getAsTagDecl();
17642
if (TD->isBeingDefined()) {
17643
Diag(NameLoc, diag::err_nested_redefinition) << Name;
17644
Diag(PrevTagDecl->getLocation(),
17645
diag::note_previous_definition);
17646
Name = nullptr;
17647
Previous.clear();
17648
Invalid = true;
17649
}
17650
}
17651
17652
// Okay, this is definition of a previously declared or referenced
17653
// tag. We're going to create a new Decl for it.
17654
}
17655
17656
// Okay, we're going to make a redeclaration. If this is some kind
17657
// of reference, make sure we build the redeclaration in the same DC
17658
// as the original, and ignore the current access specifier.
17659
if (TUK == TagUseKind::Friend || TUK == TagUseKind::Reference) {
17660
SearchDC = PrevTagDecl->getDeclContext();
17661
AS = AS_none;
17662
}
17663
}
17664
// If we get here we have (another) forward declaration or we
17665
// have a definition. Just create a new decl.
17666
17667
} else {
17668
// If we get here, this is a definition of a new tag type in a nested
17669
// scope, e.g. "struct foo; void bar() { struct foo; }", just create a
17670
// new decl/type. We set PrevDecl to NULL so that the entities
17671
// have distinct types.
17672
Previous.clear();
17673
}
17674
// If we get here, we're going to create a new Decl. If PrevDecl
17675
// is non-NULL, it's a definition of the tag declared by
17676
// PrevDecl. If it's NULL, we have a new definition.
17677
17678
// Otherwise, PrevDecl is not a tag, but was found with tag
17679
// lookup. This is only actually possible in C++, where a few
17680
// things like templates still live in the tag namespace.
17681
} else {
17682
// Use a better diagnostic if an elaborated-type-specifier
17683
// found the wrong kind of type on the first
17684
// (non-redeclaration) lookup.
17685
if ((TUK == TagUseKind::Reference || TUK == TagUseKind::Friend) &&
17686
!Previous.isForRedeclaration()) {
17687
NonTagKind NTK = getNonTagTypeDeclKind(PrevDecl, Kind);
17688
Diag(NameLoc, diag::err_tag_reference_non_tag)
17689
<< PrevDecl << NTK << llvm::to_underlying(Kind);
17690
Diag(PrevDecl->getLocation(), diag::note_declared_at);
17691
Invalid = true;
17692
17693
// Otherwise, only diagnose if the declaration is in scope.
17694
} else if (!isDeclInScope(DirectPrevDecl, SearchDC, S,
17695
SS.isNotEmpty() || isMemberSpecialization)) {
17696
// do nothing
17697
17698
// Diagnose implicit declarations introduced by elaborated types.
17699
} else if (TUK == TagUseKind::Reference || TUK == TagUseKind::Friend) {
17700
NonTagKind NTK = getNonTagTypeDeclKind(PrevDecl, Kind);
17701
Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
17702
Diag(PrevDecl->getLocation(), diag::note_previous_decl) << PrevDecl;
17703
Invalid = true;
17704
17705
// Otherwise it's a declaration. Call out a particularly common
17706
// case here.
17707
} else if (TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
17708
unsigned Kind = 0;
17709
if (isa<TypeAliasDecl>(PrevDecl)) Kind = 1;
17710
Diag(NameLoc, diag::err_tag_definition_of_typedef)
17711
<< Name << Kind << TND->getUnderlyingType();
17712
Diag(PrevDecl->getLocation(), diag::note_previous_decl) << PrevDecl;
17713
Invalid = true;
17714
17715
// Otherwise, diagnose.
17716
} else {
17717
// The tag name clashes with something else in the target scope,
17718
// issue an error and recover by making this tag be anonymous.
17719
Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
17720
notePreviousDefinition(PrevDecl, NameLoc);
17721
Name = nullptr;
17722
Invalid = true;
17723
}
17724
17725
// The existing declaration isn't relevant to us; we're in a
17726
// new scope, so clear out the previous declaration.
17727
Previous.clear();
17728
}
17729
}
17730
17731
CreateNewDecl:
17732
17733
TagDecl *PrevDecl = nullptr;
17734
if (Previous.isSingleResult())
17735
PrevDecl = cast<TagDecl>(Previous.getFoundDecl());
17736
17737
// If there is an identifier, use the location of the identifier as the
17738
// location of the decl, otherwise use the location of the struct/union
17739
// keyword.
17740
SourceLocation Loc = NameLoc.isValid() ? NameLoc : KWLoc;
17741
17742
// Otherwise, create a new declaration. If there is a previous
17743
// declaration of the same entity, the two will be linked via
17744
// PrevDecl.
17745
TagDecl *New;
17746
17747
if (Kind == TagTypeKind::Enum) {
17748
// FIXME: Tag decls should be chained to any simultaneous vardecls, e.g.:
17749
// enum X { A, B, C } D; D should chain to X.
17750
New = EnumDecl::Create(Context, SearchDC, KWLoc, Loc, Name,
17751
cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
17752
ScopedEnumUsesClassTag, IsFixed);
17753
17754
if (isStdAlignValT && (!StdAlignValT || getStdAlignValT()->isImplicit()))
17755
StdAlignValT = cast<EnumDecl>(New);
17756
17757
// If this is an undefined enum, warn.
17758
if (TUK != TagUseKind::Definition && !Invalid) {
17759
TagDecl *Def;
17760
if (IsFixed && cast<EnumDecl>(New)->isFixed()) {
17761
// C++0x: 7.2p2: opaque-enum-declaration.
17762
// Conflicts are diagnosed above. Do nothing.
17763
}
17764
else if (PrevDecl && (Def = cast<EnumDecl>(PrevDecl)->getDefinition())) {
17765
Diag(Loc, diag::ext_forward_ref_enum_def)
17766
<< New;
17767
Diag(Def->getLocation(), diag::note_previous_definition);
17768
} else {
17769
unsigned DiagID = diag::ext_forward_ref_enum;
17770
if (getLangOpts().MSVCCompat)
17771
DiagID = diag::ext_ms_forward_ref_enum;
17772
else if (getLangOpts().CPlusPlus)
17773
DiagID = diag::err_forward_ref_enum;
17774
Diag(Loc, DiagID);
17775
}
17776
}
17777
17778
if (EnumUnderlying) {
17779
EnumDecl *ED = cast<EnumDecl>(New);
17780
if (TypeSourceInfo *TI = EnumUnderlying.dyn_cast<TypeSourceInfo*>())
17781
ED->setIntegerTypeSourceInfo(TI);
17782
else
17783
ED->setIntegerType(QualType(EnumUnderlying.get<const Type *>(), 0));
17784
QualType EnumTy = ED->getIntegerType();
17785
ED->setPromotionType(Context.isPromotableIntegerType(EnumTy)
17786
? Context.getPromotedIntegerType(EnumTy)
17787
: EnumTy);
17788
assert(ED->isComplete() && "enum with type should be complete");
17789
}
17790
} else {
17791
// struct/union/class
17792
17793
// FIXME: Tag decls should be chained to any simultaneous vardecls, e.g.:
17794
// struct X { int A; } D; D should chain to X.
17795
if (getLangOpts().CPlusPlus) {
17796
// FIXME: Look for a way to use RecordDecl for simple structs.
17797
New = CXXRecordDecl::Create(Context, Kind, SearchDC, KWLoc, Loc, Name,
17798
cast_or_null<CXXRecordDecl>(PrevDecl));
17799
17800
if (isStdBadAlloc && (!StdBadAlloc || getStdBadAlloc()->isImplicit()))
17801
StdBadAlloc = cast<CXXRecordDecl>(New);
17802
} else
17803
New = RecordDecl::Create(Context, Kind, SearchDC, KWLoc, Loc, Name,
17804
cast_or_null<RecordDecl>(PrevDecl));
17805
}
17806
17807
// Only C23 and later allow defining new types in 'offsetof()'.
17808
if (OOK != OOK_Outside && TUK == TagUseKind::Definition &&
17809
!getLangOpts().CPlusPlus && !getLangOpts().C23)
17810
Diag(New->getLocation(), diag::ext_type_defined_in_offsetof)
17811
<< (OOK == OOK_Macro) << New->getSourceRange();
17812
17813
// C++11 [dcl.type]p3:
17814
// A type-specifier-seq shall not define a class or enumeration [...].
17815
if (!Invalid && getLangOpts().CPlusPlus &&
17816
(IsTypeSpecifier || IsTemplateParamOrArg) &&
17817
TUK == TagUseKind::Definition) {
17818
Diag(New->getLocation(), diag::err_type_defined_in_type_specifier)
17819
<< Context.getTagDeclType(New);
17820
Invalid = true;
17821
}
17822
17823
if (!Invalid && getLangOpts().CPlusPlus && TUK == TagUseKind::Definition &&
17824
DC->getDeclKind() == Decl::Enum) {
17825
Diag(New->getLocation(), diag::err_type_defined_in_enum)
17826
<< Context.getTagDeclType(New);
17827
Invalid = true;
17828
}
17829
17830
// Maybe add qualifier info.
17831
if (SS.isNotEmpty()) {
17832
if (SS.isSet()) {
17833
// If this is either a declaration or a definition, check the
17834
// nested-name-specifier against the current context.
17835
if ((TUK == TagUseKind::Definition || TUK == TagUseKind::Declaration) &&
17836
diagnoseQualifiedDeclaration(SS, DC, OrigName, Loc,
17837
/*TemplateId=*/nullptr,
17838
isMemberSpecialization))
17839
Invalid = true;
17840
17841
New->setQualifierInfo(SS.getWithLocInContext(Context));
17842
if (TemplateParameterLists.size() > 0) {
17843
New->setTemplateParameterListsInfo(Context, TemplateParameterLists);
17844
}
17845
}
17846
else
17847
Invalid = true;
17848
}
17849
17850
if (RecordDecl *RD = dyn_cast<RecordDecl>(New)) {
17851
// Add alignment attributes if necessary; these attributes are checked when
17852
// the ASTContext lays out the structure.
17853
//
17854
// It is important for implementing the correct semantics that this
17855
// happen here (in ActOnTag). The #pragma pack stack is
17856
// maintained as a result of parser callbacks which can occur at
17857
// many points during the parsing of a struct declaration (because
17858
// the #pragma tokens are effectively skipped over during the
17859
// parsing of the struct).
17860
if (TUK == TagUseKind::Definition && (!SkipBody || !SkipBody->ShouldSkip)) {
17861
AddAlignmentAttributesForRecord(RD);
17862
AddMsStructLayoutForRecord(RD);
17863
}
17864
}
17865
17866
if (ModulePrivateLoc.isValid()) {
17867
if (isMemberSpecialization)
17868
Diag(New->getLocation(), diag::err_module_private_specialization)
17869
<< 2
17870
<< FixItHint::CreateRemoval(ModulePrivateLoc);
17871
// __module_private__ does not apply to local classes. However, we only
17872
// diagnose this as an error when the declaration specifiers are
17873
// freestanding. Here, we just ignore the __module_private__.
17874
else if (!SearchDC->isFunctionOrMethod())
17875
New->setModulePrivate();
17876
}
17877
17878
// If this is a specialization of a member class (of a class template),
17879
// check the specialization.
17880
if (isMemberSpecialization && CheckMemberSpecialization(New, Previous))
17881
Invalid = true;
17882
17883
// If we're declaring or defining a tag in function prototype scope in C,
17884
// note that this type can only be used within the function and add it to
17885
// the list of decls to inject into the function definition scope.
17886
if ((Name || Kind == TagTypeKind::Enum) &&
17887
getNonFieldDeclScope(S)->isFunctionPrototypeScope()) {
17888
if (getLangOpts().CPlusPlus) {
17889
// C++ [dcl.fct]p6:
17890
// Types shall not be defined in return or parameter types.
17891
if (TUK == TagUseKind::Definition && !IsTypeSpecifier) {
17892
Diag(Loc, diag::err_type_defined_in_param_type)
17893
<< Name;
17894
Invalid = true;
17895
}
17896
} else if (!PrevDecl) {
17897
Diag(Loc, diag::warn_decl_in_param_list) << Context.getTagDeclType(New);
17898
}
17899
}
17900
17901
if (Invalid)
17902
New->setInvalidDecl();
17903
17904
// Set the lexical context. If the tag has a C++ scope specifier, the
17905
// lexical context will be different from the semantic context.
17906
New->setLexicalDeclContext(CurContext);
17907
17908
// Mark this as a friend decl if applicable.
17909
// In Microsoft mode, a friend declaration also acts as a forward
17910
// declaration so we always pass true to setObjectOfFriendDecl to make
17911
// the tag name visible.
17912
if (TUK == TagUseKind::Friend)
17913
New->setObjectOfFriendDecl(getLangOpts().MSVCCompat);
17914
17915
// Set the access specifier.
17916
if (!Invalid && SearchDC->isRecord())
17917
SetMemberAccessSpecifier(New, PrevDecl, AS);
17918
17919
if (PrevDecl)
17920
CheckRedeclarationInModule(New, PrevDecl);
17921
17922
if (TUK == TagUseKind::Definition && (!SkipBody || !SkipBody->ShouldSkip))
17923
New->startDefinition();
17924
17925
ProcessDeclAttributeList(S, New, Attrs);
17926
AddPragmaAttributes(S, New);
17927
17928
// If this has an identifier, add it to the scope stack.
17929
if (TUK == TagUseKind::Friend) {
17930
// We might be replacing an existing declaration in the lookup tables;
17931
// if so, borrow its access specifier.
17932
if (PrevDecl)
17933
New->setAccess(PrevDecl->getAccess());
17934
17935
DeclContext *DC = New->getDeclContext()->getRedeclContext();
17936
DC->makeDeclVisibleInContext(New);
17937
if (Name) // can be null along some error paths
17938
if (Scope *EnclosingScope = getScopeForDeclContext(S, DC))
17939
PushOnScopeChains(New, EnclosingScope, /* AddToContext = */ false);
17940
} else if (Name) {
17941
S = getNonFieldDeclScope(S);
17942
PushOnScopeChains(New, S, true);
17943
} else {
17944
CurContext->addDecl(New);
17945
}
17946
17947
// If this is the C FILE type, notify the AST context.
17948
if (IdentifierInfo *II = New->getIdentifier())
17949
if (!New->isInvalidDecl() &&
17950
New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
17951
II->isStr("FILE"))
17952
Context.setFILEDecl(New);
17953
17954
if (PrevDecl)
17955
mergeDeclAttributes(New, PrevDecl);
17956
17957
if (auto *CXXRD = dyn_cast<CXXRecordDecl>(New)) {
17958
inferGslOwnerPointerAttribute(CXXRD);
17959
inferNullableClassAttribute(CXXRD);
17960
}
17961
17962
// If there's a #pragma GCC visibility in scope, set the visibility of this
17963
// record.
17964
AddPushedVisibilityAttribute(New);
17965
17966
if (isMemberSpecialization && !New->isInvalidDecl())
17967
CompleteMemberSpecialization(New, Previous);
17968
17969
OwnedDecl = true;
17970
// In C++, don't return an invalid declaration. We can't recover well from
17971
// the cases where we make the type anonymous.
17972
if (Invalid && getLangOpts().CPlusPlus) {
17973
if (New->isBeingDefined())
17974
if (auto RD = dyn_cast<RecordDecl>(New))
17975
RD->completeDefinition();
17976
return true;
17977
} else if (SkipBody && SkipBody->ShouldSkip) {
17978
return SkipBody->Previous;
17979
} else {
17980
return New;
17981
}
17982
}
17983
17984
void Sema::ActOnTagStartDefinition(Scope *S, Decl *TagD) {
17985
AdjustDeclIfTemplate(TagD);
17986
TagDecl *Tag = cast<TagDecl>(TagD);
17987
17988
// Enter the tag context.
17989
PushDeclContext(S, Tag);
17990
17991
ActOnDocumentableDecl(TagD);
17992
17993
// If there's a #pragma GCC visibility in scope, set the visibility of this
17994
// record.
17995
AddPushedVisibilityAttribute(Tag);
17996
}
17997
17998
bool Sema::ActOnDuplicateDefinition(Decl *Prev, SkipBodyInfo &SkipBody) {
17999
if (!hasStructuralCompatLayout(Prev, SkipBody.New))
18000
return false;
18001
18002
// Make the previous decl visible.
18003
makeMergedDefinitionVisible(SkipBody.Previous);
18004
return true;
18005
}
18006
18007
void Sema::ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagD,
18008
SourceLocation FinalLoc,
18009
bool IsFinalSpelledSealed,
18010
bool IsAbstract,
18011
SourceLocation LBraceLoc) {
18012
AdjustDeclIfTemplate(TagD);
18013
CXXRecordDecl *Record = cast<CXXRecordDecl>(TagD);
18014
18015
FieldCollector->StartClass();
18016
18017
if (!Record->getIdentifier())
18018
return;
18019
18020
if (IsAbstract)
18021
Record->markAbstract();
18022
18023
if (FinalLoc.isValid()) {
18024
Record->addAttr(FinalAttr::Create(Context, FinalLoc,
18025
IsFinalSpelledSealed
18026
? FinalAttr::Keyword_sealed
18027
: FinalAttr::Keyword_final));
18028
}
18029
// C++ [class]p2:
18030
// [...] The class-name is also inserted into the scope of the
18031
// class itself; this is known as the injected-class-name. For
18032
// purposes of access checking, the injected-class-name is treated
18033
// as if it were a public member name.
18034
CXXRecordDecl *InjectedClassName = CXXRecordDecl::Create(
18035
Context, Record->getTagKind(), CurContext, Record->getBeginLoc(),
18036
Record->getLocation(), Record->getIdentifier(),
18037
/*PrevDecl=*/nullptr,
18038
/*DelayTypeCreation=*/true);
18039
Context.getTypeDeclType(InjectedClassName, Record);
18040
InjectedClassName->setImplicit();
18041
InjectedClassName->setAccess(AS_public);
18042
if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate())
18043
InjectedClassName->setDescribedClassTemplate(Template);
18044
PushOnScopeChains(InjectedClassName, S);
18045
assert(InjectedClassName->isInjectedClassName() &&
18046
"Broken injected-class-name");
18047
}
18048
18049
void Sema::ActOnTagFinishDefinition(Scope *S, Decl *TagD,
18050
SourceRange BraceRange) {
18051
AdjustDeclIfTemplate(TagD);
18052
TagDecl *Tag = cast<TagDecl>(TagD);
18053
Tag->setBraceRange(BraceRange);
18054
18055
// Make sure we "complete" the definition even it is invalid.
18056
if (Tag->isBeingDefined()) {
18057
assert(Tag->isInvalidDecl() && "We should already have completed it");
18058
if (RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18059
RD->completeDefinition();
18060
}
18061
18062
if (auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
18063
FieldCollector->FinishClass();
18064
if (RD->hasAttr<SYCLSpecialClassAttr>()) {
18065
auto *Def = RD->getDefinition();
18066
assert(Def && "The record is expected to have a completed definition");
18067
unsigned NumInitMethods = 0;
18068
for (auto *Method : Def->methods()) {
18069
if (!Method->getIdentifier())
18070
continue;
18071
if (Method->getName() == "__init")
18072
NumInitMethods++;
18073
}
18074
if (NumInitMethods > 1 || !Def->hasInitMethod())
18075
Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
18076
}
18077
18078
// If we're defining a dynamic class in a module interface unit, we always
18079
// need to produce the vtable for it, even if the vtable is not used in the
18080
// current TU.
18081
//
18082
// The case where the current class is not dynamic is handled in
18083
// MarkVTableUsed.
18084
if (getCurrentModule() && getCurrentModule()->isInterfaceOrPartition())
18085
MarkVTableUsed(RD->getLocation(), RD, /*DefinitionRequired=*/true);
18086
}
18087
18088
// Exit this scope of this tag's definition.
18089
PopDeclContext();
18090
18091
if (getCurLexicalContext()->isObjCContainer() &&
18092
Tag->getDeclContext()->isFileContext())
18093
Tag->setTopLevelDeclInObjCContainer();
18094
18095
// Notify the consumer that we've defined a tag.
18096
if (!Tag->isInvalidDecl())
18097
Consumer.HandleTagDeclDefinition(Tag);
18098
18099
// Clangs implementation of #pragma align(packed) differs in bitfield layout
18100
// from XLs and instead matches the XL #pragma pack(1) behavior.
18101
if (Context.getTargetInfo().getTriple().isOSAIX() &&
18102
AlignPackStack.hasValue()) {
18103
AlignPackInfo APInfo = AlignPackStack.CurrentValue;
18104
// Only diagnose #pragma align(packed).
18105
if (!APInfo.IsAlignAttr() || APInfo.getAlignMode() != AlignPackInfo::Packed)
18106
return;
18107
const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
18108
if (!RD)
18109
return;
18110
// Only warn if there is at least 1 bitfield member.
18111
if (llvm::any_of(RD->fields(),
18112
[](const FieldDecl *FD) { return FD->isBitField(); }))
18113
Diag(BraceRange.getBegin(), diag::warn_pragma_align_not_xl_compatible);
18114
}
18115
}
18116
18117
void Sema::ActOnTagDefinitionError(Scope *S, Decl *TagD) {
18118
AdjustDeclIfTemplate(TagD);
18119
TagDecl *Tag = cast<TagDecl>(TagD);
18120
Tag->setInvalidDecl();
18121
18122
// Make sure we "complete" the definition even it is invalid.
18123
if (Tag->isBeingDefined()) {
18124
if (RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18125
RD->completeDefinition();
18126
}
18127
18128
// We're undoing ActOnTagStartDefinition here, not
18129
// ActOnStartCXXMemberDeclarations, so we don't have to mess with
18130
// the FieldCollector.
18131
18132
PopDeclContext();
18133
}
18134
18135
// Note that FieldName may be null for anonymous bitfields.
18136
ExprResult Sema::VerifyBitField(SourceLocation FieldLoc,
18137
const IdentifierInfo *FieldName,
18138
QualType FieldTy, bool IsMsStruct,
18139
Expr *BitWidth) {
18140
assert(BitWidth);
18141
if (BitWidth->containsErrors())
18142
return ExprError();
18143
18144
// C99 6.7.2.1p4 - verify the field type.
18145
// C++ 9.6p3: A bit-field shall have integral or enumeration type.
18146
if (!FieldTy->isDependentType() && !FieldTy->isIntegralOrEnumerationType()) {
18147
// Handle incomplete and sizeless types with a specific error.
18148
if (RequireCompleteSizedType(FieldLoc, FieldTy,
18149
diag::err_field_incomplete_or_sizeless))
18150
return ExprError();
18151
if (FieldName)
18152
return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
18153
<< FieldName << FieldTy << BitWidth->getSourceRange();
18154
return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
18155
<< FieldTy << BitWidth->getSourceRange();
18156
} else if (DiagnoseUnexpandedParameterPack(const_cast<Expr *>(BitWidth),
18157
UPPC_BitFieldWidth))
18158
return ExprError();
18159
18160
// If the bit-width is type- or value-dependent, don't try to check
18161
// it now.
18162
if (BitWidth->isValueDependent() || BitWidth->isTypeDependent())
18163
return BitWidth;
18164
18165
llvm::APSInt Value;
18166
ExprResult ICE = VerifyIntegerConstantExpression(BitWidth, &Value, AllowFold);
18167
if (ICE.isInvalid())
18168
return ICE;
18169
BitWidth = ICE.get();
18170
18171
// Zero-width bitfield is ok for anonymous field.
18172
if (Value == 0 && FieldName)
18173
return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
18174
<< FieldName << BitWidth->getSourceRange();
18175
18176
if (Value.isSigned() && Value.isNegative()) {
18177
if (FieldName)
18178
return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
18179
<< FieldName << toString(Value, 10);
18180
return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
18181
<< toString(Value, 10);
18182
}
18183
18184
// The size of the bit-field must not exceed our maximum permitted object
18185
// size.
18186
if (Value.getActiveBits() > ConstantArrayType::getMaxSizeBits(Context)) {
18187
return Diag(FieldLoc, diag::err_bitfield_too_wide)
18188
<< !FieldName << FieldName << toString(Value, 10);
18189
}
18190
18191
if (!FieldTy->isDependentType()) {
18192
uint64_t TypeStorageSize = Context.getTypeSize(FieldTy);
18193
uint64_t TypeWidth = Context.getIntWidth(FieldTy);
18194
bool BitfieldIsOverwide = Value.ugt(TypeWidth);
18195
18196
// Over-wide bitfields are an error in C or when using the MSVC bitfield
18197
// ABI.
18198
bool CStdConstraintViolation =
18199
BitfieldIsOverwide && !getLangOpts().CPlusPlus;
18200
bool MSBitfieldViolation =
18201
Value.ugt(TypeStorageSize) &&
18202
(IsMsStruct || Context.getTargetInfo().getCXXABI().isMicrosoft());
18203
if (CStdConstraintViolation || MSBitfieldViolation) {
18204
unsigned DiagWidth =
18205
CStdConstraintViolation ? TypeWidth : TypeStorageSize;
18206
return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
18207
<< (bool)FieldName << FieldName << toString(Value, 10)
18208
<< !CStdConstraintViolation << DiagWidth;
18209
}
18210
18211
// Warn on types where the user might conceivably expect to get all
18212
// specified bits as value bits: that's all integral types other than
18213
// 'bool'.
18214
if (BitfieldIsOverwide && !FieldTy->isBooleanType() && FieldName) {
18215
Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
18216
<< FieldName << toString(Value, 10)
18217
<< (unsigned)TypeWidth;
18218
}
18219
}
18220
18221
return BitWidth;
18222
}
18223
18224
Decl *Sema::ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
18225
Declarator &D, Expr *BitfieldWidth) {
18226
FieldDecl *Res = HandleField(S, cast_if_present<RecordDecl>(TagD), DeclStart,
18227
D, BitfieldWidth,
18228
/*InitStyle=*/ICIS_NoInit, AS_public);
18229
return Res;
18230
}
18231
18232
FieldDecl *Sema::HandleField(Scope *S, RecordDecl *Record,
18233
SourceLocation DeclStart,
18234
Declarator &D, Expr *BitWidth,
18235
InClassInitStyle InitStyle,
18236
AccessSpecifier AS) {
18237
if (D.isDecompositionDeclarator()) {
18238
const DecompositionDeclarator &Decomp = D.getDecompositionDeclarator();
18239
Diag(Decomp.getLSquareLoc(), diag::err_decomp_decl_context)
18240
<< Decomp.getSourceRange();
18241
return nullptr;
18242
}
18243
18244
const IdentifierInfo *II = D.getIdentifier();
18245
SourceLocation Loc = DeclStart;
18246
if (II) Loc = D.getIdentifierLoc();
18247
18248
TypeSourceInfo *TInfo = GetTypeForDeclarator(D);
18249
QualType T = TInfo->getType();
18250
if (getLangOpts().CPlusPlus) {
18251
CheckExtraCXXDefaultArguments(D);
18252
18253
if (DiagnoseUnexpandedParameterPack(D.getIdentifierLoc(), TInfo,
18254
UPPC_DataMemberType)) {
18255
D.setInvalidType();
18256
T = Context.IntTy;
18257
TInfo = Context.getTrivialTypeSourceInfo(T, Loc);
18258
}
18259
}
18260
18261
DiagnoseFunctionSpecifiers(D.getDeclSpec());
18262
18263
if (D.getDeclSpec().isInlineSpecified())
18264
Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
18265
<< getLangOpts().CPlusPlus17;
18266
if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec())
18267
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
18268
diag::err_invalid_thread)
18269
<< DeclSpec::getSpecifierName(TSCS);
18270
18271
// Check to see if this name was declared as a member previously
18272
NamedDecl *PrevDecl = nullptr;
18273
LookupResult Previous(*this, II, Loc, LookupMemberName,
18274
RedeclarationKind::ForVisibleRedeclaration);
18275
LookupName(Previous, S);
18276
switch (Previous.getResultKind()) {
18277
case LookupResult::Found:
18278
case LookupResult::FoundUnresolvedValue:
18279
PrevDecl = Previous.getAsSingle<NamedDecl>();
18280
break;
18281
18282
case LookupResult::FoundOverloaded:
18283
PrevDecl = Previous.getRepresentativeDecl();
18284
break;
18285
18286
case LookupResult::NotFound:
18287
case LookupResult::NotFoundInCurrentInstantiation:
18288
case LookupResult::Ambiguous:
18289
break;
18290
}
18291
Previous.suppressDiagnostics();
18292
18293
if (PrevDecl && PrevDecl->isTemplateParameter()) {
18294
// Maybe we will complain about the shadowed template parameter.
18295
DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl);
18296
// Just pretend that we didn't see the previous declaration.
18297
PrevDecl = nullptr;
18298
}
18299
18300
if (PrevDecl && !isDeclInScope(PrevDecl, Record, S))
18301
PrevDecl = nullptr;
18302
18303
bool Mutable
18304
= (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_mutable);
18305
SourceLocation TSSL = D.getBeginLoc();
18306
FieldDecl *NewFD
18307
= CheckFieldDecl(II, T, TInfo, Record, Loc, Mutable, BitWidth, InitStyle,
18308
TSSL, AS, PrevDecl, &D);
18309
18310
if (NewFD->isInvalidDecl())
18311
Record->setInvalidDecl();
18312
18313
if (D.getDeclSpec().isModulePrivateSpecified())
18314
NewFD->setModulePrivate();
18315
18316
if (NewFD->isInvalidDecl() && PrevDecl) {
18317
// Don't introduce NewFD into scope; there's already something
18318
// with the same name in the same scope.
18319
} else if (II) {
18320
PushOnScopeChains(NewFD, S);
18321
} else
18322
Record->addDecl(NewFD);
18323
18324
return NewFD;
18325
}
18326
18327
FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T,
18328
TypeSourceInfo *TInfo,
18329
RecordDecl *Record, SourceLocation Loc,
18330
bool Mutable, Expr *BitWidth,
18331
InClassInitStyle InitStyle,
18332
SourceLocation TSSL,
18333
AccessSpecifier AS, NamedDecl *PrevDecl,
18334
Declarator *D) {
18335
const IdentifierInfo *II = Name.getAsIdentifierInfo();
18336
bool InvalidDecl = false;
18337
if (D) InvalidDecl = D->isInvalidType();
18338
18339
// If we receive a broken type, recover by assuming 'int' and
18340
// marking this declaration as invalid.
18341
if (T.isNull() || T->containsErrors()) {
18342
InvalidDecl = true;
18343
T = Context.IntTy;
18344
}
18345
18346
QualType EltTy = Context.getBaseElementType(T);
18347
if (!EltTy->isDependentType() && !EltTy->containsErrors()) {
18348
if (RequireCompleteSizedType(Loc, EltTy,
18349
diag::err_field_incomplete_or_sizeless)) {
18350
// Fields of incomplete type force their record to be invalid.
18351
Record->setInvalidDecl();
18352
InvalidDecl = true;
18353
} else {
18354
NamedDecl *Def;
18355
EltTy->isIncompleteType(&Def);
18356
if (Def && Def->isInvalidDecl()) {
18357
Record->setInvalidDecl();
18358
InvalidDecl = true;
18359
}
18360
}
18361
}
18362
18363
// TR 18037 does not allow fields to be declared with address space
18364
if (T.hasAddressSpace() || T->isDependentAddressSpaceType() ||
18365
T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
18366
Diag(Loc, diag::err_field_with_address_space);
18367
Record->setInvalidDecl();
18368
InvalidDecl = true;
18369
}
18370
18371
if (LangOpts.OpenCL) {
18372
// OpenCL v1.2 s6.9b,r & OpenCL v2.0 s6.12.5 - The following types cannot be
18373
// used as structure or union field: image, sampler, event or block types.
18374
if (T->isEventT() || T->isImageType() || T->isSamplerT() ||
18375
T->isBlockPointerType()) {
18376
Diag(Loc, diag::err_opencl_type_struct_or_union_field) << T;
18377
Record->setInvalidDecl();
18378
InvalidDecl = true;
18379
}
18380
// OpenCL v1.2 s6.9.c: bitfields are not supported, unless Clang extension
18381
// is enabled.
18382
if (BitWidth && !getOpenCLOptions().isAvailableOption(
18383
"__cl_clang_bitfields", LangOpts)) {
18384
Diag(Loc, diag::err_opencl_bitfields);
18385
InvalidDecl = true;
18386
}
18387
}
18388
18389
// Anonymous bit-fields cannot be cv-qualified (CWG 2229).
18390
if (!InvalidDecl && getLangOpts().CPlusPlus && !II && BitWidth &&
18391
T.hasQualifiers()) {
18392
InvalidDecl = true;
18393
Diag(Loc, diag::err_anon_bitfield_qualifiers);
18394
}
18395
18396
// C99 6.7.2.1p8: A member of a structure or union may have any type other
18397
// than a variably modified type.
18398
if (!InvalidDecl && T->isVariablyModifiedType()) {
18399
if (!tryToFixVariablyModifiedVarType(
18400
TInfo, T, Loc, diag::err_typecheck_field_variable_size))
18401
InvalidDecl = true;
18402
}
18403
18404
// Fields can not have abstract class types
18405
if (!InvalidDecl && RequireNonAbstractType(Loc, T,
18406
diag::err_abstract_type_in_decl,
18407
AbstractFieldType))
18408
InvalidDecl = true;
18409
18410
if (InvalidDecl)
18411
BitWidth = nullptr;
18412
// If this is declared as a bit-field, check the bit-field.
18413
if (BitWidth) {
18414
BitWidth =
18415
VerifyBitField(Loc, II, T, Record->isMsStruct(Context), BitWidth).get();
18416
if (!BitWidth) {
18417
InvalidDecl = true;
18418
BitWidth = nullptr;
18419
}
18420
}
18421
18422
// Check that 'mutable' is consistent with the type of the declaration.
18423
if (!InvalidDecl && Mutable) {
18424
unsigned DiagID = 0;
18425
if (T->isReferenceType())
18426
DiagID = getLangOpts().MSVCCompat ? diag::ext_mutable_reference
18427
: diag::err_mutable_reference;
18428
else if (T.isConstQualified())
18429
DiagID = diag::err_mutable_const;
18430
18431
if (DiagID) {
18432
SourceLocation ErrLoc = Loc;
18433
if (D && D->getDeclSpec().getStorageClassSpecLoc().isValid())
18434
ErrLoc = D->getDeclSpec().getStorageClassSpecLoc();
18435
Diag(ErrLoc, DiagID);
18436
if (DiagID != diag::ext_mutable_reference) {
18437
Mutable = false;
18438
InvalidDecl = true;
18439
}
18440
}
18441
}
18442
18443
// C++11 [class.union]p8 (DR1460):
18444
// At most one variant member of a union may have a
18445
// brace-or-equal-initializer.
18446
if (InitStyle != ICIS_NoInit)
18447
checkDuplicateDefaultInit(*this, cast<CXXRecordDecl>(Record), Loc);
18448
18449
FieldDecl *NewFD = FieldDecl::Create(Context, Record, TSSL, Loc, II, T, TInfo,
18450
BitWidth, Mutable, InitStyle);
18451
if (InvalidDecl)
18452
NewFD->setInvalidDecl();
18453
18454
if (PrevDecl && !isa<TagDecl>(PrevDecl) &&
18455
!PrevDecl->isPlaceholderVar(getLangOpts())) {
18456
Diag(Loc, diag::err_duplicate_member) << II;
18457
Diag(PrevDecl->getLocation(), diag::note_previous_declaration);
18458
NewFD->setInvalidDecl();
18459
}
18460
18461
if (!InvalidDecl && getLangOpts().CPlusPlus) {
18462
if (Record->isUnion()) {
18463
if (const RecordType *RT = EltTy->getAs<RecordType>()) {
18464
CXXRecordDecl* RDecl = cast<CXXRecordDecl>(RT->getDecl());
18465
if (RDecl->getDefinition()) {
18466
// C++ [class.union]p1: An object of a class with a non-trivial
18467
// constructor, a non-trivial copy constructor, a non-trivial
18468
// destructor, or a non-trivial copy assignment operator
18469
// cannot be a member of a union, nor can an array of such
18470
// objects.
18471
if (CheckNontrivialField(NewFD))
18472
NewFD->setInvalidDecl();
18473
}
18474
}
18475
18476
// C++ [class.union]p1: If a union contains a member of reference type,
18477
// the program is ill-formed, except when compiling with MSVC extensions
18478
// enabled.
18479
if (EltTy->isReferenceType()) {
18480
Diag(NewFD->getLocation(), getLangOpts().MicrosoftExt ?
18481
diag::ext_union_member_of_reference_type :
18482
diag::err_union_member_of_reference_type)
18483
<< NewFD->getDeclName() << EltTy;
18484
if (!getLangOpts().MicrosoftExt)
18485
NewFD->setInvalidDecl();
18486
}
18487
}
18488
}
18489
18490
// FIXME: We need to pass in the attributes given an AST
18491
// representation, not a parser representation.
18492
if (D) {
18493
// FIXME: The current scope is almost... but not entirely... correct here.
18494
ProcessDeclAttributes(getCurScope(), NewFD, *D);
18495
18496
if (NewFD->hasAttrs())
18497
CheckAlignasUnderalignment(NewFD);
18498
}
18499
18500
// In auto-retain/release, infer strong retension for fields of
18501
// retainable type.
18502
if (getLangOpts().ObjCAutoRefCount && ObjC().inferObjCARCLifetime(NewFD))
18503
NewFD->setInvalidDecl();
18504
18505
if (T.isObjCGCWeak())
18506
Diag(Loc, diag::warn_attribute_weak_on_field);
18507
18508
// PPC MMA non-pointer types are not allowed as field types.
18509
if (Context.getTargetInfo().getTriple().isPPC64() &&
18510
PPC().CheckPPCMMAType(T, NewFD->getLocation()))
18511
NewFD->setInvalidDecl();
18512
18513
NewFD->setAccess(AS);
18514
return NewFD;
18515
}
18516
18517
bool Sema::CheckNontrivialField(FieldDecl *FD) {
18518
assert(FD);
18519
assert(getLangOpts().CPlusPlus && "valid check only for C++");
18520
18521
if (FD->isInvalidDecl() || FD->getType()->isDependentType())
18522
return false;
18523
18524
QualType EltTy = Context.getBaseElementType(FD->getType());
18525
if (const RecordType *RT = EltTy->getAs<RecordType>()) {
18526
CXXRecordDecl *RDecl = cast<CXXRecordDecl>(RT->getDecl());
18527
if (RDecl->getDefinition()) {
18528
// We check for copy constructors before constructors
18529
// because otherwise we'll never get complaints about
18530
// copy constructors.
18531
18532
CXXSpecialMemberKind member = CXXSpecialMemberKind::Invalid;
18533
// We're required to check for any non-trivial constructors. Since the
18534
// implicit default constructor is suppressed if there are any
18535
// user-declared constructors, we just need to check that there is a
18536
// trivial default constructor and a trivial copy constructor. (We don't
18537
// worry about move constructors here, since this is a C++98 check.)
18538
if (RDecl->hasNonTrivialCopyConstructor())
18539
member = CXXSpecialMemberKind::CopyConstructor;
18540
else if (!RDecl->hasTrivialDefaultConstructor())
18541
member = CXXSpecialMemberKind::DefaultConstructor;
18542
else if (RDecl->hasNonTrivialCopyAssignment())
18543
member = CXXSpecialMemberKind::CopyAssignment;
18544
else if (RDecl->hasNonTrivialDestructor())
18545
member = CXXSpecialMemberKind::Destructor;
18546
18547
if (member != CXXSpecialMemberKind::Invalid) {
18548
if (!getLangOpts().CPlusPlus11 &&
18549
getLangOpts().ObjCAutoRefCount && RDecl->hasObjectMember()) {
18550
// Objective-C++ ARC: it is an error to have a non-trivial field of
18551
// a union. However, system headers in Objective-C programs
18552
// occasionally have Objective-C lifetime objects within unions,
18553
// and rather than cause the program to fail, we make those
18554
// members unavailable.
18555
SourceLocation Loc = FD->getLocation();
18556
if (getSourceManager().isInSystemHeader(Loc)) {
18557
if (!FD->hasAttr<UnavailableAttr>())
18558
FD->addAttr(UnavailableAttr::CreateImplicit(Context, "",
18559
UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
18560
return false;
18561
}
18562
}
18563
18564
Diag(
18565
FD->getLocation(),
18566
getLangOpts().CPlusPlus11
18567
? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
18568
: diag::err_illegal_union_or_anon_struct_member)
18569
<< FD->getParent()->isUnion() << FD->getDeclName()
18570
<< llvm::to_underlying(member);
18571
DiagnoseNontrivial(RDecl, member);
18572
return !getLangOpts().CPlusPlus11;
18573
}
18574
}
18575
}
18576
18577
return false;
18578
}
18579
18580
void Sema::ActOnLastBitfield(SourceLocation DeclLoc,
18581
SmallVectorImpl<Decl *> &AllIvarDecls) {
18582
if (LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
18583
return;
18584
18585
Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
18586
ObjCIvarDecl *Ivar = cast<ObjCIvarDecl>(ivarDecl);
18587
18588
if (!Ivar->isBitField() || Ivar->isZeroLengthBitField(Context))
18589
return;
18590
ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(CurContext);
18591
if (!ID) {
18592
if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(CurContext)) {
18593
if (!CD->IsClassExtension())
18594
return;
18595
}
18596
// No need to add this to end of @implementation.
18597
else
18598
return;
18599
}
18600
// All conditions are met. Add a new bitfield to the tail end of ivars.
18601
llvm::APInt Zero(Context.getTypeSize(Context.IntTy), 0);
18602
Expr * BW = IntegerLiteral::Create(Context, Zero, Context.IntTy, DeclLoc);
18603
18604
Ivar = ObjCIvarDecl::Create(Context, cast<ObjCContainerDecl>(CurContext),
18605
DeclLoc, DeclLoc, nullptr,
18606
Context.CharTy,
18607
Context.getTrivialTypeSourceInfo(Context.CharTy,
18608
DeclLoc),
18609
ObjCIvarDecl::Private, BW,
18610
true);
18611
AllIvarDecls.push_back(Ivar);
18612
}
18613
18614
/// [class.dtor]p4:
18615
/// At the end of the definition of a class, overload resolution is
18616
/// performed among the prospective destructors declared in that class with
18617
/// an empty argument list to select the destructor for the class, also
18618
/// known as the selected destructor.
18619
///
18620
/// We do the overload resolution here, then mark the selected constructor in the AST.
18621
/// Later CXXRecordDecl::getDestructor() will return the selected constructor.
18622
static void ComputeSelectedDestructor(Sema &S, CXXRecordDecl *Record) {
18623
if (!Record->hasUserDeclaredDestructor()) {
18624
return;
18625
}
18626
18627
SourceLocation Loc = Record->getLocation();
18628
OverloadCandidateSet OCS(Loc, OverloadCandidateSet::CSK_Normal);
18629
18630
for (auto *Decl : Record->decls()) {
18631
if (auto *DD = dyn_cast<CXXDestructorDecl>(Decl)) {
18632
if (DD->isInvalidDecl())
18633
continue;
18634
S.AddOverloadCandidate(DD, DeclAccessPair::make(DD, DD->getAccess()), {},
18635
OCS);
18636
assert(DD->isIneligibleOrNotSelected() && "Selecting a destructor but a destructor was already selected.");
18637
}
18638
}
18639
18640
if (OCS.empty()) {
18641
return;
18642
}
18643
OverloadCandidateSet::iterator Best;
18644
unsigned Msg = 0;
18645
OverloadCandidateDisplayKind DisplayKind;
18646
18647
switch (OCS.BestViableFunction(S, Loc, Best)) {
18648
case OR_Success:
18649
case OR_Deleted:
18650
Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
18651
break;
18652
18653
case OR_Ambiguous:
18654
Msg = diag::err_ambiguous_destructor;
18655
DisplayKind = OCD_AmbiguousCandidates;
18656
break;
18657
18658
case OR_No_Viable_Function:
18659
Msg = diag::err_no_viable_destructor;
18660
DisplayKind = OCD_AllCandidates;
18661
break;
18662
}
18663
18664
if (Msg) {
18665
// OpenCL have got their own thing going with destructors. It's slightly broken,
18666
// but we allow it.
18667
if (!S.LangOpts.OpenCL) {
18668
PartialDiagnostic Diag = S.PDiag(Msg) << Record;
18669
OCS.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S, DisplayKind, {});
18670
Record->setInvalidDecl();
18671
}
18672
// It's a bit hacky: At this point we've raised an error but we want the
18673
// rest of the compiler to continue somehow working. However almost
18674
// everything we'll try to do with the class will depend on there being a
18675
// destructor. So let's pretend the first one is selected and hope for the
18676
// best.
18677
Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.begin()->Function));
18678
}
18679
}
18680
18681
/// [class.mem.special]p5
18682
/// Two special member functions are of the same kind if:
18683
/// - they are both default constructors,
18684
/// - they are both copy or move constructors with the same first parameter
18685
/// type, or
18686
/// - they are both copy or move assignment operators with the same first
18687
/// parameter type and the same cv-qualifiers and ref-qualifier, if any.
18688
static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context,
18689
CXXMethodDecl *M1,
18690
CXXMethodDecl *M2,
18691
CXXSpecialMemberKind CSM) {
18692
// We don't want to compare templates to non-templates: See
18693
// https://github.com/llvm/llvm-project/issues/59206
18694
if (CSM == CXXSpecialMemberKind::DefaultConstructor)
18695
return bool(M1->getDescribedFunctionTemplate()) ==
18696
bool(M2->getDescribedFunctionTemplate());
18697
// FIXME: better resolve CWG
18698
// https://cplusplus.github.io/CWG/issues/2787.html
18699
if (!Context.hasSameType(M1->getNonObjectParameter(0)->getType(),
18700
M2->getNonObjectParameter(0)->getType()))
18701
return false;
18702
if (!Context.hasSameType(M1->getFunctionObjectParameterReferenceType(),
18703
M2->getFunctionObjectParameterReferenceType()))
18704
return false;
18705
18706
return true;
18707
}
18708
18709
/// [class.mem.special]p6:
18710
/// An eligible special member function is a special member function for which:
18711
/// - the function is not deleted,
18712
/// - the associated constraints, if any, are satisfied, and
18713
/// - no special member function of the same kind whose associated constraints
18714
/// [CWG2595], if any, are satisfied is more constrained.
18715
static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record,
18716
ArrayRef<CXXMethodDecl *> Methods,
18717
CXXSpecialMemberKind CSM) {
18718
SmallVector<bool, 4> SatisfactionStatus;
18719
18720
for (CXXMethodDecl *Method : Methods) {
18721
const Expr *Constraints = Method->getTrailingRequiresClause();
18722
if (!Constraints)
18723
SatisfactionStatus.push_back(true);
18724
else {
18725
ConstraintSatisfaction Satisfaction;
18726
if (S.CheckFunctionConstraints(Method, Satisfaction))
18727
SatisfactionStatus.push_back(false);
18728
else
18729
SatisfactionStatus.push_back(Satisfaction.IsSatisfied);
18730
}
18731
}
18732
18733
for (size_t i = 0; i < Methods.size(); i++) {
18734
if (!SatisfactionStatus[i])
18735
continue;
18736
CXXMethodDecl *Method = Methods[i];
18737
CXXMethodDecl *OrigMethod = Method;
18738
if (FunctionDecl *MF = OrigMethod->getInstantiatedFromMemberFunction())
18739
OrigMethod = cast<CXXMethodDecl>(MF);
18740
18741
const Expr *Constraints = OrigMethod->getTrailingRequiresClause();
18742
bool AnotherMethodIsMoreConstrained = false;
18743
for (size_t j = 0; j < Methods.size(); j++) {
18744
if (i == j || !SatisfactionStatus[j])
18745
continue;
18746
CXXMethodDecl *OtherMethod = Methods[j];
18747
if (FunctionDecl *MF = OtherMethod->getInstantiatedFromMemberFunction())
18748
OtherMethod = cast<CXXMethodDecl>(MF);
18749
18750
if (!AreSpecialMemberFunctionsSameKind(S.Context, OrigMethod, OtherMethod,
18751
CSM))
18752
continue;
18753
18754
const Expr *OtherConstraints = OtherMethod->getTrailingRequiresClause();
18755
if (!OtherConstraints)
18756
continue;
18757
if (!Constraints) {
18758
AnotherMethodIsMoreConstrained = true;
18759
break;
18760
}
18761
if (S.IsAtLeastAsConstrained(OtherMethod, {OtherConstraints}, OrigMethod,
18762
{Constraints},
18763
AnotherMethodIsMoreConstrained)) {
18764
// There was an error with the constraints comparison. Exit the loop
18765
// and don't consider this function eligible.
18766
AnotherMethodIsMoreConstrained = true;
18767
}
18768
if (AnotherMethodIsMoreConstrained)
18769
break;
18770
}
18771
// FIXME: Do not consider deleted methods as eligible after implementing
18772
// DR1734 and DR1496.
18773
if (!AnotherMethodIsMoreConstrained) {
18774
Method->setIneligibleOrNotSelected(false);
18775
Record->addedEligibleSpecialMemberFunction(Method,
18776
1 << llvm::to_underlying(CSM));
18777
}
18778
}
18779
}
18780
18781
static void ComputeSpecialMemberFunctionsEligiblity(Sema &S,
18782
CXXRecordDecl *Record) {
18783
SmallVector<CXXMethodDecl *, 4> DefaultConstructors;
18784
SmallVector<CXXMethodDecl *, 4> CopyConstructors;
18785
SmallVector<CXXMethodDecl *, 4> MoveConstructors;
18786
SmallVector<CXXMethodDecl *, 4> CopyAssignmentOperators;
18787
SmallVector<CXXMethodDecl *, 4> MoveAssignmentOperators;
18788
18789
for (auto *Decl : Record->decls()) {
18790
auto *MD = dyn_cast<CXXMethodDecl>(Decl);
18791
if (!MD) {
18792
auto *FTD = dyn_cast<FunctionTemplateDecl>(Decl);
18793
if (FTD)
18794
MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
18795
}
18796
if (!MD)
18797
continue;
18798
if (auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
18799
if (CD->isInvalidDecl())
18800
continue;
18801
if (CD->isDefaultConstructor())
18802
DefaultConstructors.push_back(MD);
18803
else if (CD->isCopyConstructor())
18804
CopyConstructors.push_back(MD);
18805
else if (CD->isMoveConstructor())
18806
MoveConstructors.push_back(MD);
18807
} else if (MD->isCopyAssignmentOperator()) {
18808
CopyAssignmentOperators.push_back(MD);
18809
} else if (MD->isMoveAssignmentOperator()) {
18810
MoveAssignmentOperators.push_back(MD);
18811
}
18812
}
18813
18814
SetEligibleMethods(S, Record, DefaultConstructors,
18815
CXXSpecialMemberKind::DefaultConstructor);
18816
SetEligibleMethods(S, Record, CopyConstructors,
18817
CXXSpecialMemberKind::CopyConstructor);
18818
SetEligibleMethods(S, Record, MoveConstructors,
18819
CXXSpecialMemberKind::MoveConstructor);
18820
SetEligibleMethods(S, Record, CopyAssignmentOperators,
18821
CXXSpecialMemberKind::CopyAssignment);
18822
SetEligibleMethods(S, Record, MoveAssignmentOperators,
18823
CXXSpecialMemberKind::MoveAssignment);
18824
}
18825
18826
void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
18827
ArrayRef<Decl *> Fields, SourceLocation LBrac,
18828
SourceLocation RBrac,
18829
const ParsedAttributesView &Attrs) {
18830
assert(EnclosingDecl && "missing record or interface decl");
18831
18832
// If this is an Objective-C @implementation or category and we have
18833
// new fields here we should reset the layout of the interface since
18834
// it will now change.
18835
if (!Fields.empty() && isa<ObjCContainerDecl>(EnclosingDecl)) {
18836
ObjCContainerDecl *DC = cast<ObjCContainerDecl>(EnclosingDecl);
18837
switch (DC->getKind()) {
18838
default: break;
18839
case Decl::ObjCCategory:
18840
Context.ResetObjCLayout(cast<ObjCCategoryDecl>(DC)->getClassInterface());
18841
break;
18842
case Decl::ObjCImplementation:
18843
Context.
18844
ResetObjCLayout(cast<ObjCImplementationDecl>(DC)->getClassInterface());
18845
break;
18846
}
18847
}
18848
18849
RecordDecl *Record = dyn_cast<RecordDecl>(EnclosingDecl);
18850
CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
18851
18852
// Start counting up the number of named members; make sure to include
18853
// members of anonymous structs and unions in the total.
18854
unsigned NumNamedMembers = 0;
18855
if (Record) {
18856
for (const auto *I : Record->decls()) {
18857
if (const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
18858
if (IFD->getDeclName())
18859
++NumNamedMembers;
18860
}
18861
}
18862
18863
// Verify that all the fields are okay.
18864
SmallVector<FieldDecl*, 32> RecFields;
18865
18866
for (ArrayRef<Decl *>::iterator i = Fields.begin(), end = Fields.end();
18867
i != end; ++i) {
18868
FieldDecl *FD = cast<FieldDecl>(*i);
18869
18870
// Get the type for the field.
18871
const Type *FDTy = FD->getType().getTypePtr();
18872
18873
if (!FD->isAnonymousStructOrUnion()) {
18874
// Remember all fields written by the user.
18875
RecFields.push_back(FD);
18876
}
18877
18878
// If the field is already invalid for some reason, don't emit more
18879
// diagnostics about it.
18880
if (FD->isInvalidDecl()) {
18881
EnclosingDecl->setInvalidDecl();
18882
continue;
18883
}
18884
18885
// C99 6.7.2.1p2:
18886
// A structure or union shall not contain a member with
18887
// incomplete or function type (hence, a structure shall not
18888
// contain an instance of itself, but may contain a pointer to
18889
// an instance of itself), except that the last member of a
18890
// structure with more than one named member may have incomplete
18891
// array type; such a structure (and any union containing,
18892
// possibly recursively, a member that is such a structure)
18893
// shall not be a member of a structure or an element of an
18894
// array.
18895
bool IsLastField = (i + 1 == Fields.end());
18896
if (FDTy->isFunctionType()) {
18897
// Field declared as a function.
18898
Diag(FD->getLocation(), diag::err_field_declared_as_function)
18899
<< FD->getDeclName();
18900
FD->setInvalidDecl();
18901
EnclosingDecl->setInvalidDecl();
18902
continue;
18903
} else if (FDTy->isIncompleteArrayType() &&
18904
(Record || isa<ObjCContainerDecl>(EnclosingDecl))) {
18905
if (Record) {
18906
// Flexible array member.
18907
// Microsoft and g++ is more permissive regarding flexible array.
18908
// It will accept flexible array in union and also
18909
// as the sole element of a struct/class.
18910
unsigned DiagID = 0;
18911
if (!Record->isUnion() && !IsLastField) {
18912
Diag(FD->getLocation(), diag::err_flexible_array_not_at_end)
18913
<< FD->getDeclName() << FD->getType()
18914
<< llvm::to_underlying(Record->getTagKind());
18915
Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
18916
FD->setInvalidDecl();
18917
EnclosingDecl->setInvalidDecl();
18918
continue;
18919
} else if (Record->isUnion())
18920
DiagID = getLangOpts().MicrosoftExt
18921
? diag::ext_flexible_array_union_ms
18922
: diag::ext_flexible_array_union_gnu;
18923
else if (NumNamedMembers < 1)
18924
DiagID = getLangOpts().MicrosoftExt
18925
? diag::ext_flexible_array_empty_aggregate_ms
18926
: diag::ext_flexible_array_empty_aggregate_gnu;
18927
18928
if (DiagID)
18929
Diag(FD->getLocation(), DiagID)
18930
<< FD->getDeclName() << llvm::to_underlying(Record->getTagKind());
18931
// While the layout of types that contain virtual bases is not specified
18932
// by the C++ standard, both the Itanium and Microsoft C++ ABIs place
18933
// virtual bases after the derived members. This would make a flexible
18934
// array member declared at the end of an object not adjacent to the end
18935
// of the type.
18936
if (CXXRecord && CXXRecord->getNumVBases() != 0)
18937
Diag(FD->getLocation(), diag::err_flexible_array_virtual_base)
18938
<< FD->getDeclName() << llvm::to_underlying(Record->getTagKind());
18939
if (!getLangOpts().C99)
18940
Diag(FD->getLocation(), diag::ext_c99_flexible_array_member)
18941
<< FD->getDeclName() << llvm::to_underlying(Record->getTagKind());
18942
18943
// If the element type has a non-trivial destructor, we would not
18944
// implicitly destroy the elements, so disallow it for now.
18945
//
18946
// FIXME: GCC allows this. We should probably either implicitly delete
18947
// the destructor of the containing class, or just allow this.
18948
QualType BaseElem = Context.getBaseElementType(FD->getType());
18949
if (!BaseElem->isDependentType() && BaseElem.isDestructedType()) {
18950
Diag(FD->getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
18951
<< FD->getDeclName() << FD->getType();
18952
FD->setInvalidDecl();
18953
EnclosingDecl->setInvalidDecl();
18954
continue;
18955
}
18956
// Okay, we have a legal flexible array member at the end of the struct.
18957
Record->setHasFlexibleArrayMember(true);
18958
} else {
18959
// In ObjCContainerDecl ivars with incomplete array type are accepted,
18960
// unless they are followed by another ivar. That check is done
18961
// elsewhere, after synthesized ivars are known.
18962
}
18963
} else if (!FDTy->isDependentType() &&
18964
RequireCompleteSizedType(
18965
FD->getLocation(), FD->getType(),
18966
diag::err_field_incomplete_or_sizeless)) {
18967
// Incomplete type
18968
FD->setInvalidDecl();
18969
EnclosingDecl->setInvalidDecl();
18970
continue;
18971
} else if (const RecordType *FDTTy = FDTy->getAs<RecordType>()) {
18972
if (Record && FDTTy->getDecl()->hasFlexibleArrayMember()) {
18973
// A type which contains a flexible array member is considered to be a
18974
// flexible array member.
18975
Record->setHasFlexibleArrayMember(true);
18976
if (!Record->isUnion()) {
18977
// If this is a struct/class and this is not the last element, reject
18978
// it. Note that GCC supports variable sized arrays in the middle of
18979
// structures.
18980
if (!IsLastField)
18981
Diag(FD->getLocation(), diag::ext_variable_sized_type_in_struct)
18982
<< FD->getDeclName() << FD->getType();
18983
else {
18984
// We support flexible arrays at the end of structs in
18985
// other structs as an extension.
18986
Diag(FD->getLocation(), diag::ext_flexible_array_in_struct)
18987
<< FD->getDeclName();
18988
}
18989
}
18990
}
18991
if (isa<ObjCContainerDecl>(EnclosingDecl) &&
18992
RequireNonAbstractType(FD->getLocation(), FD->getType(),
18993
diag::err_abstract_type_in_decl,
18994
AbstractIvarType)) {
18995
// Ivars can not have abstract class types
18996
FD->setInvalidDecl();
18997
}
18998
if (Record && FDTTy->getDecl()->hasObjectMember())
18999
Record->setHasObjectMember(true);
19000
if (Record && FDTTy->getDecl()->hasVolatileMember())
19001
Record->setHasVolatileMember(true);
19002
} else if (FDTy->isObjCObjectType()) {
19003
/// A field cannot be an Objective-c object
19004
Diag(FD->getLocation(), diag::err_statically_allocated_object)
19005
<< FixItHint::CreateInsertion(FD->getLocation(), "*");
19006
QualType T = Context.getObjCObjectPointerType(FD->getType());
19007
FD->setType(T);
19008
} else if (Record && Record->isUnion() &&
19009
FD->getType().hasNonTrivialObjCLifetime() &&
19010
getSourceManager().isInSystemHeader(FD->getLocation()) &&
19011
!getLangOpts().CPlusPlus && !FD->hasAttr<UnavailableAttr>() &&
19012
(FD->getType().getObjCLifetime() != Qualifiers::OCL_Strong ||
19013
!Context.hasDirectOwnershipQualifier(FD->getType()))) {
19014
// For backward compatibility, fields of C unions declared in system
19015
// headers that have non-trivial ObjC ownership qualifications are marked
19016
// as unavailable unless the qualifier is explicit and __strong. This can
19017
// break ABI compatibility between programs compiled with ARC and MRR, but
19018
// is a better option than rejecting programs using those unions under
19019
// ARC.
19020
FD->addAttr(UnavailableAttr::CreateImplicit(
19021
Context, "", UnavailableAttr::IR_ARCFieldWithOwnership,
19022
FD->getLocation()));
19023
} else if (getLangOpts().ObjC &&
19024
getLangOpts().getGC() != LangOptions::NonGC && Record &&
19025
!Record->hasObjectMember()) {
19026
if (FD->getType()->isObjCObjectPointerType() ||
19027
FD->getType().isObjCGCStrong())
19028
Record->setHasObjectMember(true);
19029
else if (Context.getAsArrayType(FD->getType())) {
19030
QualType BaseType = Context.getBaseElementType(FD->getType());
19031
if (BaseType->isRecordType() &&
19032
BaseType->castAs<RecordType>()->getDecl()->hasObjectMember())
19033
Record->setHasObjectMember(true);
19034
else if (BaseType->isObjCObjectPointerType() ||
19035
BaseType.isObjCGCStrong())
19036
Record->setHasObjectMember(true);
19037
}
19038
}
19039
19040
if (Record && !getLangOpts().CPlusPlus &&
19041
!shouldIgnoreForRecordTriviality(FD)) {
19042
QualType FT = FD->getType();
19043
if (FT.isNonTrivialToPrimitiveDefaultInitialize()) {
19044
Record->setNonTrivialToPrimitiveDefaultInitialize(true);
19045
if (FT.hasNonTrivialToPrimitiveDefaultInitializeCUnion() ||
19046
Record->isUnion())
19047
Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(true);
19048
}
19049
QualType::PrimitiveCopyKind PCK = FT.isNonTrivialToPrimitiveCopy();
19050
if (PCK != QualType::PCK_Trivial && PCK != QualType::PCK_VolatileTrivial) {
19051
Record->setNonTrivialToPrimitiveCopy(true);
19052
if (FT.hasNonTrivialToPrimitiveCopyCUnion() || Record->isUnion())
19053
Record->setHasNonTrivialToPrimitiveCopyCUnion(true);
19054
}
19055
if (FT.isDestructedType()) {
19056
Record->setNonTrivialToPrimitiveDestroy(true);
19057
Record->setParamDestroyedInCallee(true);
19058
if (FT.hasNonTrivialToPrimitiveDestructCUnion() || Record->isUnion())
19059
Record->setHasNonTrivialToPrimitiveDestructCUnion(true);
19060
}
19061
19062
if (const auto *RT = FT->getAs<RecordType>()) {
19063
if (RT->getDecl()->getArgPassingRestrictions() ==
19064
RecordArgPassingKind::CanNeverPassInRegs)
19065
Record->setArgPassingRestrictions(
19066
RecordArgPassingKind::CanNeverPassInRegs);
19067
} else if (FT.getQualifiers().getObjCLifetime() == Qualifiers::OCL_Weak)
19068
Record->setArgPassingRestrictions(
19069
RecordArgPassingKind::CanNeverPassInRegs);
19070
}
19071
19072
if (Record && FD->getType().isVolatileQualified())
19073
Record->setHasVolatileMember(true);
19074
// Keep track of the number of named members.
19075
if (FD->getIdentifier())
19076
++NumNamedMembers;
19077
}
19078
19079
// Okay, we successfully defined 'Record'.
19080
if (Record) {
19081
bool Completed = false;
19082
if (S) {
19083
Scope *Parent = S->getParent();
19084
if (Parent && Parent->isTypeAliasScope() &&
19085
Parent->isTemplateParamScope())
19086
Record->setInvalidDecl();
19087
}
19088
19089
if (CXXRecord) {
19090
if (!CXXRecord->isInvalidDecl()) {
19091
// Set access bits correctly on the directly-declared conversions.
19092
for (CXXRecordDecl::conversion_iterator
19093
I = CXXRecord->conversion_begin(),
19094
E = CXXRecord->conversion_end(); I != E; ++I)
19095
I.setAccess((*I)->getAccess());
19096
}
19097
19098
// Add any implicitly-declared members to this class.
19099
AddImplicitlyDeclaredMembersToClass(CXXRecord);
19100
19101
if (!CXXRecord->isDependentType()) {
19102
if (!CXXRecord->isInvalidDecl()) {
19103
// If we have virtual base classes, we may end up finding multiple
19104
// final overriders for a given virtual function. Check for this
19105
// problem now.
19106
if (CXXRecord->getNumVBases()) {
19107
CXXFinalOverriderMap FinalOverriders;
19108
CXXRecord->getFinalOverriders(FinalOverriders);
19109
19110
for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
19111
MEnd = FinalOverriders.end();
19112
M != MEnd; ++M) {
19113
for (OverridingMethods::iterator SO = M->second.begin(),
19114
SOEnd = M->second.end();
19115
SO != SOEnd; ++SO) {
19116
assert(SO->second.size() > 0 &&
19117
"Virtual function without overriding functions?");
19118
if (SO->second.size() == 1)
19119
continue;
19120
19121
// C++ [class.virtual]p2:
19122
// In a derived class, if a virtual member function of a base
19123
// class subobject has more than one final overrider the
19124
// program is ill-formed.
19125
Diag(Record->getLocation(), diag::err_multiple_final_overriders)
19126
<< (const NamedDecl *)M->first << Record;
19127
Diag(M->first->getLocation(),
19128
diag::note_overridden_virtual_function);
19129
for (OverridingMethods::overriding_iterator
19130
OM = SO->second.begin(),
19131
OMEnd = SO->second.end();
19132
OM != OMEnd; ++OM)
19133
Diag(OM->Method->getLocation(), diag::note_final_overrider)
19134
<< (const NamedDecl *)M->first << OM->Method->getParent();
19135
19136
Record->setInvalidDecl();
19137
}
19138
}
19139
CXXRecord->completeDefinition(&FinalOverriders);
19140
Completed = true;
19141
}
19142
}
19143
ComputeSelectedDestructor(*this, CXXRecord);
19144
ComputeSpecialMemberFunctionsEligiblity(*this, CXXRecord);
19145
}
19146
}
19147
19148
if (!Completed)
19149
Record->completeDefinition();
19150
19151
// Handle attributes before checking the layout.
19152
ProcessDeclAttributeList(S, Record, Attrs);
19153
19154
// Check to see if a FieldDecl is a pointer to a function.
19155
auto IsFunctionPointerOrForwardDecl = [&](const Decl *D) {
19156
const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19157
if (!FD) {
19158
// Check whether this is a forward declaration that was inserted by
19159
// Clang. This happens when a non-forward declared / defined type is
19160
// used, e.g.:
19161
//
19162
// struct foo {
19163
// struct bar *(*f)();
19164
// struct bar *(*g)();
19165
// };
19166
//
19167
// "struct bar" shows up in the decl AST as a "RecordDecl" with an
19168
// incomplete definition.
19169
if (const auto *TD = dyn_cast<TagDecl>(D))
19170
return !TD->isCompleteDefinition();
19171
return false;
19172
}
19173
QualType FieldType = FD->getType().getDesugaredType(Context);
19174
if (isa<PointerType>(FieldType)) {
19175
QualType PointeeType = cast<PointerType>(FieldType)->getPointeeType();
19176
return PointeeType.getDesugaredType(Context)->isFunctionType();
19177
}
19178
return false;
19179
};
19180
19181
// Maybe randomize the record's decls. We automatically randomize a record
19182
// of function pointers, unless it has the "no_randomize_layout" attribute.
19183
if (!getLangOpts().CPlusPlus &&
19184
(Record->hasAttr<RandomizeLayoutAttr>() ||
19185
(!Record->hasAttr<NoRandomizeLayoutAttr>() &&
19186
llvm::all_of(Record->decls(), IsFunctionPointerOrForwardDecl))) &&
19187
!Record->isUnion() && !getLangOpts().RandstructSeed.empty() &&
19188
!Record->isRandomized()) {
19189
SmallVector<Decl *, 32> NewDeclOrdering;
19190
if (randstruct::randomizeStructureLayout(Context, Record,
19191
NewDeclOrdering))
19192
Record->reorderDecls(NewDeclOrdering);
19193
}
19194
19195
// We may have deferred checking for a deleted destructor. Check now.
19196
if (CXXRecord) {
19197
auto *Dtor = CXXRecord->getDestructor();
19198
if (Dtor && Dtor->isImplicit() &&
19199
ShouldDeleteSpecialMember(Dtor, CXXSpecialMemberKind::Destructor)) {
19200
CXXRecord->setImplicitDestructorIsDeleted();
19201
SetDeclDeleted(Dtor, CXXRecord->getLocation());
19202
}
19203
}
19204
19205
if (Record->hasAttrs()) {
19206
CheckAlignasUnderalignment(Record);
19207
19208
if (const MSInheritanceAttr *IA = Record->getAttr<MSInheritanceAttr>())
19209
checkMSInheritanceAttrOnDefinition(cast<CXXRecordDecl>(Record),
19210
IA->getRange(), IA->getBestCase(),
19211
IA->getInheritanceModel());
19212
}
19213
19214
// Check if the structure/union declaration is a type that can have zero
19215
// size in C. For C this is a language extension, for C++ it may cause
19216
// compatibility problems.
19217
bool CheckForZeroSize;
19218
if (!getLangOpts().CPlusPlus) {
19219
CheckForZeroSize = true;
19220
} else {
19221
// For C++ filter out types that cannot be referenced in C code.
19222
CXXRecordDecl *CXXRecord = cast<CXXRecordDecl>(Record);
19223
CheckForZeroSize =
19224
CXXRecord->getLexicalDeclContext()->isExternCContext() &&
19225
!CXXRecord->isDependentType() && !inTemplateInstantiation() &&
19226
CXXRecord->isCLike();
19227
}
19228
if (CheckForZeroSize) {
19229
bool ZeroSize = true;
19230
bool IsEmpty = true;
19231
unsigned NonBitFields = 0;
19232
for (RecordDecl::field_iterator I = Record->field_begin(),
19233
E = Record->field_end();
19234
(NonBitFields == 0 || ZeroSize) && I != E; ++I) {
19235
IsEmpty = false;
19236
if (I->isUnnamedBitField()) {
19237
if (!I->isZeroLengthBitField(Context))
19238
ZeroSize = false;
19239
} else {
19240
++NonBitFields;
19241
QualType FieldType = I->getType();
19242
if (FieldType->isIncompleteType() ||
19243
!Context.getTypeSizeInChars(FieldType).isZero())
19244
ZeroSize = false;
19245
}
19246
}
19247
19248
// Empty structs are an extension in C (C99 6.7.2.1p7). They are
19249
// allowed in C++, but warn if its declaration is inside
19250
// extern "C" block.
19251
if (ZeroSize) {
19252
Diag(RecLoc, getLangOpts().CPlusPlus ?
19253
diag::warn_zero_size_struct_union_in_extern_c :
19254
diag::warn_zero_size_struct_union_compat)
19255
<< IsEmpty << Record->isUnion() << (NonBitFields > 1);
19256
}
19257
19258
// Structs without named members are extension in C (C99 6.7.2.1p7),
19259
// but are accepted by GCC.
19260
if (NonBitFields == 0 && !getLangOpts().CPlusPlus) {
19261
Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union :
19262
diag::ext_no_named_members_in_struct_union)
19263
<< Record->isUnion();
19264
}
19265
}
19266
} else {
19267
ObjCIvarDecl **ClsFields =
19268
reinterpret_cast<ObjCIvarDecl**>(RecFields.data());
19269
if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(EnclosingDecl)) {
19270
ID->setEndOfDefinitionLoc(RBrac);
19271
// Add ivar's to class's DeclContext.
19272
for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
19273
ClsFields[i]->setLexicalDeclContext(ID);
19274
ID->addDecl(ClsFields[i]);
19275
}
19276
// Must enforce the rule that ivars in the base classes may not be
19277
// duplicates.
19278
if (ID->getSuperClass())
19279
ObjC().DiagnoseDuplicateIvars(ID, ID->getSuperClass());
19280
} else if (ObjCImplementationDecl *IMPDecl =
19281
dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
19282
assert(IMPDecl && "ActOnFields - missing ObjCImplementationDecl");
19283
for (unsigned I = 0, N = RecFields.size(); I != N; ++I)
19284
// Ivar declared in @implementation never belongs to the implementation.
19285
// Only it is in implementation's lexical context.
19286
ClsFields[I]->setLexicalDeclContext(IMPDecl);
19287
ObjC().CheckImplementationIvars(IMPDecl, ClsFields, RecFields.size(),
19288
RBrac);
19289
IMPDecl->setIvarLBraceLoc(LBrac);
19290
IMPDecl->setIvarRBraceLoc(RBrac);
19291
} else if (ObjCCategoryDecl *CDecl =
19292
dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
19293
// case of ivars in class extension; all other cases have been
19294
// reported as errors elsewhere.
19295
// FIXME. Class extension does not have a LocEnd field.
19296
// CDecl->setLocEnd(RBrac);
19297
// Add ivar's to class extension's DeclContext.
19298
// Diagnose redeclaration of private ivars.
19299
ObjCInterfaceDecl *IDecl = CDecl->getClassInterface();
19300
for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
19301
if (IDecl) {
19302
if (const ObjCIvarDecl *ClsIvar =
19303
IDecl->getIvarDecl(ClsFields[i]->getIdentifier())) {
19304
Diag(ClsFields[i]->getLocation(),
19305
diag::err_duplicate_ivar_declaration);
19306
Diag(ClsIvar->getLocation(), diag::note_previous_definition);
19307
continue;
19308
}
19309
for (const auto *Ext : IDecl->known_extensions()) {
19310
if (const ObjCIvarDecl *ClsExtIvar
19311
= Ext->getIvarDecl(ClsFields[i]->getIdentifier())) {
19312
Diag(ClsFields[i]->getLocation(),
19313
diag::err_duplicate_ivar_declaration);
19314
Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
19315
continue;
19316
}
19317
}
19318
}
19319
ClsFields[i]->setLexicalDeclContext(CDecl);
19320
CDecl->addDecl(ClsFields[i]);
19321
}
19322
CDecl->setIvarLBraceLoc(LBrac);
19323
CDecl->setIvarRBraceLoc(RBrac);
19324
}
19325
}
19326
ProcessAPINotes(Record);
19327
}
19328
19329
/// Determine whether the given integral value is representable within
19330
/// the given type T.
19331
static bool isRepresentableIntegerValue(ASTContext &Context,
19332
llvm::APSInt &Value,
19333
QualType T) {
19334
assert((T->isIntegralType(Context) || T->isEnumeralType()) &&
19335
"Integral type required!");
19336
unsigned BitWidth = Context.getIntWidth(T);
19337
19338
if (Value.isUnsigned() || Value.isNonNegative()) {
19339
if (T->isSignedIntegerOrEnumerationType())
19340
--BitWidth;
19341
return Value.getActiveBits() <= BitWidth;
19342
}
19343
return Value.getSignificantBits() <= BitWidth;
19344
}
19345
19346
// Given an integral type, return the next larger integral type
19347
// (or a NULL type of no such type exists).
19348
static QualType getNextLargerIntegralType(ASTContext &Context, QualType T) {
19349
// FIXME: Int128/UInt128 support, which also needs to be introduced into
19350
// enum checking below.
19351
assert((T->isIntegralType(Context) ||
19352
T->isEnumeralType()) && "Integral type required!");
19353
const unsigned NumTypes = 4;
19354
QualType SignedIntegralTypes[NumTypes] = {
19355
Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
19356
};
19357
QualType UnsignedIntegralTypes[NumTypes] = {
19358
Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
19359
Context.UnsignedLongLongTy
19360
};
19361
19362
unsigned BitWidth = Context.getTypeSize(T);
19363
QualType *Types = T->isSignedIntegerOrEnumerationType()? SignedIntegralTypes
19364
: UnsignedIntegralTypes;
19365
for (unsigned I = 0; I != NumTypes; ++I)
19366
if (Context.getTypeSize(Types[I]) > BitWidth)
19367
return Types[I];
19368
19369
return QualType();
19370
}
19371
19372
EnumConstantDecl *Sema::CheckEnumConstant(EnumDecl *Enum,
19373
EnumConstantDecl *LastEnumConst,
19374
SourceLocation IdLoc,
19375
IdentifierInfo *Id,
19376
Expr *Val) {
19377
unsigned IntWidth = Context.getTargetInfo().getIntWidth();
19378
llvm::APSInt EnumVal(IntWidth);
19379
QualType EltTy;
19380
19381
if (Val && DiagnoseUnexpandedParameterPack(Val, UPPC_EnumeratorValue))
19382
Val = nullptr;
19383
19384
if (Val)
19385
Val = DefaultLvalueConversion(Val).get();
19386
19387
if (Val) {
19388
if (Enum->isDependentType() || Val->isTypeDependent() ||
19389
Val->containsErrors())
19390
EltTy = Context.DependentTy;
19391
else {
19392
// FIXME: We don't allow folding in C++11 mode for an enum with a fixed
19393
// underlying type, but do allow it in all other contexts.
19394
if (getLangOpts().CPlusPlus11 && Enum->isFixed()) {
19395
// C++11 [dcl.enum]p5: If the underlying type is fixed, [...] the
19396
// constant-expression in the enumerator-definition shall be a converted
19397
// constant expression of the underlying type.
19398
EltTy = Enum->getIntegerType();
19399
ExprResult Converted =
19400
CheckConvertedConstantExpression(Val, EltTy, EnumVal,
19401
CCEK_Enumerator);
19402
if (Converted.isInvalid())
19403
Val = nullptr;
19404
else
19405
Val = Converted.get();
19406
} else if (!Val->isValueDependent() &&
19407
!(Val =
19408
VerifyIntegerConstantExpression(Val, &EnumVal, AllowFold)
19409
.get())) {
19410
// C99 6.7.2.2p2: Make sure we have an integer constant expression.
19411
} else {
19412
if (Enum->isComplete()) {
19413
EltTy = Enum->getIntegerType();
19414
19415
// In Obj-C and Microsoft mode, require the enumeration value to be
19416
// representable in the underlying type of the enumeration. In C++11,
19417
// we perform a non-narrowing conversion as part of converted constant
19418
// expression checking.
19419
if (!isRepresentableIntegerValue(Context, EnumVal, EltTy)) {
19420
if (Context.getTargetInfo()
19421
.getTriple()
19422
.isWindowsMSVCEnvironment()) {
19423
Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
19424
} else {
19425
Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
19426
}
19427
}
19428
19429
// Cast to the underlying type.
19430
Val = ImpCastExprToType(Val, EltTy,
19431
EltTy->isBooleanType() ? CK_IntegralToBoolean
19432
: CK_IntegralCast)
19433
.get();
19434
} else if (getLangOpts().CPlusPlus) {
19435
// C++11 [dcl.enum]p5:
19436
// If the underlying type is not fixed, the type of each enumerator
19437
// is the type of its initializing value:
19438
// - If an initializer is specified for an enumerator, the
19439
// initializing value has the same type as the expression.
19440
EltTy = Val->getType();
19441
} else {
19442
// C99 6.7.2.2p2:
19443
// The expression that defines the value of an enumeration constant
19444
// shall be an integer constant expression that has a value
19445
// representable as an int.
19446
19447
// Complain if the value is not representable in an int.
19448
if (!isRepresentableIntegerValue(Context, EnumVal, Context.IntTy))
19449
Diag(IdLoc, diag::ext_enum_value_not_int)
19450
<< toString(EnumVal, 10) << Val->getSourceRange()
19451
<< (EnumVal.isUnsigned() || EnumVal.isNonNegative());
19452
else if (!Context.hasSameType(Val->getType(), Context.IntTy)) {
19453
// Force the type of the expression to 'int'.
19454
Val = ImpCastExprToType(Val, Context.IntTy, CK_IntegralCast).get();
19455
}
19456
EltTy = Val->getType();
19457
}
19458
}
19459
}
19460
}
19461
19462
if (!Val) {
19463
if (Enum->isDependentType())
19464
EltTy = Context.DependentTy;
19465
else if (!LastEnumConst) {
19466
// C++0x [dcl.enum]p5:
19467
// If the underlying type is not fixed, the type of each enumerator
19468
// is the type of its initializing value:
19469
// - If no initializer is specified for the first enumerator, the
19470
// initializing value has an unspecified integral type.
19471
//
19472
// GCC uses 'int' for its unspecified integral type, as does
19473
// C99 6.7.2.2p3.
19474
if (Enum->isFixed()) {
19475
EltTy = Enum->getIntegerType();
19476
}
19477
else {
19478
EltTy = Context.IntTy;
19479
}
19480
} else {
19481
// Assign the last value + 1.
19482
EnumVal = LastEnumConst->getInitVal();
19483
++EnumVal;
19484
EltTy = LastEnumConst->getType();
19485
19486
// Check for overflow on increment.
19487
if (EnumVal < LastEnumConst->getInitVal()) {
19488
// C++0x [dcl.enum]p5:
19489
// If the underlying type is not fixed, the type of each enumerator
19490
// is the type of its initializing value:
19491
//
19492
// - Otherwise the type of the initializing value is the same as
19493
// the type of the initializing value of the preceding enumerator
19494
// unless the incremented value is not representable in that type,
19495
// in which case the type is an unspecified integral type
19496
// sufficient to contain the incremented value. If no such type
19497
// exists, the program is ill-formed.
19498
QualType T = getNextLargerIntegralType(Context, EltTy);
19499
if (T.isNull() || Enum->isFixed()) {
19500
// There is no integral type larger enough to represent this
19501
// value. Complain, then allow the value to wrap around.
19502
EnumVal = LastEnumConst->getInitVal();
19503
EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
19504
++EnumVal;
19505
if (Enum->isFixed())
19506
// When the underlying type is fixed, this is ill-formed.
19507
Diag(IdLoc, diag::err_enumerator_wrapped)
19508
<< toString(EnumVal, 10)
19509
<< EltTy;
19510
else
19511
Diag(IdLoc, diag::ext_enumerator_increment_too_large)
19512
<< toString(EnumVal, 10);
19513
} else {
19514
EltTy = T;
19515
}
19516
19517
// Retrieve the last enumerator's value, extent that type to the
19518
// type that is supposed to be large enough to represent the incremented
19519
// value, then increment.
19520
EnumVal = LastEnumConst->getInitVal();
19521
EnumVal.setIsSigned(EltTy->isSignedIntegerOrEnumerationType());
19522
EnumVal = EnumVal.zextOrTrunc(Context.getIntWidth(EltTy));
19523
++EnumVal;
19524
19525
// If we're not in C++, diagnose the overflow of enumerator values,
19526
// which in C99 means that the enumerator value is not representable in
19527
// an int (C99 6.7.2.2p2). However, we support GCC's extension that
19528
// permits enumerator values that are representable in some larger
19529
// integral type.
19530
if (!getLangOpts().CPlusPlus && !T.isNull())
19531
Diag(IdLoc, diag::warn_enum_value_overflow);
19532
} else if (!getLangOpts().CPlusPlus &&
19533
!EltTy->isDependentType() &&
19534
!isRepresentableIntegerValue(Context, EnumVal, EltTy)) {
19535
// Enforce C99 6.7.2.2p2 even when we compute the next value.
19536
Diag(IdLoc, diag::ext_enum_value_not_int)
19537
<< toString(EnumVal, 10) << 1;
19538
}
19539
}
19540
}
19541
19542
if (!EltTy->isDependentType()) {
19543
// Make the enumerator value match the signedness and size of the
19544
// enumerator's type.
19545
EnumVal = EnumVal.extOrTrunc(Context.getIntWidth(EltTy));
19546
EnumVal.setIsSigned(EltTy->isSignedIntegerOrEnumerationType());
19547
}
19548
19549
return EnumConstantDecl::Create(Context, Enum, IdLoc, Id, EltTy,
19550
Val, EnumVal);
19551
}
19552
19553
SkipBodyInfo Sema::shouldSkipAnonEnumBody(Scope *S, IdentifierInfo *II,
19554
SourceLocation IILoc) {
19555
if (!(getLangOpts().Modules || getLangOpts().ModulesLocalVisibility) ||
19556
!getLangOpts().CPlusPlus)
19557
return SkipBodyInfo();
19558
19559
// We have an anonymous enum definition. Look up the first enumerator to
19560
// determine if we should merge the definition with an existing one and
19561
// skip the body.
19562
NamedDecl *PrevDecl = LookupSingleName(S, II, IILoc, LookupOrdinaryName,
19563
forRedeclarationInCurContext());
19564
auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
19565
if (!PrevECD)
19566
return SkipBodyInfo();
19567
19568
EnumDecl *PrevED = cast<EnumDecl>(PrevECD->getDeclContext());
19569
NamedDecl *Hidden;
19570
if (!PrevED->getDeclName() && !hasVisibleDefinition(PrevED, &Hidden)) {
19571
SkipBodyInfo Skip;
19572
Skip.Previous = Hidden;
19573
return Skip;
19574
}
19575
19576
return SkipBodyInfo();
19577
}
19578
19579
Decl *Sema::ActOnEnumConstant(Scope *S, Decl *theEnumDecl, Decl *lastEnumConst,
19580
SourceLocation IdLoc, IdentifierInfo *Id,
19581
const ParsedAttributesView &Attrs,
19582
SourceLocation EqualLoc, Expr *Val) {
19583
EnumDecl *TheEnumDecl = cast<EnumDecl>(theEnumDecl);
19584
EnumConstantDecl *LastEnumConst =
19585
cast_or_null<EnumConstantDecl>(lastEnumConst);
19586
19587
// The scope passed in may not be a decl scope. Zip up the scope tree until
19588
// we find one that is.
19589
S = getNonFieldDeclScope(S);
19590
19591
// Verify that there isn't already something declared with this name in this
19592
// scope.
19593
LookupResult R(*this, Id, IdLoc, LookupOrdinaryName,
19594
RedeclarationKind::ForVisibleRedeclaration);
19595
LookupName(R, S);
19596
NamedDecl *PrevDecl = R.getAsSingle<NamedDecl>();
19597
19598
if (PrevDecl && PrevDecl->isTemplateParameter()) {
19599
// Maybe we will complain about the shadowed template parameter.
19600
DiagnoseTemplateParameterShadow(IdLoc, PrevDecl);
19601
// Just pretend that we didn't see the previous declaration.
19602
PrevDecl = nullptr;
19603
}
19604
19605
// C++ [class.mem]p15:
19606
// If T is the name of a class, then each of the following shall have a name
19607
// different from T:
19608
// - every enumerator of every member of class T that is an unscoped
19609
// enumerated type
19610
if (getLangOpts().CPlusPlus && !TheEnumDecl->isScoped())
19611
DiagnoseClassNameShadow(TheEnumDecl->getDeclContext(),
19612
DeclarationNameInfo(Id, IdLoc));
19613
19614
EnumConstantDecl *New =
19615
CheckEnumConstant(TheEnumDecl, LastEnumConst, IdLoc, Id, Val);
19616
if (!New)
19617
return nullptr;
19618
19619
if (PrevDecl) {
19620
if (!TheEnumDecl->isScoped() && isa<ValueDecl>(PrevDecl)) {
19621
// Check for other kinds of shadowing not already handled.
19622
CheckShadow(New, PrevDecl, R);
19623
}
19624
19625
// When in C++, we may get a TagDecl with the same name; in this case the
19626
// enum constant will 'hide' the tag.
19627
assert((getLangOpts().CPlusPlus || !isa<TagDecl>(PrevDecl)) &&
19628
"Received TagDecl when not in C++!");
19629
if (!isa<TagDecl>(PrevDecl) && isDeclInScope(PrevDecl, CurContext, S)) {
19630
if (isa<EnumConstantDecl>(PrevDecl))
19631
Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
19632
else
19633
Diag(IdLoc, diag::err_redefinition) << Id;
19634
notePreviousDefinition(PrevDecl, IdLoc);
19635
return nullptr;
19636
}
19637
}
19638
19639
// Process attributes.
19640
ProcessDeclAttributeList(S, New, Attrs);
19641
AddPragmaAttributes(S, New);
19642
ProcessAPINotes(New);
19643
19644
// Register this decl in the current scope stack.
19645
New->setAccess(TheEnumDecl->getAccess());
19646
PushOnScopeChains(New, S);
19647
19648
ActOnDocumentableDecl(New);
19649
19650
return New;
19651
}
19652
19653
// Returns true when the enum initial expression does not trigger the
19654
// duplicate enum warning. A few common cases are exempted as follows:
19655
// Element2 = Element1
19656
// Element2 = Element1 + 1
19657
// Element2 = Element1 - 1
19658
// Where Element2 and Element1 are from the same enum.
19659
static bool ValidDuplicateEnum(EnumConstantDecl *ECD, EnumDecl *Enum) {
19660
Expr *InitExpr = ECD->getInitExpr();
19661
if (!InitExpr)
19662
return true;
19663
InitExpr = InitExpr->IgnoreImpCasts();
19664
19665
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(InitExpr)) {
19666
if (!BO->isAdditiveOp())
19667
return true;
19668
IntegerLiteral *IL = dyn_cast<IntegerLiteral>(BO->getRHS());
19669
if (!IL)
19670
return true;
19671
if (IL->getValue() != 1)
19672
return true;
19673
19674
InitExpr = BO->getLHS();
19675
}
19676
19677
// This checks if the elements are from the same enum.
19678
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
19679
if (!DRE)
19680
return true;
19681
19682
EnumConstantDecl *EnumConstant = dyn_cast<EnumConstantDecl>(DRE->getDecl());
19683
if (!EnumConstant)
19684
return true;
19685
19686
if (cast<EnumDecl>(TagDecl::castFromDeclContext(ECD->getDeclContext())) !=
19687
Enum)
19688
return true;
19689
19690
return false;
19691
}
19692
19693
// Emits a warning when an element is implicitly set a value that
19694
// a previous element has already been set to.
19695
static void CheckForDuplicateEnumValues(Sema &S, ArrayRef<Decl *> Elements,
19696
EnumDecl *Enum, QualType EnumType) {
19697
// Avoid anonymous enums
19698
if (!Enum->getIdentifier())
19699
return;
19700
19701
// Only check for small enums.
19702
if (Enum->getNumPositiveBits() > 63 || Enum->getNumNegativeBits() > 64)
19703
return;
19704
19705
if (S.Diags.isIgnored(diag::warn_duplicate_enum_values, Enum->getLocation()))
19706
return;
19707
19708
typedef SmallVector<EnumConstantDecl *, 3> ECDVector;
19709
typedef SmallVector<std::unique_ptr<ECDVector>, 3> DuplicatesVector;
19710
19711
typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
19712
19713
// DenseMaps cannot contain the all ones int64_t value, so use unordered_map.
19714
typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
19715
19716
// Use int64_t as a key to avoid needing special handling for map keys.
19717
auto EnumConstantToKey = [](const EnumConstantDecl *D) {
19718
llvm::APSInt Val = D->getInitVal();
19719
return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
19720
};
19721
19722
DuplicatesVector DupVector;
19723
ValueToVectorMap EnumMap;
19724
19725
// Populate the EnumMap with all values represented by enum constants without
19726
// an initializer.
19727
for (auto *Element : Elements) {
19728
EnumConstantDecl *ECD = cast_or_null<EnumConstantDecl>(Element);
19729
19730
// Null EnumConstantDecl means a previous diagnostic has been emitted for
19731
// this constant. Skip this enum since it may be ill-formed.
19732
if (!ECD) {
19733
return;
19734
}
19735
19736
// Constants with initializers are handled in the next loop.
19737
if (ECD->getInitExpr())
19738
continue;
19739
19740
// Duplicate values are handled in the next loop.
19741
EnumMap.insert({EnumConstantToKey(ECD), ECD});
19742
}
19743
19744
if (EnumMap.size() == 0)
19745
return;
19746
19747
// Create vectors for any values that has duplicates.
19748
for (auto *Element : Elements) {
19749
// The last loop returned if any constant was null.
19750
EnumConstantDecl *ECD = cast<EnumConstantDecl>(Element);
19751
if (!ValidDuplicateEnum(ECD, Enum))
19752
continue;
19753
19754
auto Iter = EnumMap.find(EnumConstantToKey(ECD));
19755
if (Iter == EnumMap.end())
19756
continue;
19757
19758
DeclOrVector& Entry = Iter->second;
19759
if (EnumConstantDecl *D = Entry.dyn_cast<EnumConstantDecl*>()) {
19760
// Ensure constants are different.
19761
if (D == ECD)
19762
continue;
19763
19764
// Create new vector and push values onto it.
19765
auto Vec = std::make_unique<ECDVector>();
19766
Vec->push_back(D);
19767
Vec->push_back(ECD);
19768
19769
// Update entry to point to the duplicates vector.
19770
Entry = Vec.get();
19771
19772
// Store the vector somewhere we can consult later for quick emission of
19773
// diagnostics.
19774
DupVector.emplace_back(std::move(Vec));
19775
continue;
19776
}
19777
19778
ECDVector *Vec = Entry.get<ECDVector*>();
19779
// Make sure constants are not added more than once.
19780
if (*Vec->begin() == ECD)
19781
continue;
19782
19783
Vec->push_back(ECD);
19784
}
19785
19786
// Emit diagnostics.
19787
for (const auto &Vec : DupVector) {
19788
assert(Vec->size() > 1 && "ECDVector should have at least 2 elements.");
19789
19790
// Emit warning for one enum constant.
19791
auto *FirstECD = Vec->front();
19792
S.Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
19793
<< FirstECD << toString(FirstECD->getInitVal(), 10)
19794
<< FirstECD->getSourceRange();
19795
19796
// Emit one note for each of the remaining enum constants with
19797
// the same value.
19798
for (auto *ECD : llvm::drop_begin(*Vec))
19799
S.Diag(ECD->getLocation(), diag::note_duplicate_element)
19800
<< ECD << toString(ECD->getInitVal(), 10)
19801
<< ECD->getSourceRange();
19802
}
19803
}
19804
19805
bool Sema::IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
19806
bool AllowMask) const {
19807
assert(ED->isClosedFlag() && "looking for value in non-flag or open enum");
19808
assert(ED->isCompleteDefinition() && "expected enum definition");
19809
19810
auto R = FlagBitsCache.insert(std::make_pair(ED, llvm::APInt()));
19811
llvm::APInt &FlagBits = R.first->second;
19812
19813
if (R.second) {
19814
for (auto *E : ED->enumerators()) {
19815
const auto &EVal = E->getInitVal();
19816
// Only single-bit enumerators introduce new flag values.
19817
if (EVal.isPowerOf2())
19818
FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
19819
}
19820
}
19821
19822
// A value is in a flag enum if either its bits are a subset of the enum's
19823
// flag bits (the first condition) or we are allowing masks and the same is
19824
// true of its complement (the second condition). When masks are allowed, we
19825
// allow the common idiom of ~(enum1 | enum2) to be a valid enum value.
19826
//
19827
// While it's true that any value could be used as a mask, the assumption is
19828
// that a mask will have all of the insignificant bits set. Anything else is
19829
// likely a logic error.
19830
llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
19831
return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
19832
}
19833
19834
void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
19835
Decl *EnumDeclX, ArrayRef<Decl *> Elements, Scope *S,
19836
const ParsedAttributesView &Attrs) {
19837
EnumDecl *Enum = cast<EnumDecl>(EnumDeclX);
19838
QualType EnumType = Context.getTypeDeclType(Enum);
19839
19840
ProcessDeclAttributeList(S, Enum, Attrs);
19841
ProcessAPINotes(Enum);
19842
19843
if (Enum->isDependentType()) {
19844
for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
19845
EnumConstantDecl *ECD =
19846
cast_or_null<EnumConstantDecl>(Elements[i]);
19847
if (!ECD) continue;
19848
19849
ECD->setType(EnumType);
19850
}
19851
19852
Enum->completeDefinition(Context.DependentTy, Context.DependentTy, 0, 0);
19853
return;
19854
}
19855
19856
// TODO: If the result value doesn't fit in an int, it must be a long or long
19857
// long value. ISO C does not support this, but GCC does as an extension,
19858
// emit a warning.
19859
unsigned IntWidth = Context.getTargetInfo().getIntWidth();
19860
unsigned CharWidth = Context.getTargetInfo().getCharWidth();
19861
unsigned ShortWidth = Context.getTargetInfo().getShortWidth();
19862
19863
// Verify that all the values are okay, compute the size of the values, and
19864
// reverse the list.
19865
unsigned NumNegativeBits = 0;
19866
unsigned NumPositiveBits = 0;
19867
19868
for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
19869
EnumConstantDecl *ECD =
19870
cast_or_null<EnumConstantDecl>(Elements[i]);
19871
if (!ECD) continue; // Already issued a diagnostic.
19872
19873
const llvm::APSInt &InitVal = ECD->getInitVal();
19874
19875
// Keep track of the size of positive and negative values.
19876
if (InitVal.isUnsigned() || InitVal.isNonNegative()) {
19877
// If the enumerator is zero that should still be counted as a positive
19878
// bit since we need a bit to store the value zero.
19879
unsigned ActiveBits = InitVal.getActiveBits();
19880
NumPositiveBits = std::max({NumPositiveBits, ActiveBits, 1u});
19881
} else {
19882
NumNegativeBits =
19883
std::max(NumNegativeBits, (unsigned)InitVal.getSignificantBits());
19884
}
19885
}
19886
19887
// If we have an empty set of enumerators we still need one bit.
19888
// From [dcl.enum]p8
19889
// If the enumerator-list is empty, the values of the enumeration are as if
19890
// the enumeration had a single enumerator with value 0
19891
if (!NumPositiveBits && !NumNegativeBits)
19892
NumPositiveBits = 1;
19893
19894
// Figure out the type that should be used for this enum.
19895
QualType BestType;
19896
unsigned BestWidth;
19897
19898
// C++0x N3000 [conv.prom]p3:
19899
// An rvalue of an unscoped enumeration type whose underlying
19900
// type is not fixed can be converted to an rvalue of the first
19901
// of the following types that can represent all the values of
19902
// the enumeration: int, unsigned int, long int, unsigned long
19903
// int, long long int, or unsigned long long int.
19904
// C99 6.4.4.3p2:
19905
// An identifier declared as an enumeration constant has type int.
19906
// The C99 rule is modified by a gcc extension
19907
QualType BestPromotionType;
19908
19909
bool Packed = Enum->hasAttr<PackedAttr>();
19910
// -fshort-enums is the equivalent to specifying the packed attribute on all
19911
// enum definitions.
19912
if (LangOpts.ShortEnums)
19913
Packed = true;
19914
19915
// If the enum already has a type because it is fixed or dictated by the
19916
// target, promote that type instead of analyzing the enumerators.
19917
if (Enum->isComplete()) {
19918
BestType = Enum->getIntegerType();
19919
if (Context.isPromotableIntegerType(BestType))
19920
BestPromotionType = Context.getPromotedIntegerType(BestType);
19921
else
19922
BestPromotionType = BestType;
19923
19924
BestWidth = Context.getIntWidth(BestType);
19925
}
19926
else if (NumNegativeBits) {
19927
// If there is a negative value, figure out the smallest integer type (of
19928
// int/long/longlong) that fits.
19929
// If it's packed, check also if it fits a char or a short.
19930
if (Packed && NumNegativeBits <= CharWidth && NumPositiveBits < CharWidth) {
19931
BestType = Context.SignedCharTy;
19932
BestWidth = CharWidth;
19933
} else if (Packed && NumNegativeBits <= ShortWidth &&
19934
NumPositiveBits < ShortWidth) {
19935
BestType = Context.ShortTy;
19936
BestWidth = ShortWidth;
19937
} else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
19938
BestType = Context.IntTy;
19939
BestWidth = IntWidth;
19940
} else {
19941
BestWidth = Context.getTargetInfo().getLongWidth();
19942
19943
if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
19944
BestType = Context.LongTy;
19945
} else {
19946
BestWidth = Context.getTargetInfo().getLongLongWidth();
19947
19948
if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
19949
Diag(Enum->getLocation(), diag::ext_enum_too_large);
19950
BestType = Context.LongLongTy;
19951
}
19952
}
19953
BestPromotionType = (BestWidth <= IntWidth ? Context.IntTy : BestType);
19954
} else {
19955
// If there is no negative value, figure out the smallest type that fits
19956
// all of the enumerator values.
19957
// If it's packed, check also if it fits a char or a short.
19958
if (Packed && NumPositiveBits <= CharWidth) {
19959
BestType = Context.UnsignedCharTy;
19960
BestPromotionType = Context.IntTy;
19961
BestWidth = CharWidth;
19962
} else if (Packed && NumPositiveBits <= ShortWidth) {
19963
BestType = Context.UnsignedShortTy;
19964
BestPromotionType = Context.IntTy;
19965
BestWidth = ShortWidth;
19966
} else if (NumPositiveBits <= IntWidth) {
19967
BestType = Context.UnsignedIntTy;
19968
BestWidth = IntWidth;
19969
BestPromotionType
19970
= (NumPositiveBits == BestWidth || !getLangOpts().CPlusPlus)
19971
? Context.UnsignedIntTy : Context.IntTy;
19972
} else if (NumPositiveBits <=
19973
(BestWidth = Context.getTargetInfo().getLongWidth())) {
19974
BestType = Context.UnsignedLongTy;
19975
BestPromotionType
19976
= (NumPositiveBits == BestWidth || !getLangOpts().CPlusPlus)
19977
? Context.UnsignedLongTy : Context.LongTy;
19978
} else {
19979
BestWidth = Context.getTargetInfo().getLongLongWidth();
19980
if (NumPositiveBits > BestWidth) {
19981
// This can happen with bit-precise integer types, but those are not
19982
// allowed as the type for an enumerator per C23 6.7.2.2p4 and p12.
19983
// FIXME: GCC uses __int128_t and __uint128_t for cases that fit within
19984
// a 128-bit integer, we should consider doing the same.
19985
Diag(Enum->getLocation(), diag::ext_enum_too_large);
19986
}
19987
BestType = Context.UnsignedLongLongTy;
19988
BestPromotionType
19989
= (NumPositiveBits == BestWidth || !getLangOpts().CPlusPlus)
19990
? Context.UnsignedLongLongTy : Context.LongLongTy;
19991
}
19992
}
19993
19994
// Loop over all of the enumerator constants, changing their types to match
19995
// the type of the enum if needed.
19996
for (auto *D : Elements) {
19997
auto *ECD = cast_or_null<EnumConstantDecl>(D);
19998
if (!ECD) continue; // Already issued a diagnostic.
19999
20000
// Standard C says the enumerators have int type, but we allow, as an
20001
// extension, the enumerators to be larger than int size. If each
20002
// enumerator value fits in an int, type it as an int, otherwise type it the
20003
// same as the enumerator decl itself. This means that in "enum { X = 1U }"
20004
// that X has type 'int', not 'unsigned'.
20005
20006
// Determine whether the value fits into an int.
20007
llvm::APSInt InitVal = ECD->getInitVal();
20008
20009
// If it fits into an integer type, force it. Otherwise force it to match
20010
// the enum decl type.
20011
QualType NewTy;
20012
unsigned NewWidth;
20013
bool NewSign;
20014
if (!getLangOpts().CPlusPlus &&
20015
!Enum->isFixed() &&
20016
isRepresentableIntegerValue(Context, InitVal, Context.IntTy)) {
20017
NewTy = Context.IntTy;
20018
NewWidth = IntWidth;
20019
NewSign = true;
20020
} else if (ECD->getType() == BestType) {
20021
// Already the right type!
20022
if (getLangOpts().CPlusPlus)
20023
// C++ [dcl.enum]p4: Following the closing brace of an
20024
// enum-specifier, each enumerator has the type of its
20025
// enumeration.
20026
ECD->setType(EnumType);
20027
continue;
20028
} else {
20029
NewTy = BestType;
20030
NewWidth = BestWidth;
20031
NewSign = BestType->isSignedIntegerOrEnumerationType();
20032
}
20033
20034
// Adjust the APSInt value.
20035
InitVal = InitVal.extOrTrunc(NewWidth);
20036
InitVal.setIsSigned(NewSign);
20037
ECD->setInitVal(Context, InitVal);
20038
20039
// Adjust the Expr initializer and type.
20040
if (ECD->getInitExpr() &&
20041
!Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
20042
ECD->setInitExpr(ImplicitCastExpr::Create(
20043
Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
20044
/*base paths*/ nullptr, VK_PRValue, FPOptionsOverride()));
20045
if (getLangOpts().CPlusPlus)
20046
// C++ [dcl.enum]p4: Following the closing brace of an
20047
// enum-specifier, each enumerator has the type of its
20048
// enumeration.
20049
ECD->setType(EnumType);
20050
else
20051
ECD->setType(NewTy);
20052
}
20053
20054
Enum->completeDefinition(BestType, BestPromotionType,
20055
NumPositiveBits, NumNegativeBits);
20056
20057
CheckForDuplicateEnumValues(*this, Elements, Enum, EnumType);
20058
20059
if (Enum->isClosedFlag()) {
20060
for (Decl *D : Elements) {
20061
EnumConstantDecl *ECD = cast_or_null<EnumConstantDecl>(D);
20062
if (!ECD) continue; // Already issued a diagnostic.
20063
20064
llvm::APSInt InitVal = ECD->getInitVal();
20065
if (InitVal != 0 && !InitVal.isPowerOf2() &&
20066
!IsValueInFlagEnum(Enum, InitVal, true))
20067
Diag(ECD->getLocation(), diag::warn_flag_enum_constant_out_of_range)
20068
<< ECD << Enum;
20069
}
20070
}
20071
20072
// Now that the enum type is defined, ensure it's not been underaligned.
20073
if (Enum->hasAttrs())
20074
CheckAlignasUnderalignment(Enum);
20075
}
20076
20077
Decl *Sema::ActOnFileScopeAsmDecl(Expr *expr,
20078
SourceLocation StartLoc,
20079
SourceLocation EndLoc) {
20080
StringLiteral *AsmString = cast<StringLiteral>(expr);
20081
20082
FileScopeAsmDecl *New = FileScopeAsmDecl::Create(Context, CurContext,
20083
AsmString, StartLoc,
20084
EndLoc);
20085
CurContext->addDecl(New);
20086
return New;
20087
}
20088
20089
TopLevelStmtDecl *Sema::ActOnStartTopLevelStmtDecl(Scope *S) {
20090
auto *New = TopLevelStmtDecl::Create(Context, /*Statement=*/nullptr);
20091
CurContext->addDecl(New);
20092
PushDeclContext(S, New);
20093
PushFunctionScope();
20094
PushCompoundScope(false);
20095
return New;
20096
}
20097
20098
void Sema::ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement) {
20099
D->setStmt(Statement);
20100
PopCompoundScope();
20101
PopFunctionScopeInfo();
20102
PopDeclContext();
20103
}
20104
20105
void Sema::ActOnPragmaRedefineExtname(IdentifierInfo* Name,
20106
IdentifierInfo* AliasName,
20107
SourceLocation PragmaLoc,
20108
SourceLocation NameLoc,
20109
SourceLocation AliasNameLoc) {
20110
NamedDecl *PrevDecl = LookupSingleName(TUScope, Name, NameLoc,
20111
LookupOrdinaryName);
20112
AttributeCommonInfo Info(AliasName, SourceRange(AliasNameLoc),
20113
AttributeCommonInfo::Form::Pragma());
20114
AsmLabelAttr *Attr = AsmLabelAttr::CreateImplicit(
20115
Context, AliasName->getName(), /*IsLiteralLabel=*/true, Info);
20116
20117
// If a declaration that:
20118
// 1) declares a function or a variable
20119
// 2) has external linkage
20120
// already exists, add a label attribute to it.
20121
if (PrevDecl && (isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) {
20122
if (isDeclExternC(PrevDecl))
20123
PrevDecl->addAttr(Attr);
20124
else
20125
Diag(PrevDecl->getLocation(), diag::warn_redefine_extname_not_applied)
20126
<< /*Variable*/(isa<FunctionDecl>(PrevDecl) ? 0 : 1) << PrevDecl;
20127
// Otherwise, add a label attribute to ExtnameUndeclaredIdentifiers.
20128
} else
20129
(void)ExtnameUndeclaredIdentifiers.insert(std::make_pair(Name, Attr));
20130
}
20131
20132
void Sema::ActOnPragmaWeakID(IdentifierInfo* Name,
20133
SourceLocation PragmaLoc,
20134
SourceLocation NameLoc) {
20135
Decl *PrevDecl = LookupSingleName(TUScope, Name, NameLoc, LookupOrdinaryName);
20136
20137
if (PrevDecl) {
20138
PrevDecl->addAttr(WeakAttr::CreateImplicit(Context, PragmaLoc));
20139
} else {
20140
(void)WeakUndeclaredIdentifiers[Name].insert(WeakInfo(nullptr, NameLoc));
20141
}
20142
}
20143
20144
void Sema::ActOnPragmaWeakAlias(IdentifierInfo* Name,
20145
IdentifierInfo* AliasName,
20146
SourceLocation PragmaLoc,
20147
SourceLocation NameLoc,
20148
SourceLocation AliasNameLoc) {
20149
Decl *PrevDecl = LookupSingleName(TUScope, AliasName, AliasNameLoc,
20150
LookupOrdinaryName);
20151
WeakInfo W = WeakInfo(Name, NameLoc);
20152
20153
if (PrevDecl && (isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) {
20154
if (!PrevDecl->hasAttr<AliasAttr>())
20155
if (NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
20156
DeclApplyPragmaWeak(TUScope, ND, W);
20157
} else {
20158
(void)WeakUndeclaredIdentifiers[AliasName].insert(W);
20159
}
20160
}
20161
20162
Sema::FunctionEmissionStatus Sema::getEmissionStatus(const FunctionDecl *FD,
20163
bool Final) {
20164
assert(FD && "Expected non-null FunctionDecl");
20165
20166
// SYCL functions can be template, so we check if they have appropriate
20167
// attribute prior to checking if it is a template.
20168
if (LangOpts.SYCLIsDevice && FD->hasAttr<SYCLKernelAttr>())
20169
return FunctionEmissionStatus::Emitted;
20170
20171
// Templates are emitted when they're instantiated.
20172
if (FD->isDependentContext())
20173
return FunctionEmissionStatus::TemplateDiscarded;
20174
20175
// Check whether this function is an externally visible definition.
20176
auto IsEmittedForExternalSymbol = [this, FD]() {
20177
// We have to check the GVA linkage of the function's *definition* -- if we
20178
// only have a declaration, we don't know whether or not the function will
20179
// be emitted, because (say) the definition could include "inline".
20180
const FunctionDecl *Def = FD->getDefinition();
20181
20182
return Def && !isDiscardableGVALinkage(
20183
getASTContext().GetGVALinkageForFunction(Def));
20184
};
20185
20186
if (LangOpts.OpenMPIsTargetDevice) {
20187
// In OpenMP device mode we will not emit host only functions, or functions
20188
// we don't need due to their linkage.
20189
std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20190
OMPDeclareTargetDeclAttr::getDeviceType(FD->getCanonicalDecl());
20191
// DevTy may be changed later by
20192
// #pragma omp declare target to(*) device_type(*).
20193
// Therefore DevTy having no value does not imply host. The emission status
20194
// will be checked again at the end of compilation unit with Final = true.
20195
if (DevTy)
20196
if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
20197
return FunctionEmissionStatus::OMPDiscarded;
20198
// If we have an explicit value for the device type, or we are in a target
20199
// declare context, we need to emit all extern and used symbols.
20200
if (OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
20201
if (IsEmittedForExternalSymbol())
20202
return FunctionEmissionStatus::Emitted;
20203
// Device mode only emits what it must, if it wasn't tagged yet and needed,
20204
// we'll omit it.
20205
if (Final)
20206
return FunctionEmissionStatus::OMPDiscarded;
20207
} else if (LangOpts.OpenMP > 45) {
20208
// In OpenMP host compilation prior to 5.0 everything was an emitted host
20209
// function. In 5.0, no_host was introduced which might cause a function to
20210
// be omitted.
20211
std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20212
OMPDeclareTargetDeclAttr::getDeviceType(FD->getCanonicalDecl());
20213
if (DevTy)
20214
if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
20215
return FunctionEmissionStatus::OMPDiscarded;
20216
}
20217
20218
if (Final && LangOpts.OpenMP && !LangOpts.CUDA)
20219
return FunctionEmissionStatus::Emitted;
20220
20221
if (LangOpts.CUDA) {
20222
// When compiling for device, host functions are never emitted. Similarly,
20223
// when compiling for host, device and global functions are never emitted.
20224
// (Technically, we do emit a host-side stub for global functions, but this
20225
// doesn't count for our purposes here.)
20226
CUDAFunctionTarget T = CUDA().IdentifyTarget(FD);
20227
if (LangOpts.CUDAIsDevice && T == CUDAFunctionTarget::Host)
20228
return FunctionEmissionStatus::CUDADiscarded;
20229
if (!LangOpts.CUDAIsDevice &&
20230
(T == CUDAFunctionTarget::Device || T == CUDAFunctionTarget::Global))
20231
return FunctionEmissionStatus::CUDADiscarded;
20232
20233
if (IsEmittedForExternalSymbol())
20234
return FunctionEmissionStatus::Emitted;
20235
}
20236
20237
// Otherwise, the function is known-emitted if it's in our set of
20238
// known-emitted functions.
20239
return FunctionEmissionStatus::Unknown;
20240
}
20241
20242
bool Sema::shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee) {
20243
// Host-side references to a __global__ function refer to the stub, so the
20244
// function itself is never emitted and therefore should not be marked.
20245
// If we have host fn calls kernel fn calls host+device, the HD function
20246
// does not get instantiated on the host. We model this by omitting at the
20247
// call to the kernel from the callgraph. This ensures that, when compiling
20248
// for host, only HD functions actually called from the host get marked as
20249
// known-emitted.
20250
return LangOpts.CUDA && !LangOpts.CUDAIsDevice &&
20251
CUDA().IdentifyTarget(Callee) == CUDAFunctionTarget::Global;
20252
}
20253
20254
void Sema::diagnoseFunctionEffectMergeConflicts(
20255
const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc,
20256
SourceLocation OldLoc) {
20257
for (const FunctionEffectSet::Conflict &Conflict : Errs) {
20258
Diag(NewLoc, diag::warn_conflicting_func_effects)
20259
<< Conflict.Kept.description() << Conflict.Rejected.description();
20260
Diag(OldLoc, diag::note_previous_declaration);
20261
}
20262
}
20263
20264
bool Sema::diagnoseConflictingFunctionEffect(
20265
const FunctionEffectsRef &FX, const FunctionEffectWithCondition &NewEC,
20266
SourceLocation NewAttrLoc) {
20267
// If the new effect has a condition, we can't detect conflicts until the
20268
// condition is resolved.
20269
if (NewEC.Cond.getCondition() != nullptr)
20270
return false;
20271
20272
// Diagnose the new attribute as incompatible with a previous one.
20273
auto Incompatible = [&](const FunctionEffectWithCondition &PrevEC) {
20274
Diag(NewAttrLoc, diag::err_attributes_are_not_compatible)
20275
<< ("'" + NewEC.description() + "'")
20276
<< ("'" + PrevEC.description() + "'") << false;
20277
// We don't necessarily have the location of the previous attribute,
20278
// so no note.
20279
return true;
20280
};
20281
20282
// Compare against previous attributes.
20283
FunctionEffect::Kind NewKind = NewEC.Effect.kind();
20284
20285
for (const FunctionEffectWithCondition &PrevEC : FX) {
20286
// Again, can't check yet when the effect is conditional.
20287
if (PrevEC.Cond.getCondition() != nullptr)
20288
continue;
20289
20290
FunctionEffect::Kind PrevKind = PrevEC.Effect.kind();
20291
// Note that we allow PrevKind == NewKind; it's redundant and ignored.
20292
20293
if (PrevEC.Effect.oppositeKind() == NewKind)
20294
return Incompatible(PrevEC);
20295
20296
// A new allocating is incompatible with a previous nonblocking.
20297
if (PrevKind == FunctionEffect::Kind::NonBlocking &&
20298
NewKind == FunctionEffect::Kind::Allocating)
20299
return Incompatible(PrevEC);
20300
20301
// A new nonblocking is incompatible with a previous allocating.
20302
if (PrevKind == FunctionEffect::Kind::Allocating &&
20303
NewKind == FunctionEffect::Kind::NonBlocking)
20304
return Incompatible(PrevEC);
20305
}
20306
20307
return false;
20308
}
20309
20310