forked from OSchip/llvm-project
PR16933: Don't try to codegen things after we've seen errors.
Refactor the underlying code a bit to remove unnecessary calls to "hasErrorOccurred" & make them consistently at all the entry points to the IRGen ASTConsumer. llvm-svn: 188707
This commit is contained in:
parent
39587672b8
commit
4a9ec7b59d
|
@ -953,9 +953,8 @@ void CodeGenFunction::EmitBranchOnBoolExpr(const Expr *Cond,
|
|||
|
||||
/// ErrorUnsupported - Print out an error that codegen doesn't support the
|
||||
/// specified stmt yet.
|
||||
void CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type,
|
||||
bool OmitOnError) {
|
||||
CGM.ErrorUnsupported(S, Type, OmitOnError);
|
||||
void CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type) {
|
||||
CGM.ErrorUnsupported(S, Type);
|
||||
}
|
||||
|
||||
/// emitNonZeroVLAInit - Emit the "zero" initialization of a
|
||||
|
|
|
@ -1327,8 +1327,7 @@ public:
|
|||
|
||||
/// ErrorUnsupported - Print out an error that codegen doesn't support the
|
||||
/// specified stmt yet.
|
||||
void ErrorUnsupported(const Stmt *S, const char *Type,
|
||||
bool OmitOnError=false);
|
||||
void ErrorUnsupported(const Stmt *S, const char *Type);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Helpers
|
||||
|
|
|
@ -264,10 +264,7 @@ void CodeGenModule::Error(SourceLocation loc, StringRef error) {
|
|||
|
||||
/// ErrorUnsupported - Print out an error that codegen doesn't support the
|
||||
/// specified stmt yet.
|
||||
void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type,
|
||||
bool OmitOnError) {
|
||||
if (OmitOnError && getDiags().hasErrorOccurred())
|
||||
return;
|
||||
void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
|
||||
unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
|
||||
"cannot compile this %0 yet");
|
||||
std::string Msg = Type;
|
||||
|
@ -277,10 +274,7 @@ void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type,
|
|||
|
||||
/// ErrorUnsupported - Print out an error that codegen doesn't support the
|
||||
/// specified decl yet.
|
||||
void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type,
|
||||
bool OmitOnError) {
|
||||
if (OmitOnError && getDiags().hasErrorOccurred())
|
||||
return;
|
||||
void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
|
||||
unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
|
||||
"cannot compile this %0 yet");
|
||||
std::string Msg = Type;
|
||||
|
@ -2796,12 +2790,6 @@ void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
|
|||
|
||||
/// EmitTopLevelDecl - Emit code for a single top level declaration.
|
||||
void CodeGenModule::EmitTopLevelDecl(Decl *D) {
|
||||
// If an error has occurred, stop code generation, but continue
|
||||
// parsing and semantic analysis (to ensure all warnings and errors
|
||||
// are emitted).
|
||||
if (Diags.hasErrorOccurred())
|
||||
return;
|
||||
|
||||
// Ignore dependent declarations.
|
||||
if (D->getDeclContext() && D->getDeclContext()->isDependentContext())
|
||||
return;
|
||||
|
|
|
@ -852,17 +852,11 @@ public:
|
|||
|
||||
/// ErrorUnsupported - Print out an error that codegen doesn't support the
|
||||
/// specified stmt yet.
|
||||
/// \param OmitOnError - If true, then this error should only be emitted if no
|
||||
/// other errors have been reported.
|
||||
void ErrorUnsupported(const Stmt *S, const char *Type,
|
||||
bool OmitOnError=false);
|
||||
void ErrorUnsupported(const Stmt *S, const char *Type);
|
||||
|
||||
/// ErrorUnsupported - Print out an error that codegen doesn't support the
|
||||
/// specified decl yet.
|
||||
/// \param OmitOnError - If true, then this error should only be emitted if no
|
||||
/// other errors have been reported.
|
||||
void ErrorUnsupported(const Decl *D, const char *Type,
|
||||
bool OmitOnError=false);
|
||||
void ErrorUnsupported(const Decl *D, const char *Type);
|
||||
|
||||
/// SetInternalFunctionAttributes - Set the attributes on the LLVM
|
||||
/// function for the given decl and function info. This applies
|
||||
|
|
|
@ -66,10 +66,16 @@ namespace {
|
|||
}
|
||||
|
||||
virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
|
||||
if (Diags.hasErrorOccurred())
|
||||
return;
|
||||
|
||||
Builder->HandleCXXStaticMemberVarInstantiation(VD);
|
||||
}
|
||||
|
||||
virtual bool HandleTopLevelDecl(DeclGroupRef DG) {
|
||||
if (Diags.hasErrorOccurred())
|
||||
return true;
|
||||
|
||||
// Make sure to emit all elements of a Decl.
|
||||
for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
|
||||
Builder->EmitTopLevelDecl(*I);
|
||||
|
@ -81,6 +87,9 @@ namespace {
|
|||
/// client hack on the type, which can occur at any point in the file
|
||||
/// (because these can be defined in declspecs).
|
||||
virtual void HandleTagDeclDefinition(TagDecl *D) {
|
||||
if (Diags.hasErrorOccurred())
|
||||
return;
|
||||
|
||||
Builder->UpdateCompletedType(D);
|
||||
|
||||
// In C++, we may have member functions that need to be emitted at this
|
||||
|
@ -98,6 +107,9 @@ namespace {
|
|||
}
|
||||
|
||||
virtual void HandleTagDeclRequiredDefinition(const TagDecl *D) LLVM_OVERRIDE {
|
||||
if (Diags.hasErrorOccurred())
|
||||
return;
|
||||
|
||||
if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo())
|
||||
if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
|
||||
DI->completeRequiredType(RD);
|
||||
|
|
Loading…
Reference in New Issue