Skip to content

Commit 81e5722

Browse files
committed
declare the builtin if needed
Signed-off-by: Sarnie, Nick <[email protected]>
1 parent 36e8a86 commit 81e5722

File tree

3 files changed

+13
-35
lines changed

3 files changed

+13
-35
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,11 +1825,6 @@ class Sema final : public SemaBase {
18251825
/// Set of no-builtin functions listed by \#pragma function.
18261826
llvm::SmallSetVector<StringRef, 4> MSFunctionNoBuiltins;
18271827

1828-
/// Map of BuiltinIDs to source locations that have #pragma intrinsic calls
1829-
/// that refer to them.
1830-
llvm::DenseMap<unsigned, llvm::SmallSetVector<SourceLocation, 4>>
1831-
PragmaIntrinsicBuiltinIDMap;
1832-
18331828
/// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
18341829
/// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
18351830
void AddAlignmentAttributesForRecord(RecordDecl *RD);
@@ -4350,11 +4345,6 @@ class Sema final : public SemaBase {
43504345
/// contain non-field names.
43514346
Scope *getNonFieldDeclScope(Scope *S);
43524347

4353-
// Determine if the given builtin usage at the given source location
4354-
// was previously specified in a #pragma intrinsic.
4355-
bool isBuiltinSpecifiedInPragmaIntrinsic(unsigned BuiltinID,
4356-
SourceLocation UsageLoc) const;
4357-
43584348
FunctionDecl *CreateBuiltin(IdentifierInfo *II, QualType Type, unsigned ID,
43594349
SourceLocation Loc);
43604350

clang/lib/Parse/ParsePragma.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3807,10 +3807,15 @@ void PragmaMSIntrinsicHandler::HandlePragma(Preprocessor &PP,
38073807
if (!II->getBuiltinID())
38083808
PP.Diag(Tok.getLocation(), diag::warn_pragma_intrinsic_builtin)
38093809
<< II << SuggestIntrinH;
3810-
/// Store the location at which the builtin was used in a #pragma intrinsic
3811-
/// so we don't emit a missing header warning later.
3812-
Actions.PragmaIntrinsicBuiltinIDMap[II->getBuiltinID()].insert(
3813-
Tok.getLocation());
3810+
// If the builtin hasn't already been declared, declare it now.
3811+
DeclarationNameInfo NameInfo(II, Tok.getLocation());
3812+
LookupResult Previous(Actions, NameInfo, Sema::LookupOrdinaryName,
3813+
Actions.forRedeclarationInCurContext());
3814+
Actions.LookupName(Previous, Actions.getCurScope(),
3815+
/*CreateBuiltins*/ false);
3816+
if (Previous.empty())
3817+
Actions.LazilyCreateBuiltin(II, II->getBuiltinID(), Actions.getCurScope(),
3818+
/*ForRedeclaration*/ true, Tok.getLocation());
38143819
PP.Lex(Tok);
38153820
if (Tok.isNot(tok::comma))
38163821
break;

clang/lib/Sema/SemaDecl.cpp

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,21 +2299,6 @@ static StringRef getHeaderName(Builtin::Context &BuiltinInfo, unsigned ID,
22992299
llvm_unreachable("unhandled error kind");
23002300
}
23012301

2302-
bool Sema::isBuiltinSpecifiedInPragmaIntrinsic(unsigned BuiltinID,
2303-
SourceLocation UsageLoc) const {
2304-
assert(Context.BuiltinInfo(BuiltinID) && "Invalid builtin id");
2305-
assert(UsageLoc.isValid() && "Invalid source location");
2306-
auto It = PragmaIntrinsicBuiltinIDMap.find(BuiltinID);
2307-
if (It == PragmaIntrinsicBuiltinIDMap.end())
2308-
return false;
2309-
for (const SourceLocation &PragmaIntrinLoc : It->second) {
2310-
if (Context.getSourceManager().isBeforeInTranslationUnit(PragmaIntrinLoc,
2311-
UsageLoc))
2312-
return true;
2313-
}
2314-
return false;
2315-
}
2316-
23172302
FunctionDecl *Sema::CreateBuiltin(IdentifierInfo *II, QualType Type,
23182303
unsigned ID, SourceLocation Loc) {
23192304
DeclContext *Parent = Context.getTranslationUnitDecl();
@@ -2385,17 +2370,15 @@ NamedDecl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID,
23852370

23862371
// Generally, we emit a warning that the declaration requires the
23872372
// appropriate header.
2388-
if (!isBuiltinSpecifiedInPragmaIntrinsic(ID, Loc))
2389-
Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2390-
<< getHeaderName(Context.BuiltinInfo, ID, Error)
2391-
<< Context.BuiltinInfo.getName(ID);
2373+
Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2374+
<< getHeaderName(Context.BuiltinInfo, ID, Error)
2375+
<< Context.BuiltinInfo.getName(ID);
23922376
return nullptr;
23932377
}
23942378

23952379
if (!ForRedeclaration &&
23962380
(Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2397-
Context.BuiltinInfo.isHeaderDependentFunction(ID)) &&
2398-
!isBuiltinSpecifiedInPragmaIntrinsic(ID, Loc)) {
2381+
Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
23992382
Diag(Loc, LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
24002383
: diag::ext_implicit_lib_function_decl)
24012384
<< Context.BuiltinInfo.getName(ID) << R;

0 commit comments

Comments
 (0)