On Mon, Aug 19, 2013 at 2:02 PM, David Blaikie <[email protected]> wrote: > Author: dblaikie > Date: Mon Aug 19 16:02:26 2013 > New Revision: 188707 > > URL: http://llvm.org/viewvc/llvm-project?rev=188707&view=rev > Log: > 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.
Added missing test in r188836. > > Modified: > cfe/trunk/lib/CodeGen/CodeGenFunction.cpp > cfe/trunk/lib/CodeGen/CodeGenFunction.h > cfe/trunk/lib/CodeGen/CodeGenModule.cpp > cfe/trunk/lib/CodeGen/CodeGenModule.h > cfe/trunk/lib/CodeGen/ModuleBuilder.cpp > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=188707&r1=188706&r2=188707&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Mon Aug 19 16:02:26 2013 > @@ -953,9 +953,8 @@ void CodeGenFunction::EmitBranchOnBoolEx > > /// 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 > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=188707&r1=188706&r2=188707&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Aug 19 16:02:26 2013 > @@ -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 > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=188707&r1=188706&r2=188707&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Aug 19 16:02:26 2013 > @@ -264,10 +264,7 @@ void CodeGenModule::Error(SourceLocation > > /// 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(con > > /// 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(cons > > /// 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; > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=188707&r1=188706&r2=188707&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Mon Aug 19 16:02:26 2013 > @@ -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 > > Modified: cfe/trunk/lib/CodeGen/ModuleBuilder.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ModuleBuilder.cpp?rev=188707&r1=188706&r2=188707&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/ModuleBuilder.cpp (original) > +++ cfe/trunk/lib/CodeGen/ModuleBuilder.cpp Mon Aug 19 16:02:26 2013 > @@ -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); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
