diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/AST/ASTContext.h | 3 | ||||
-rw-r--r-- | clang/include/clang/Basic/Diagnostic.h | 10 | ||||
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 16 |
4 files changed, 24 insertions, 9 deletions
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 42b019df06f..387120ea3d2 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -283,7 +283,8 @@ public: /// ObjCQualifiedInterfaceType type for the given interface decl and /// the conforming protocol list. QualType getObjCQualifiedInterfaceType(ObjCInterfaceDecl *Decl, - ObjCProtocolDecl **ProtocolList, unsigned NumProtocols); + ObjCProtocolDecl **ProtocolList, + unsigned NumProtocols); /// getObjCQualifiedIdType - Return an ObjCQualifiedIdType for a /// given 'id' and conforming protocol list. diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index c6e91a9a461..db62ca95e75 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -125,7 +125,9 @@ private: typedef void (*ArgToStringFnTy)(ArgumentKind Kind, intptr_t Val, const char *Modifier, unsigned ModifierLen, const char *Argument, unsigned ArgumentLen, - llvm::SmallVectorImpl<char> &Output); + llvm::SmallVectorImpl<char> &Output, + void *Cookie); + void *ArgToStringCookie; ArgToStringFnTy ArgToStringFn; public: explicit Diagnostic(DiagnosticClient *client = 0); @@ -202,11 +204,13 @@ public: const char *Modifier, unsigned ModLen, const char *Argument, unsigned ArgLen, llvm::SmallVectorImpl<char> &Output) const { - ArgToStringFn(Kind, Val, Modifier, ModLen, Argument, ArgLen, Output); + ArgToStringFn(Kind, Val, Modifier, ModLen, Argument, ArgLen, Output, + ArgToStringCookie); } - void SetArgToStringFn(ArgToStringFnTy Fn) { + void SetArgToStringFn(ArgToStringFnTy Fn, void *Cookie) { ArgToStringFn = Fn; + ArgToStringCookie = Cookie; } //===--------------------------------------------------------------------===// diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 83ccd22e284..893eae5d1a9 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -175,7 +175,8 @@ namespace clang { static void DummyArgToStringFn(Diagnostic::ArgumentKind AK, intptr_t QT, const char *Modifier, unsigned ML, const char *Argument, unsigned ArgLen, - llvm::SmallVectorImpl<char> &Output) { + llvm::SmallVectorImpl<char> &Output, + void *Cookie) { const char *Str = "<can't format argument>"; Output.append(Str, Str+strlen(Str)); } @@ -199,6 +200,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) { LastDiagLevel = Fatal; ArgToStringFn = DummyArgToStringFn; + ArgToStringCookie = 0; } Diagnostic::~Diagnostic() { diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 1ffaf939eff..2bb6a17ac10 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -24,7 +24,9 @@ using namespace clang; static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t Val, const char *Modifier, unsigned ModLen, const char *Argument, unsigned ArgLen, - llvm::SmallVectorImpl<char> &Output) { + llvm::SmallVectorImpl<char> &Output, + void *Cookie) { + ASTContext &Context = *static_cast<ASTContext*>(Cookie); std::string S; if (Kind == Diagnostic::ak_qualtype) { @@ -47,8 +49,14 @@ static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t Val, // it will turn into an attribute mess. People want their "vec4". !isa<VectorType>(DesugaredTy) && - // Don't desugar objc types. FIXME: THIS IS A HACK. - S != "id" && S != "Class") { + // Don't desugar magic Objective-C types. + Ty.getUnqualifiedType() != Context.getObjCIdType() && + Ty.getUnqualifiedType() != Context.getObjCSelType() && + Ty.getUnqualifiedType() != Context.getObjCProtoType() && + Ty.getUnqualifiedType() != Context.getObjCClassType() && + + // Not va_list. + Ty.getUnqualifiedType() != Context.getBuiltinVaListType()) { S = "'"+S+"' (aka '"; S += DesugaredTy.getAsString(); S += "')"; @@ -165,7 +173,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer) FieldCollector.reset(new CXXFieldCollector()); // Tell diagnostics how to render things from the AST library. - PP.getDiagnostics().SetArgToStringFn(ConvertArgToStringFn); + PP.getDiagnostics().SetArgToStringFn(ConvertArgToStringFn, &Context); } /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast. |