Have clang_getSpellingLocation() use the same logic as DiagnosticRenderer for plowing through macros.

This fixes a subtle bug reported in <rdar://problem/12584554> where a double-nested
macro could lead to an incorrect fixit location with live issues.

This fix also uncovers a bunch of subtle bugs in our indexer test cases which
are now fixed (mostly around source ranges for attributes).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170468 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Index/fix-its.m b/test/Index/fix-its.m
new file mode 100644
index 0000000..b307cf4
--- /dev/null
+++ b/test/Index/fix-its.m
@@ -0,0 +1,28 @@
+// RUN: c-index-test -test-load-source all %s -Wno-objc-root-class > %t 2>&1
+// RUN: FileCheck -input-file=%t %s
+
+@class NSString;
+void _rdar_12584554_A (volatile const void * object, volatile const void * selector, const char * functionName, const char * fileName, unsigned int lineNumber, NSString * msgFormat, ...);
+#define _rdar_12584554_B(self,_format_and_args_...) \
+    do{ _rdar_12584554_A(&self,&_cmd,__PRETTY_FUNCTION__,__FILE__,__LINE__, _format_and_args_); }while(0)
+#define _rdar_12584554_C(_format_and_args_...) \
+    _rdar_12584554_B(self, _format_and_args_)
+
+@interface RDar12584554
+@end
+
+// This test case tests that the "@" is properly inserted before the '"', even in the
+// presence of a nested macro chain.
+@implementation RDar12584554
+- (void) test:(int)result {
+    _rdar_12584554_C("ted");
+}
+@end
+
+// CHECK: FIX-IT: Insert "@" at 18:22
+// CHECK: fix-its.m:9:28: note: expanded from macro '_rdar_12584554_C'
+// CHECK: Number FIX-ITs = 0
+// CHECK: fix-its.m:7:77: note: expanded from macro '_rdar_12584554_B'
+// CHECK: Number FIX-ITs = 0
+// CHECK: fix-its.m:5:172: note: passing argument to parameter 'msgFormat' here
+// CHECK: Number FIX-ITs = 0