<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Fixed in r298441, thanks!</div><br class=""><div><blockquote type="cite" class=""><div class="">On Mar 21, 2017, at 2:05 PM, Vitaly Buka <<a href="mailto:vitalybuka@google.com" class="">vitalybuka@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Could you please take a look at these leaks<div class=""><br class=""></div><div class=""><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/3606/steps/check-clang%20asan/logs/stdio" class="">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/3606/steps/check-clang%20asan/logs/stdio</a><br class=""></div><div class=""><br class=""></div><div class=""><pre style="font-family: 'courier new', courier, monotype, monospace; font-size: inherit;" class=""><span class="inbox-inbox-stdout">
=================================================================
==32547==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x57a9a8 in __interceptor_malloc /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:64
    #1 0x7f0c8c1de918 in clang::cxstring::createDup(llvm::StringRef) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/libclang/CXString.cpp:99:40
    #2 0x7f0c8c1e1120 in clang_getTypeSpelling /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/libclang/CXType.cpp:273:10
    #3 0x5b5a53 in PrintCursor /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:718:24
    #4 0x5b4dc5 in FilteredPrintingVisitor /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:1116:5
    #5 0x7f0c8c115829 in clang::cxcursor::CursorVisitor::Visit(CXCursor, bool) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/libclang/CIndex.cpp:209:11
    #6 0x7f0c8c11d451 in clang::cxcursor::CursorVisitor::handleDeclForVisitation(clang::Decl const*) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/libclang/CIndex.cpp:666:7
    #7 0x7f0c8c11d9fb in clang::cxcursor::CursorVisitor::VisitDeclContext(clang::DeclContext*) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/libclang/CIndex.cpp:627:30
    #8 0x7f0c8c116ecf in clang::cxcursor::CursorVisitor::VisitChildren(CXCursor) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/libclang/CIndex.cpp:532:20
    #9 0x7f0c8c149ad6 in clang_visitChildren /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4172:20
    #10 0x5b8628 in perform_test_load /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:1601:5
    #11 0x5b8d4f in perform_test_load_source /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:1697:12
    #12 0x5c0e76 in cindextest_main /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:4373:14
    #13 0x5c5a1d in thread_runner /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:4444:25
    #14 0x7f0c90a47daf in ExecuteOnThread_Dispatch(void*) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/Support/Unix/Threading.inc:53:3
    #15 0x7f0c8919b6b9 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x76b9)

SUMMARY: AddressSanitizer: 24 byte(s) leaked in 1 allocation(s).

--
</span></pre><br class="inbox-inbox-Apple-interchange-newline"></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Tue, Mar 21, 2017 at 10:08 AM Argyrios Kyrtzidis via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: akirtzidis<br class="gmail_msg">
Date: Tue Mar 21 11:56:02 2017<br class="gmail_msg">
New Revision: 298392<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=298392&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=298392&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[index/AST] Determine if a typedef shares a name and spelling location with its underlying tag type<br class="gmail_msg">
<br class="gmail_msg">
In such a case, as when using the NS_ENUM macro, for indexing purposes treat the typedef as 'transparent',<br class="gmail_msg">
meaning we treat its references as symbols of the underlying tag symbol.<br class="gmail_msg">
Also provide a libclang API to check for such typedefs.<br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    cfe/trunk/include/clang-c/Index.h<br class="gmail_msg">
    cfe/trunk/include/clang/AST/Decl.h<br class="gmail_msg">
    cfe/trunk/lib/AST/Decl.cpp<br class="gmail_msg">
    cfe/trunk/lib/Index/IndexDecl.cpp<br class="gmail_msg">
    cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp<br class="gmail_msg">
    cfe/trunk/test/Index/Core/index-source.m<br class="gmail_msg">
    cfe/trunk/test/Index/get-cursor.m<br class="gmail_msg">
    cfe/trunk/tools/c-index-test/c-index-test.c<br class="gmail_msg">
    cfe/trunk/tools/libclang/CXType.cpp<br class="gmail_msg">
    cfe/trunk/tools/libclang/libclang.exports<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/include/clang-c/Index.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/include/clang-c/Index.h (original)<br class="gmail_msg">
+++ cfe/trunk/include/clang-c/Index.h Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -3437,6 +3437,16 @@ CINDEX_LINKAGE long long clang_getArrayS<br class="gmail_msg">
 CINDEX_LINKAGE CXType clang_Type_getNamedType(CXType T);<br class="gmail_msg">
<br class="gmail_msg">
 /**<br class="gmail_msg">
+ * \brief Determine if a typedef is 'transparent' tag.<br class="gmail_msg">
+ *<br class="gmail_msg">
+ * A typedef is considered 'transparent' if it shares a name and spelling<br class="gmail_msg">
+ * location with its underlying tag type, as is the case with the NS_ENUM macro.<br class="gmail_msg">
+ *<br class="gmail_msg">
+ * \returns non-zero if transparent and zero otherwise.<br class="gmail_msg">
+ */<br class="gmail_msg">
+CINDEX_LINKAGE unsigned clang_Type_isTransparentTagTypedef(CXType T);<br class="gmail_msg">
+<br class="gmail_msg">
+/**<br class="gmail_msg">
  * \brief List the possible error codes for \c clang_Type_getSizeOf,<br class="gmail_msg">
  *   \c clang_Type_getAlignOf, \c clang_Type_getOffsetOf and<br class="gmail_msg">
  *   \c clang_Cursor_getOffsetOf.<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/include/clang/AST/Decl.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/include/clang/AST/Decl.h (original)<br class="gmail_msg">
+++ cfe/trunk/include/clang/AST/Decl.h Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -2641,12 +2641,17 @@ class TypedefNameDecl : public TypeDecl,<br class="gmail_msg">
   typedef std::pair<TypeSourceInfo*, QualType> ModedTInfo;<br class="gmail_msg">
   llvm::PointerUnion<TypeSourceInfo*, ModedTInfo*> MaybeModedTInfo;<br class="gmail_msg">
<br class="gmail_msg">
+  // FIXME: This can be packed into the bitfields in Decl.<br class="gmail_msg">
+  /// If 0, we have not computed IsTransparentTag.<br class="gmail_msg">
+  /// Otherwise, IsTransparentTag is (CacheIsTransparentTag >> 1).<br class="gmail_msg">
+  mutable unsigned CacheIsTransparentTag : 2;<br class="gmail_msg">
+<br class="gmail_msg">
 protected:<br class="gmail_msg">
   TypedefNameDecl(Kind DK, ASTContext &C, DeclContext *DC,<br class="gmail_msg">
                   SourceLocation StartLoc, SourceLocation IdLoc,<br class="gmail_msg">
                   IdentifierInfo *Id, TypeSourceInfo *TInfo)<br class="gmail_msg">
       : TypeDecl(DK, DC, IdLoc, Id, StartLoc), redeclarable_base(C),<br class="gmail_msg">
-        MaybeModedTInfo(TInfo) {}<br class="gmail_msg">
+        MaybeModedTInfo(TInfo), CacheIsTransparentTag(0) {}<br class="gmail_msg">
<br class="gmail_msg">
   typedef Redeclarable<TypedefNameDecl> redeclarable_base;<br class="gmail_msg">
   TypedefNameDecl *getNextRedeclarationImpl() override {<br class="gmail_msg">
@@ -2699,11 +2704,22 @@ public:<br class="gmail_msg">
   /// this typedef declaration.<br class="gmail_msg">
   TagDecl *getAnonDeclWithTypedefName(bool AnyRedecl = false) const;<br class="gmail_msg">
<br class="gmail_msg">
+  /// Determines if this typedef shares a name and spelling location with its<br class="gmail_msg">
+  /// underlying tag type, as is the case with the NS_ENUM macro.<br class="gmail_msg">
+  bool isTransparentTag() const {<br class="gmail_msg">
+    if (CacheIsTransparentTag)<br class="gmail_msg">
+      return CacheIsTransparentTag & 0x2;<br class="gmail_msg">
+    return isTransparentTagSlow();<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
   // Implement isa/cast/dyncast/etc.<br class="gmail_msg">
   static bool classof(const Decl *D) { return classofKind(D->getKind()); }<br class="gmail_msg">
   static bool classofKind(Kind K) {<br class="gmail_msg">
     return K >= firstTypedefName && K <= lastTypedefName;<br class="gmail_msg">
   }<br class="gmail_msg">
+<br class="gmail_msg">
+private:<br class="gmail_msg">
+  bool isTransparentTagSlow() const;<br class="gmail_msg">
 };<br class="gmail_msg">
<br class="gmail_msg">
 /// TypedefDecl - Represents the declaration of a typedef-name via the 'typedef'<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/lib/AST/Decl.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/lib/AST/Decl.cpp (original)<br class="gmail_msg">
+++ cfe/trunk/lib/AST/Decl.cpp Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -4242,6 +4242,30 @@ TagDecl *TypedefNameDecl::getAnonDeclWit<br class="gmail_msg">
   return nullptr;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+bool TypedefNameDecl::isTransparentTagSlow() const {<br class="gmail_msg">
+  auto determineIsTransparent = [&]() {<br class="gmail_msg">
+    if (auto *TT = getUnderlyingType()->getAs<TagType>()) {<br class="gmail_msg">
+      if (auto *TD = TT->getDecl()) {<br class="gmail_msg">
+        if (TD->getName() != getName())<br class="gmail_msg">
+          return false;<br class="gmail_msg">
+        SourceLocation TTLoc = getLocation();<br class="gmail_msg">
+        SourceLocation TDLoc = TD->getLocation();<br class="gmail_msg">
+        if (!TTLoc.isMacroID() || !TDLoc.isMacroID())<br class="gmail_msg">
+          return false;<br class="gmail_msg">
+        SourceManager &SM = getASTContext().getSourceManager();<br class="gmail_msg">
+        return SM.getSpellingLoc(TTLoc) == SM.getSpellingLoc(TDLoc);<br class="gmail_msg">
+      }<br class="gmail_msg">
+    }<br class="gmail_msg">
+    return false;<br class="gmail_msg">
+  };<br class="gmail_msg">
+<br class="gmail_msg">
+  bool isTransparent = determineIsTransparent();<br class="gmail_msg">
+  CacheIsTransparentTag = 1;<br class="gmail_msg">
+  if (isTransparent)<br class="gmail_msg">
+    CacheIsTransparentTag |= 0x2;<br class="gmail_msg">
+  return isTransparent;<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 TypedefDecl *TypedefDecl::CreateDeserialized(ASTContext &C, unsigned ID) {<br class="gmail_msg">
   return new (C, ID) TypedefDecl(C, nullptr, SourceLocation(), SourceLocation(),<br class="gmail_msg">
                                  nullptr, nullptr);<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/lib/Index/IndexDecl.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexDecl.cpp?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexDecl.cpp?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/lib/Index/IndexDecl.cpp (original)<br class="gmail_msg">
+++ cfe/trunk/lib/Index/IndexDecl.cpp Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -231,8 +231,9 @@ public:<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
   bool VisitTypedefNameDecl(const TypedefNameDecl *D) {<br class="gmail_msg">
-    if (!IndexCtx.handleDecl(D))<br class="gmail_msg">
-      return false;<br class="gmail_msg">
+    if (!D->isTransparentTag())<br class="gmail_msg">
+      if (!IndexCtx.handleDecl(D))<br class="gmail_msg">
+        return false;<br class="gmail_msg">
     IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D);<br class="gmail_msg">
     return true;<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp (original)<br class="gmail_msg">
+++ cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -47,9 +47,15 @@ public:<br class="gmail_msg">
   } while (0)<br class="gmail_msg">
<br class="gmail_msg">
   bool VisitTypedefTypeLoc(TypedefTypeLoc TL) {<br class="gmail_msg">
+    SourceLocation Loc = TL.getNameLoc();<br class="gmail_msg">
+    TypedefNameDecl *ND = TL.getTypedefNameDecl();<br class="gmail_msg">
+    if (ND->isTransparentTag()) {<br class="gmail_msg">
+      TagDecl *Underlying = ND->getUnderlyingType()->getAsTagDecl();<br class="gmail_msg">
+      return IndexCtx.handleReference(Underlying, Loc, Parent,<br class="gmail_msg">
+                                      ParentDC, SymbolRoleSet(), Relations);<br class="gmail_msg">
+    }<br class="gmail_msg">
     if (IsBase) {<br class="gmail_msg">
-      SourceLocation Loc = TL.getNameLoc();<br class="gmail_msg">
-      TRY_TO(IndexCtx.handleReference(TL.getTypedefNameDecl(), Loc,<br class="gmail_msg">
+      TRY_TO(IndexCtx.handleReference(ND, Loc,<br class="gmail_msg">
                                       Parent, ParentDC, SymbolRoleSet()));<br class="gmail_msg">
       if (auto *CD = TL.getType()->getAsCXXRecordDecl()) {<br class="gmail_msg">
         TRY_TO(IndexCtx.handleReference(CD, Loc, Parent, ParentDC,<br class="gmail_msg">
@@ -57,7 +63,7 @@ public:<br class="gmail_msg">
                                         Relations));<br class="gmail_msg">
       }<br class="gmail_msg">
     } else {<br class="gmail_msg">
-      TRY_TO(IndexCtx.handleReference(TL.getTypedefNameDecl(), TL.getNameLoc(),<br class="gmail_msg">
+      TRY_TO(IndexCtx.handleReference(ND, Loc,<br class="gmail_msg">
                                       Parent, ParentDC, SymbolRoleSet(),<br class="gmail_msg">
                                       Relations));<br class="gmail_msg">
     }<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/test/Index/Core/index-source.m<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-source.m?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-source.m?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/test/Index/Core/index-source.m (original)<br class="gmail_msg">
+++ cfe/trunk/test/Index/Core/index-source.m Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -348,3 +348,39 @@ typedef MyGenCls<Base *><MyEnumerating><br class="gmail_msg">
 // CHECK: [[@LINE-1]]:3 | field/ObjC | _foo | c:objc(cs)I7@_foo | <no-cgname> | Ref,Writ,RelCont | rel: 1<br class="gmail_msg">
 }<br class="gmail_msg">
 @end<br class="gmail_msg">
+<br class="gmail_msg">
+#define NS_ENUM(_name, _type) enum _name:_type _name; enum _name : _type<br class="gmail_msg">
+<br class="gmail_msg">
+typedef NS_ENUM(AnotherEnum, int) {<br class="gmail_msg">
+// CHECK-NOT: [[@LINE-1]]:17 | type-alias/C | AnotherEnum |<br class="gmail_msg">
+// CHECK: [[@LINE-2]]:17 | enum/C | AnotherEnum | [[AnotherEnum_USR:.*]] | {{.*}} | Ref,RelCont | rel: 1<br class="gmail_msg">
+  AnotherEnumFirst = 0,<br class="gmail_msg">
+  AnotherEnumSecond = 1,<br class="gmail_msg">
+  AnotherEnumThird = 2,<br class="gmail_msg">
+};<br class="gmail_msg">
+<br class="gmail_msg">
+AnotherEnum anotherT;<br class="gmail_msg">
+// CHECK: [[@LINE-1]]:1 | enum/C | AnotherEnum | [[AnotherEnum_USR]] | {{.*}} | Ref,RelCont | rel: 1<br class="gmail_msg">
+enum AnotherEnum anotherE;<br class="gmail_msg">
+// CHECK: [[@LINE-1]]:6 | enum/C | AnotherEnum | [[AnotherEnum_USR]] | {{.*}} | Ref,RelCont | rel: 1<br class="gmail_msg">
+<br class="gmail_msg">
+#define TRANSPARENT(_name) struct _name _name; struct _name<br class="gmail_msg">
+#define OPAQUE(_name) struct _name *_name; struct _name<br class="gmail_msg">
+<br class="gmail_msg">
+typedef TRANSPARENT(AStruct) {<br class="gmail_msg">
+  int x;<br class="gmail_msg">
+};<br class="gmail_msg">
+<br class="gmail_msg">
+AStruct aStructT;<br class="gmail_msg">
+// CHECK: [[@LINE-1]]:1 | struct/C | AStruct | {{.*}} | {{.*}} | Ref,RelCont | rel: 1<br class="gmail_msg">
+struct AStruct aStructS;<br class="gmail_msg">
+// CHECK: [[@LINE-1]]:8 | struct/C | AStruct | {{.*}} | {{.*}} | Ref,RelCont | rel: 1<br class="gmail_msg">
+<br class="gmail_msg">
+typedef OPAQUE(Separate) {<br class="gmail_msg">
+  int x;<br class="gmail_msg">
+};<br class="gmail_msg">
+<br class="gmail_msg">
+Separate separateT;<br class="gmail_msg">
+// CHECK: [[@LINE-1]]:1 | type-alias/C | Separate | {{.*}} | {{.*}} | Ref,RelCont | rel: 1<br class="gmail_msg">
+struct Separate separateE;<br class="gmail_msg">
+// CHECK: [[@LINE-1]]:8 | struct/C | Separate | {{.*}} | {{.*}} | Ref,RelCont | rel: 1<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/test/Index/get-cursor.m<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/get-cursor.m?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/get-cursor.m?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/test/Index/get-cursor.m (original)<br class="gmail_msg">
+++ cfe/trunk/test/Index/get-cursor.m Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -129,6 +129,31 @@ void foo3(Test3 *test3) {<br class="gmail_msg">
 }<br class="gmail_msg">
 @end<br class="gmail_msg">
<br class="gmail_msg">
+#define NS_ENUM(_name, _type) enum _name : _type _name; enum _name : _type<br class="gmail_msg">
+typedef NS_ENUM(TestTransparent, int) {<br class="gmail_msg">
+  TestTransparentFirst = 0,<br class="gmail_msg">
+  TestTransparentSecond = 1,<br class="gmail_msg">
+};<br class="gmail_msg">
+typedef enum TestTransparent NotTransparent;<br class="gmail_msg">
+<br class="gmail_msg">
+TestTransparent transparentTypedef;<br class="gmail_msg">
+enum TestTransparent transparentUnderlying;<br class="gmail_msg">
+NotTransparent opaqueTypedef;<br class="gmail_msg">
+<br class="gmail_msg">
+#define MY_ENUM(_name, _type) enum _name : _type _name##_t; enum _name : _type<br class="gmail_msg">
+typedef MY_ENUM(TokenPaste, int) {<br class="gmail_msg">
+  TokenPasteFirst = 0,<br class="gmail_msg">
+};<br class="gmail_msg">
+TokenPaste_t opaqueTypedef2;<br class="gmail_msg">
+<br class="gmail_msg">
+#define MY_TYPE(_name) struct _name _name; struct _name<br class="gmail_msg">
+typedef MY_TYPE(SomeT) { int x; };<br class="gmail_msg">
+SomeT someVar;<br class="gmail_msg">
+<br class="gmail_msg">
+#define MY_TYPE2(_name) struct _name *_name; struct _name<br class="gmail_msg">
+typedef MY_TYPE2(SomeT2) { int x; };<br class="gmail_msg">
+SomeT2 someVar2;<br class="gmail_msg">
+<br class="gmail_msg">
<br class="gmail_msg">
 // RUN: c-index-test -cursor-at=%s:4:28 -cursor-at=%s:5:28 %s | FileCheck -check-prefix=CHECK-PROP %s<br class="gmail_msg">
 // CHECK-PROP: ObjCPropertyDecl=foo1:4:26<br class="gmail_msg">
@@ -193,3 +218,11 @@ void foo3(Test3 *test3) {<br class="gmail_msg">
 // RUN: c-index-test -cursor-at=%s:127:8 %s | FileCheck -check-prefix=CHECK-RECEIVER-WITH-NULLABILITY %s<br class="gmail_msg">
 // RUN: c-index-test -cursor-at=%s:128:8 %s | FileCheck -check-prefix=CHECK-RECEIVER-WITH-NULLABILITY %s<br class="gmail_msg">
 // CHECK-RECEIVER-WITH-NULLABILITY: Receiver-type=ObjCId<br class="gmail_msg">
+<br class="gmail_msg">
+// RUN: c-index-test -cursor-at=%s:139:1 -cursor-at=%s:140:6 -cursor-at=%s:141:1 -cursor-at=%s:147:1 -cursor-at=%s:151:1 -cursor-at=%s:155:1 %s | FileCheck -check-prefix=CHECK-TRANSPARENT %s<br class="gmail_msg">
+// CHECK-TRANSPARENT: 139:1 TypeRef=TestTransparent:133:17 (Transparent: enum TestTransparent) Extent=[139:1 - 139:16] Spelling=TestTransparent ([139:1 - 139:16])<br class="gmail_msg">
+// CHECK-TRANSPARENT: 140:6 TypeRef=enum TestTransparent:133:17 Extent=[140:6 - 140:21] Spelling=enum TestTransparent ([140:6 - 140:21])<br class="gmail_msg">
+// CHECK-TRANSPARENT: 141:1 TypeRef=NotTransparent:137:30 Extent=[141:1 - 141:15] Spelling=NotTransparent ([141:1 - 141:15])<br class="gmail_msg">
+// CHECK-TRANSPARENT: 147:1 TypeRef=TokenPaste_t:144:9 Extent=[147:1 - 147:13] Spelling=TokenPaste_t ([147:1 - 147:13])<br class="gmail_msg">
+// CHECK-TRANSPARENT: 151:1 TypeRef=SomeT:150:17 (Transparent: struct SomeT) Extent=[151:1 - 151:6] Spelling=SomeT ([151:1 - 151:6])<br class="gmail_msg">
+// CHECK-TRANSPARENT: 155:1 TypeRef=SomeT2:154:18 Extent=[155:1 - 155:7] Spelling=SomeT2 ([155:1 - 155:7])<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/tools/c-index-test/c-index-test.c<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)<br class="gmail_msg">
+++ cfe/trunk/tools/c-index-test/c-index-test.c Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -710,6 +710,15 @@ static void PrintCursor(CXCursor Cursor,<br class="gmail_msg">
         clang_getSpellingLocation(Loc, 0, &line, &column, 0);<br class="gmail_msg">
         printf(":%d:%d", line, column);<br class="gmail_msg">
       }<br class="gmail_msg">
+<br class="gmail_msg">
+      if (clang_getCursorKind(Referenced) == CXCursor_TypedefDecl) {<br class="gmail_msg">
+        CXType T = clang_getCursorType(Referenced);<br class="gmail_msg">
+        if (clang_Type_isTransparentTagTypedef(T)) {<br class="gmail_msg">
+          CXType Underlying = clang_getTypedefDeclUnderlyingType(Referenced);<br class="gmail_msg">
+          CXString S = clang_getTypeSpelling(Underlying);<br class="gmail_msg">
+          printf(" (Transparent: %s)", clang_getCString(S));<br class="gmail_msg">
+        }<br class="gmail_msg">
+      }<br class="gmail_msg">
     }<br class="gmail_msg">
<br class="gmail_msg">
     if (clang_isCursorDefinition(Cursor))<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/tools/libclang/CXType.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXType.cpp?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXType.cpp?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/tools/libclang/CXType.cpp (original)<br class="gmail_msg">
+++ cfe/trunk/tools/libclang/CXType.cpp Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -1039,3 +1039,12 @@ CXType clang_Type_getNamedType(CXType CT<br class="gmail_msg">
<br class="gmail_msg">
   return MakeCXType(QualType(), GetTU(CT));<br class="gmail_msg">
 }<br class="gmail_msg">
+<br class="gmail_msg">
+unsigned clang_Type_isTransparentTagTypedef(CXType TT){<br class="gmail_msg">
+  QualType T = GetQualType(TT);<br class="gmail_msg">
+  if (auto *TT = dyn_cast_or_null<TypedefType>(T.getTypePtrOrNull())) {<br class="gmail_msg">
+    if (auto *D = TT->getDecl())<br class="gmail_msg">
+      return D->isTransparentTag();<br class="gmail_msg">
+  }<br class="gmail_msg">
+  return false;<br class="gmail_msg">
+}<br class="gmail_msg">
<br class="gmail_msg">
Modified: cfe/trunk/tools/libclang/libclang.exports<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=298392&r1=298391&r2=298392&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=298392&r1=298391&r2=298392&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- cfe/trunk/tools/libclang/libclang.exports (original)<br class="gmail_msg">
+++ cfe/trunk/tools/libclang/libclang.exports Tue Mar 21 11:56:02 2017<br class="gmail_msg">
@@ -88,6 +88,7 @@ clang_Type_getTemplateArgumentAsType<br class="gmail_msg">
 clang_Type_getCXXRefQualifier<br class="gmail_msg">
 clang_Type_visitFields<br class="gmail_msg">
 clang_Type_getNamedType<br class="gmail_msg">
+clang_Type_isTransparentTagTypedef<br class="gmail_msg">
 clang_VerbatimBlockLineComment_getText<br class="gmail_msg">
 clang_VerbatimLineComment_getText<br class="gmail_msg">
 clang_HTMLTagComment_getAsString<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
cfe-commits mailing list<br class="gmail_msg">
<a href="mailto:cfe-commits@lists.llvm.org" class="gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="gmail_msg">
</blockquote></div>
</div></blockquote></div><br class=""></body></html>