diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index e67f1f2a289f..0e696a978129 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -406,25 +406,25 @@ public: class NullStmt : public Stmt { SourceLocation SemiLoc; - /// \brief If the null statement was preceded by an empty macro this is - /// its instantiation source location, e.g: + /// \brief True if the null statement was preceded by an empty macro, e.g: /// @code /// #define CALL(x) /// CALL(0); /// @endcode - SourceLocation LeadingEmptyMacro; + bool HasLeadingEmptyMacro; public: - NullStmt(SourceLocation L, SourceLocation LeadingEmptyMacro =SourceLocation()) - : Stmt(NullStmtClass), SemiLoc(L), LeadingEmptyMacro(LeadingEmptyMacro) {} + NullStmt(SourceLocation L, bool hasLeadingEmptyMacro = false) + : Stmt(NullStmtClass), SemiLoc(L), + HasLeadingEmptyMacro(hasLeadingEmptyMacro) {} /// \brief Build an empty null statement. - explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty) { } + explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty), + HasLeadingEmptyMacro(false) { } SourceLocation getSemiLoc() const { return SemiLoc; } void setSemiLoc(SourceLocation L) { SemiLoc = L; } - bool hasLeadingEmptyMacro() const { return LeadingEmptyMacro.isValid(); } - SourceLocation getLeadingEmptyMacroLoc() const { return LeadingEmptyMacro; } + bool hasLeadingEmptyMacro() const { return HasLeadingEmptyMacro; } SourceRange getSourceRange() const { return SourceRange(SemiLoc); } diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index c9e45d0c97e7..7044e34cd34a 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -227,10 +227,6 @@ class Preprocessor : public llvm::RefCountedBase { /// previous macro value. llvm::DenseMap > PragmaPushMacroInfo; - /// \brief Expansion source location for the last macro that expanded - /// to no tokens. - SourceLocation LastEmptyMacroExpansionLoc; - // Various statistics we track for performance analysis. unsigned NumDirectives, NumIncluded, NumDefined, NumUndefined, NumPragma; unsigned NumIf, NumElse, NumEndif; @@ -399,12 +395,6 @@ public: macro_iterator macro_begin(bool IncludeExternalMacros = true) const; macro_iterator macro_end(bool IncludeExternalMacros = true) const; - /// \brief Expansion source location for the last macro that expanded - /// to no tokens. - SourceLocation getLastEmptyMacroExpansionLoc() const { - return LastEmptyMacroExpansionLoc; - } - const std::string &getPredefines() const { return Predefines; } /// setPredefines - Set the predefines for this Preprocessor. These /// predefines are automatically injected when parsing the main file. diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index b5dec1193a8a..814fd27469d4 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -2022,7 +2022,7 @@ public: StmtResult ActOnExprStmt(FullExprArg Expr); StmtResult ActOnNullStmt(SourceLocation SemiLoc, - SourceLocation LeadingEmptyMacroLoc = SourceLocation()); + bool HasLeadingEmptyMacro = false); StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, MultiStmtArg Elts, bool isStmtExpr); diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 5e498f837c55..96b729af1aae 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -257,7 +257,6 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace); } Identifier.setFlag(Token::LeadingEmptyMacro); - LastEmptyMacroExpansionLoc = ExpandLoc; ++NumFastMacroExpanded; return false; diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index d57e52799039..df768c9a0655 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -224,10 +224,8 @@ Retry: case tok::l_brace: // C99 6.8.2: compound-statement return ParseCompoundStatement(attrs); case tok::semi: { // C99 6.8.3p3: expression[opt] ';' - SourceLocation LeadingEmptyMacroLoc; - if (Tok.hasLeadingEmptyMacro()) - LeadingEmptyMacroLoc = PP.getLastEmptyMacroExpansionLoc(); - return Actions.ActOnNullStmt(ConsumeToken(), LeadingEmptyMacroLoc); + bool HasLeadingEmptyMacro = Tok.hasLeadingEmptyMacro(); + return Actions.ActOnNullStmt(ConsumeToken(), HasLeadingEmptyMacro); } case tok::kw_if: // C99 6.8.4.1: if-statement diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index e17188757b5b..d03a6ac16807 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -47,8 +47,8 @@ StmtResult Sema::ActOnExprStmt(FullExprArg expr) { StmtResult Sema::ActOnNullStmt(SourceLocation SemiLoc, - SourceLocation LeadingEmptyMacroLoc) { - return Owned(new (Context) NullStmt(SemiLoc, LeadingEmptyMacroLoc)); + bool HasLeadingEmptyMacro) { + return Owned(new (Context) NullStmt(SemiLoc, HasLeadingEmptyMacro)); } StmtResult Sema::ActOnDeclStmt(DeclGroupPtrTy dg, SourceLocation StartLoc, diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index cfe46d75b1eb..a402ad05a094 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -109,7 +109,7 @@ void ASTStmtReader::VisitStmt(Stmt *S) { void ASTStmtReader::VisitNullStmt(NullStmt *S) { VisitStmt(S); S->setSemiLoc(ReadSourceLocation(Record, Idx)); - S->LeadingEmptyMacro = ReadSourceLocation(Record, Idx); + S->HasLeadingEmptyMacro = Record[Idx++]; } void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) { diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index f0636a1aa1cd..8f68b12aacc1 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -59,7 +59,7 @@ void ASTStmtWriter::VisitStmt(Stmt *S) { void ASTStmtWriter::VisitNullStmt(NullStmt *S) { VisitStmt(S); Writer.AddSourceLocation(S->getSemiLoc(), Record); - Writer.AddSourceLocation(S->LeadingEmptyMacro, Record); + Record.push_back(S->HasLeadingEmptyMacro); Code = serialization::STMT_NULL; }