Add a RequireCompleteType variant that takes a PartialDiagnostic. The old RequireCompleteType now creates a PartialDiagnostic and calls the new function.

llvm-svn: 80165
This commit is contained in:
Anders Carlsson 2009-08-26 22:33:56 +00:00
parent 4fa923c5bc
commit f68079e77b
3 changed files with 30 additions and 5 deletions

View File

@ -19,6 +19,7 @@
#include "clang/AST/DeclObjC.h" #include "clang/AST/DeclObjC.h"
#include "clang/AST/Expr.h" #include "clang/AST/Expr.h"
#include "clang/Lex/Preprocessor.h" #include "clang/Lex/Preprocessor.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetInfo.h"
using namespace clang; using namespace clang;
@ -362,6 +363,15 @@ Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
} }
} }
Sema::SemaDiagnosticBuilder
Sema::Diag(SourceLocation Loc, const PartialDiagnostic& PD) {
SemaDiagnosticBuilder Builder(Diag(Loc, PD.getDiagID()));
PD.Emit(Builder);
return Builder;
}
void Sema::ActOnComment(SourceRange Comment) { void Sema::ActOnComment(SourceRange Comment) {
Context.Comments.push_back(Comment); Context.Comments.push_back(Comment);
} }

View File

@ -401,6 +401,9 @@ public:
return SemaDiagnosticBuilder(DB, *this, DiagID); return SemaDiagnosticBuilder(DB, *this, DiagID);
} }
/// \brief Emit a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, const PartialDiagnostic& PD);
virtual void DeleteExpr(ExprTy *E); virtual void DeleteExpr(ExprTy *E);
virtual void DeleteStmt(StmtTy *S); virtual void DeleteStmt(StmtTy *S);
@ -484,7 +487,9 @@ public:
SourceRange Range1 = SourceRange(), SourceRange Range1 = SourceRange(),
SourceRange Range2 = SourceRange(), SourceRange Range2 = SourceRange(),
QualType PrintType = QualType()); QualType PrintType = QualType());
bool RequireCompleteType(SourceLocation Loc, QualType T,
const PartialDiagnostic &PD);
QualType getQualifiedNameType(const CXXScopeSpec &SS, QualType T); QualType getQualifiedNameType(const CXXScopeSpec &SS, QualType T);
QualType BuildTypeofExprType(Expr *E); QualType BuildTypeofExprType(Expr *E);

View File

@ -18,6 +18,7 @@
#include "clang/AST/DeclTemplate.h" #include "clang/AST/DeclTemplate.h"
#include "clang/AST/TypeLoc.h" #include "clang/AST/TypeLoc.h"
#include "clang/AST/Expr.h" #include "clang/AST/Expr.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Parse/DeclSpec.h" #include "clang/Parse/DeclSpec.h"
#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallPtrSet.h"
using namespace clang; using namespace clang;
@ -1772,6 +1773,18 @@ void Sema::ProcessTypeAttributeList(QualType &Result, const AttributeList *AL) {
bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, unsigned diag, bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, unsigned diag,
SourceRange Range1, SourceRange Range2, SourceRange Range1, SourceRange Range2,
QualType PrintType) { QualType PrintType) {
if (!PrintType.isNull())
return RequireCompleteType(Loc, T,
PDiag(diag) << Range1 << Range2 << PrintType);
return RequireCompleteType(Loc, T,
PDiag(diag) << Range1 << Range2);
}
bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
const PartialDiagnostic &PD) {
unsigned diag = PD.getDiagID();
// FIXME: Add this assertion to help us flush out problems with // FIXME: Add this assertion to help us flush out problems with
// checking for dependent types and type-dependent expressions. // checking for dependent types and type-dependent expressions.
// //
@ -1816,11 +1829,8 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, unsigned diag,
if (diag == 0) if (diag == 0)
return true; return true;
if (PrintType.isNull())
PrintType = T;
// We have an incomplete type. Produce a diagnostic. // We have an incomplete type. Produce a diagnostic.
Diag(Loc, diag) << PrintType << Range1 << Range2; Diag(Loc, PD) << T;
// If the type was a forward declaration of a class/struct/union // If the type was a forward declaration of a class/struct/union
// type, produce // type, produce