summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/ASTContext.h3
-rw-r--r--clang/include/clang/Basic/Diagnostic.h10
-rw-r--r--clang/lib/Basic/Diagnostic.cpp4
-rw-r--r--clang/lib/Sema/Sema.cpp16
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.
OpenPOWER on IntegriCloud