From: Chris Lattner Date: Thu, 19 Feb 2009 23:53:20 +0000 (+0000) Subject: replace a dirty hack with a clean solution. Too bad we can't X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=92dd386e3f05d176b45a638199d51f536bd9d1c4;p=clang replace a dirty hack with a clean solution. Too bad we can't use Blocks for our callbacks ;-) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65083 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 42b019df06..387120ea3d 100644 --- a/include/clang/AST/ASTContext.h +++ b/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/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index c6e91a9a46..db62ca95e7 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/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 &Output); + llvm::SmallVectorImpl &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 &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/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 83ccd22e28..893eae5d1a 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/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 &Output) { + llvm::SmallVectorImpl &Output, + void *Cookie) { const char *Str = ""; 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/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 1ffaf939ef..2bb6a17ac1 100644 --- a/lib/Sema/Sema.cpp +++ b/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 &Output) { + llvm::SmallVectorImpl &Output, + void *Cookie) { + ASTContext &Context = *static_cast(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(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.