From b4292f221fb879fd2274683ace4f73d3d99af8c5 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Wed, 31 Oct 2007 20:55:39 +0000 Subject: [PATCH] Implement ObjC built-in types in MinimalAction. This fixes the recent regression with selector-1.m and -parse-noop. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43575 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/PrintParserCallbacks.cpp | 7 +++++-- Driver/clang.cpp | 5 +++-- Driver/clang.h | 3 ++- Parse/MinimalAction.cpp | 14 +++++++++++++- include/clang/Parse/Action.h | 3 +++ 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Driver/PrintParserCallbacks.cpp b/Driver/PrintParserCallbacks.cpp index d7deb43f87..9568b87211 100644 --- a/Driver/PrintParserCallbacks.cpp +++ b/Driver/PrintParserCallbacks.cpp @@ -21,6 +21,9 @@ using namespace clang; namespace { class ParserPrintActions : public MinimalAction { + public: + ParserPrintActions(IdentifierTable &IT) : MinimalAction(IT) {} + /// ActOnDeclarator - This callback is invoked when a declarator is parsed /// and 'Init' specifies the initializer if any. This is for things like: /// "int X = 4" or "typedef int foo". @@ -49,6 +52,6 @@ namespace { }; } -MinimalAction *clang::CreatePrintParserActionsAction() { - return new ParserPrintActions(); +MinimalAction *clang::CreatePrintParserActionsAction(IdentifierTable &IT) { + return new ParserPrintActions(IT); } diff --git a/Driver/clang.cpp b/Driver/clang.cpp index 6e0ed914e2..77779f7e80 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -763,12 +763,13 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID, break; case ParseNoop: // -parse-noop - ParseFile(PP, new MinimalAction(), MainFileID); + ParseFile(PP, new MinimalAction(PP.getIdentifierTable()), MainFileID); ClearSourceMgr = true; break; case ParsePrintCallbacks: - ParseFile(PP, CreatePrintParserActionsAction(), MainFileID); + ParseFile(PP, CreatePrintParserActionsAction(PP.getIdentifierTable()), + MainFileID); ClearSourceMgr = true; break; diff --git a/Driver/clang.h b/Driver/clang.h index bf212866ec..fd11590854 100644 --- a/Driver/clang.h +++ b/Driver/clang.h @@ -21,6 +21,7 @@ class MinimalAction; class TargetInfo; class Diagnostic; class ASTConsumer; +class IdentifierTable; /// DoPrintPreprocessedInput - Implement -E mode. void DoPrintPreprocessedInput(unsigned MainFileID, Preprocessor &PP, @@ -28,7 +29,7 @@ void DoPrintPreprocessedInput(unsigned MainFileID, Preprocessor &PP, /// CreatePrintParserActionsAction - Return the actions implementation that /// implements the -parse-print-callbacks option. -MinimalAction *CreatePrintParserActionsAction(); +MinimalAction *CreatePrintParserActionsAction(IdentifierTable &); /// CreateTargetInfo - Return the set of target info objects as specified by /// the -arch command line option. diff --git a/Parse/MinimalAction.cpp b/Parse/MinimalAction.cpp index bc7c41bec3..92d997f59c 100644 --- a/Parse/MinimalAction.cpp +++ b/Parse/MinimalAction.cpp @@ -30,7 +30,19 @@ struct TypeNameInfo { void MinimalAction:: ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) { TUScope = S; - // FIXME: add id/SEL/Class. We need to get our paws on the identifier table. + IdentifierInfo *II; + TypeNameInfo *TI; + + // recognize the ObjC built-in type identifiers. + II = &Idents.get("id"); + TI = new TypeNameInfo(1, II->getFETokenInfo()); + II->setFETokenInfo(TI); + II = &Idents.get("SEL"); + TI = new TypeNameInfo(1, II->getFETokenInfo()); + II->setFETokenInfo(TI); + II = &Idents.get("Class"); + TI = new TypeNameInfo(1, II->getFETokenInfo()); + II->setFETokenInfo(TI); } /// isTypeName - This looks at the IdentifierInfo::FETokenInfo field to diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index 43290f2add..32025eaa01 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -632,7 +632,10 @@ class MinimalAction : public Action { /// to lookup file scope declarations in the "ordinary" C decl namespace. /// For example, user-defined classes, built-in "id" type, etc. Scope *TUScope; + IdentifierTable &Idents; public: + MinimalAction(IdentifierTable &IT) : Idents(IT) {} + /// isTypeName - This looks at the IdentifierInfo::FETokenInfo field to /// determine whether the name is a typedef or not in this scope. virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S) const;