summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/flang/Basic/Actions.h2
-rw-r--r--include/flang/Parse/Parser.h11
-rw-r--r--include/flang/Sema/Sema.h48
-rw-r--r--lib/Basic/Actions.cpp14
-rw-r--r--lib/Parse/ParseDecl.cpp2
-rw-r--r--lib/Parse/ParseExec.cpp2
-rw-r--r--lib/Parse/ParseExpr.cpp2
-rw-r--r--lib/Parse/Parser.cpp16
-rw-r--r--lib/Sema/Sema.cpp23
-rw-r--r--tools/driver/Main.cpp8
-rw-r--r--tools/driver/Makefile2
11 files changed, 97 insertions, 33 deletions
diff --git a/include/flang/Basic/Actions.h b/include/flang/Basic/Actions.h
index 1985fce6db..689f2dd427 100644
--- a/include/flang/Basic/Actions.h
+++ b/include/flang/Basic/Actions.h
@@ -41,6 +41,7 @@ public:
virtual ~Action();
virtual void ActOnTranslationUnit() = 0;
virtual void ActOnMainProgram(const DeclarationNameInfo &NameInfo) = 0;
+ virtual void ActOneEndMainProgram(const DeclarationNameInfo &EndNameInfo) = 0;
virtual void ActOnEndProgramUnit() = 0;
virtual StmtResult ActOnPROGRAM(ASTContext &C, const IdentifierInfo *ProgName,
@@ -91,6 +92,7 @@ public:
PrintAction(Diagnostic &D) : Diag(D), Indent(0) {}
virtual void ActOnTranslationUnit();
virtual void ActOnMainProgram(const DeclarationNameInfo &NameInfo);
+ virtual void ActOneEndMainProgram(const DeclarationNameInfo &EndNameInfo);
virtual void ActOnEndProgramUnit();
virtual StmtResult ActOnPROGRAM(ASTContext &C, const IdentifierInfo *ProgName,
diff --git a/include/flang/Parse/Parser.h b/include/flang/Parse/Parser.h
index 5789c96070..cf09619d2e 100644
--- a/include/flang/Parse/Parser.h
+++ b/include/flang/Parse/Parser.h
@@ -38,6 +38,7 @@ class DeclGroupRef;
class Expr;
class Parser;
class Selector;
+class Sema;
/// PrettyStackTraceParserEntry - If a crash happens while the parser is active,
/// an entry is printed for it.
@@ -68,19 +69,19 @@ private:
/// SourceMgr object.
int CurBuffer;
- ASTContext Context; // FIXME: Move to AST construction.
+ ASTContext &Context;
/// Diag - Diagnostics for parsing errors.
Diagnostic &Diag;
-#if 0
/// Actions - These are the callbacks we invoke as we parse various constructs
/// in the file.
Sema &Actions;
-#endif
+#if 0
/// Actions - These are the callbacks we invoke as we parse various constructs
/// in the file.
Action &Actions;
+#endif
/// Tok - The current token we are parsing. All parsing methods assume that
/// this is valid.
@@ -139,8 +140,12 @@ public:
return Identifiers.isaBuiltin(BI);
}
+#if 0
Parser(llvm::SourceMgr &SrcMgr, const LangOptions &Opts,
Diagnostic &D, Action &Acts);
+#endif
+ Parser(llvm::SourceMgr &SrcMgr, const LangOptions &Opts,
+ Diagnostic &D, Sema &actions);
llvm::SourceMgr &getSourceManager() { return SrcMgr; }
diff --git a/include/flang/Sema/Sema.h b/include/flang/Sema/Sema.h
index 0ae83bd237..02128ba6a6 100644
--- a/include/flang/Sema/Sema.h
+++ b/include/flang/Sema/Sema.h
@@ -16,18 +16,25 @@
#define FLANG_SEMA_SEMA_H__
#include "flang/Basic/Token.h"
+#include "flang/AST/Stmt.h"
+#include "flang/AST/Type.h"
#include "flang/Sema/Ownership.h"
+#include "llvm/ADT/StringRef.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/SMLoc.h"
+#include "flang/Basic/LLVM.h"
namespace flang {
class ASTContext;
class DeclContext;
+class DeclSpec;
class DeclarationNameInfo;
+class Diagnostic;
class Expr;
class IdentifierInfo;
class Token;
+class VarDecl;
/// Sema - This implements semantic analysis and AST buiding for Fortran.
class Sema {
@@ -37,12 +44,12 @@ public:
typedef Expr ExprTy;
ASTContext &Context;
- llvm::SourceMgr &SrcMgr;
+ Diagnostic &Diags;
/// CurContext - This is the current declaration context of parsing.
DeclContext *CurContext;
- Sema(ASTContext &ctxt, llvm::SourceMgr &sm);
+ Sema(ASTContext &ctxt, Diagnostic &Diags);
~Sema();
DeclContext *getContainingDC(DeclContext *DC);
@@ -52,9 +59,10 @@ public:
void PopDeclContext();
void ActOnTranslationUnit();
- void ActOnMainProgram(const DeclarationNameInfo &NameInfo);
void ActOnEndProgramUnit();
+ void ActOnMainProgram(const DeclarationNameInfo &NameInfo);
+ void ActOnEndMainProgram(const DeclarationNameInfo &EndNameInfo);
StmtResult ActOnPROGRAM(ASTContext &C, const IdentifierInfo *ProgName,
llvm::SMLoc Loc, llvm::SMLoc NameLoc,
@@ -63,6 +71,40 @@ public:
const IdentifierInfo *ProgName,
llvm::SMLoc Loc, llvm::SMLoc NameLoc,
Token StmtLabel);
+
+ // FIXME: TODO:
+
+ StmtResult ActOnIMPORT(llvm::ArrayRef<IdentifierInfo*>,
+ Token &StmtLabel) { return StmtResult(); }
+ StmtResult ActOnIMPLICIT(Token &StmtLabel) { return StmtResult(); }
+ StmtResult ActOnUSE(UseStmt::ModuleNature MN, llvm::StringRef Name,
+ bool OnlyList,
+ llvm::ArrayRef<const VarDecl*> LocalNames,
+ llvm::ArrayRef<const VarDecl*> UseNames,
+ Token &StmtLabel) { return StmtResult(); }
+ StmtResult
+ ActOnPARAMETER(llvm::ArrayRef<const IdentifierInfo*> NamedConsts,
+ llvm::ArrayRef<ExprResult> ConstExprs,
+ Token &StmtLabel) { return StmtResult(); }
+ StmtResult
+ ActOnASYNCHRONOUS(llvm::ArrayRef<const IdentifierInfo*> ObjNames,
+ Token &StmtLabel) { return StmtResult(); }
+
+ QualType ActOnBuiltinType(ASTContext *Ctx,
+ BuiltinType::TypeSpec TS,
+ Expr *Kind) { return QualType(); }
+ QualType ActOnCharacterBuiltinType(ASTContext *Ctx,
+ Expr *Len,
+ Expr *Kind) { return QualType(); }
+ DeclSpec *ActOnTypeDeclSpec(ASTContext *Ctx) { return 0; }
+ Decl *ActOnVarDecl(ASTContext *Ctx, DeclSpec *DTS,
+ const VarDecl *VD) { return 0; }
+
+ bool ActOnArraySpec() { return false; }
+
+ ExprResult ActOnDataReference(llvm::ArrayRef<ExprResult> Exprs) {
+ return ExprResult();
+ }
};
} // end flang namespace
diff --git a/lib/Basic/Actions.cpp b/lib/Basic/Actions.cpp
index 93a4f1dbaa..6895a43e91 100644
--- a/lib/Basic/Actions.cpp
+++ b/lib/Basic/Actions.cpp
@@ -39,6 +39,8 @@ Action::~Action() {
void PrintAction::ActOnTranslationUnit() {}
void PrintAction::ActOnEndProgramUnit() {}
void PrintAction::ActOnMainProgram(const DeclarationNameInfo &NameInfo) {}
+void PrintAction::ActOneEndMainProgram(const DeclarationNameInfo &EndNameInfo) {
+}
StmtResult PrintAction::ActOnPROGRAM(ASTContext &C,
const IdentifierInfo *ProgName,
@@ -59,18 +61,6 @@ StmtResult PrintAction::ActOnENDPROGRAM(ASTContext &C,
llvm::SMLoc Loc, llvm::SMLoc NameLoc,
Token &StmtLabel) {
Indent = 0;
-
- // This name, if specified, must match the name specified on the 'PROGRAM'
- // statement.
- llvm::StringRef Name = (ProgName ? ProgName->getName() : "");
- if (Name.size() != 0 && ProgName != ProgramName) {
- // FIXME: Use a real error reporting mechanism here.
- Diag.ReportError(Loc, llvm::Twine("expected label '") +
- ProgramName->getName() +
- "' for END PROGRAM statement");
- return StmtResult();
- }
-
llvm::outs() << "</program";
PrintStmtLabel(StmtLabel);
llvm::outs() << ">\n";
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp
index 1e4bf45e40..e08b6a3e43 100644
--- a/lib/Parse/ParseDecl.cpp
+++ b/lib/Parse/ParseDecl.cpp
@@ -14,7 +14,7 @@
#include "flang/Parse/Parser.h"
#include "flang/AST/Decl.h"
#include "flang/AST/Expr.h"
-#include "flang/Basic/Actions.h"
+#include "flang/Sema/Sema.h"
using namespace flang;
/// AssignAttrSpec - Helper function that assigns the attribute specification to
diff --git a/lib/Parse/ParseExec.cpp b/lib/Parse/ParseExec.cpp
index fee5f3c89f..4ba64691ae 100644
--- a/lib/Parse/ParseExec.cpp
+++ b/lib/Parse/ParseExec.cpp
@@ -15,9 +15,9 @@
#include "flang/AST/Decl.h"
#include "flang/AST/Expr.h"
#include "flang/AST/Stmt.h"
-#include "flang/Basic/Actions.h"
#include "flang/Basic/DeclSpec.h"
#include "flang/Basic/TokenKinds.h"
+#include "flang/Sema/Sema.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
using namespace flang;
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index 1ad55a11cf..55666d232e 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/lib/Parse/ParseExpr.cpp
@@ -14,8 +14,8 @@
#include "flang/Parse/Parser.h"
#include "flang/AST/Decl.h"
#include "flang/AST/Expr.h"
-#include "flang/Basic/Actions.h"
#include "flang/Sema/Ownership.h"
+#include "flang/Sema/Sema.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/ADT/Twine.h"
using namespace flang;
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index ff3d7b4ccd..7c7b978f85 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -15,9 +15,9 @@
#include "flang/AST/Decl.h"
#include "flang/AST/Expr.h"
#include "flang/AST/Stmt.h"
-#include "flang/Basic/Actions.h"
#include "flang/Basic/DeclSpec.h"
#include "flang/Basic/TokenKinds.h"
+#include "flang/Sema/Sema.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/APInt.h"
@@ -61,9 +61,10 @@ void PrettyStackTraceParserEntry::print(llvm::raw_ostream &OS) const {
//===----------------------------------------------------------------------===//
Parser::Parser(llvm::SourceMgr &SM, const LangOptions &Opts, Diagnostic &D,
- Action &Acts)
+ Sema &actions)
: TheLexer(SM, Opts, D), Features(Opts), CrashInfo(*this), SrcMgr(SM),
- CurBuffer(0), Context(SM), Diag(D), Actions(Acts), Identifiers(Opts) {
+ CurBuffer(0), Context(actions.Context), Diag(D), Actions(actions),
+ Identifiers(Opts) {
getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBuffer));
Tok.startToken();
NextTok.startToken();
@@ -304,11 +305,14 @@ bool Parser::ParseMainProgram() {
ParseStatementLabel();
}
+ // If the PROGRAM statement has an identifier, create a DeclarationNameInfo
+ // object for the main-program action.
const IdentifierInfo *IDInfo = 0;
llvm::SMLoc NameLoc;
if (ProgStmt.isUsable()) {
- IDInfo = ProgStmt.takeAs<ProgramStmt>()->getProgramName();
- NameLoc = ProgStmt.takeAs<ProgramStmt>()->getNameLocation();
+ ProgramStmt *PS = ProgStmt.takeAs<ProgramStmt>();
+ IDInfo = PS->getProgramName();
+ NameLoc = PS->getNameLocation();
}
DeclarationName DN(IDInfo);
@@ -325,7 +329,7 @@ bool Parser::ParseMainProgram() {
ParseStatementLabel();
}
- ParseEND_PROGRAMStmt();
+ StmtResult EndProgStmt = ParseEND_PROGRAMStmt();
Actions.ActOnEndProgramUnit();
return false;
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index 25bc34be0d..64d9ad4098 100644
--- a/lib/Sema/Sema.cpp
+++ b/lib/Sema/Sema.cpp
@@ -16,10 +16,11 @@
#include "flang/AST/ASTContext.h"
#include "flang/AST/Decl.h"
#include "flang/AST/Stmt.h"
+#include "flang/Basic/Diagnostic.h"
using namespace flang;
-Sema::Sema(ASTContext &ctxt, llvm::SourceMgr &sm)
- : Context(ctxt), SrcMgr(sm), CurContext(0) {}
+Sema::Sema(ASTContext &ctxt, Diagnostic &D)
+ : Context(ctxt), Diags(D), CurContext(0) {}
Sema::~Sema() {}
@@ -46,13 +47,29 @@ void Sema::ActOnTranslationUnit() {
PushDeclContext(Context.getTranslationUnitDecl());
}
+void Sema::ActOnEndProgramUnit() {
+ PopDeclContext();
+}
+
void Sema::ActOnMainProgram(const DeclarationNameInfo &NameInfo) {
PushDeclContext(MainProgramDecl::Create(Context,
Context.getTranslationUnitDecl(),
NameInfo));
}
-void Sema::ActOnEndProgramUnit() {
+void Sema::ActOnEndMainProgram(const DeclarationNameInfo &EndNameInfo) {
+ assert(CurContext && "DeclContext imbalance!");
+ StringRef ProgName = cast<MainProgramDecl>(CurContext)->getName();
+ if (ProgName.empty()) return;
+
+ const IdentifierInfo *ID = EndNameInfo.getName().getAsIdentifierInfo();
+ if (!ID) return;
+
+ if (ProgName != ID->getName())
+ Diags.ReportError(EndNameInfo.getLoc(),
+ llvm::Twine("expected label '") +
+ ProgName + "' for END PROGRAM statement");
+
PopDeclContext();
}
diff --git a/tools/driver/Main.cpp b/tools/driver/Main.cpp
index a240ccc913..91ff99cc70 100644
--- a/tools/driver/Main.cpp
+++ b/tools/driver/Main.cpp
@@ -11,9 +11,9 @@
//
//===----------------------------------------------------------------------===//
-#include "flang/Basic/Actions.h"
#include "flang/Frontend/TextDiagnosticPrinter.h"
#include "flang/Parse/Parser.h"
+#include "flang/Sema/Sema.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MemoryBuffer.h"
@@ -78,8 +78,12 @@ static bool ParseFile(const std::string &Filename,
Opts.ReturnComments = ReturnComments;
TextDiagnosticPrinter TDP(SrcMgr);
Diagnostic Diag(&SrcMgr, &TDP, false);
+#if 0
PrintAction PA(Diag);
- Parser P(SrcMgr, Opts, Diag, PA);
+#endif
+ ASTContext Context(SrcMgr);
+ Sema SA(Context, Diag);
+ Parser P(SrcMgr, Opts, Diag, SA);
return P.ParseProgramUnits();
}
diff --git a/tools/driver/Makefile b/tools/driver/Makefile
index b2b28bacda..e0e22e0835 100644
--- a/tools/driver/Makefile
+++ b/tools/driver/Makefile
@@ -31,7 +31,7 @@ include $(FLANG_LEVEL)/../../Makefile.config
LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader bitwriter codegen \
ipo selectiondag
-USEDLIBS = flangAST.a flangFrontend.a flangParse.a flangBasic.a
+USEDLIBS = flangAST.a flangFrontend.a flangParse.a flangSema.a flangBasic.a
include $(FLANG_LEVEL)/Makefile