g++-5 /home/stefan/src/llvm-build/bin/clang++
explicit mangled template function
namespace N {
  template<typename X>
  __attribute__((abi_tag("test")))
  void Name() { }
  template void Name<int>();
}
_ZN1N4NameB4testIiEEvv
void N::Name[abi:test]<int>()
_ZN1N4NameB4testIiEEvv
void N::Name[abi:test]<int>()
explicit mangled template function
namespace N {
  template<typename X>
  __attribute__((abi_tag("test")))
  void Name() { }
  struct __attribute__((abi_tag("test"))) Y { };
  template void Name<Y>();
}
_ZN1N4NameB4testINS_1YB4testEEEvv
void N::Name[abi:test]<N::Y[abi:test]>()
_ZN1N4NameB4testINS_1YB4testEEEvv
void N::Name[abi:test]<N::Y[abi:test]>()
typedef anonymous struct type as template parameter
namespace N {
  template<typename X>
  __attribute__((abi_tag("test")))
  void Name(X) { }
  typedef struct {
    int a;
  } Y;
  Y X;
  void foo() { Name(X); }
}
_ZN1N4NameB4testINS_1YEEEvT_
void N::Name[abi:test]<N::Y>(N::Y)
_ZN1N4NameB4testINS_1YEEEvT_
void N::Name[abi:test]<N::Y>(N::Y)
operator with abi tag
namespace N {
  struct Name;

  struct S {
    __attribute__((abi_tag("test")))
    S& operator=(Name const&);
  };

  S& S::operator=(Name const&) { return *this; }
}
_ZN1N1SaSB4testERKNS_4NameE
N::S::operator=[abi:test](N::Name const&)
_ZN1N1SaSB4testERKNS_4NameE
N::S::operator=[abi:test](N::Name const&)
cast operator to struct with abi tag
namespace N {
  struct
  __attribute__((abi_tag("test"))) Name { };

  struct S {
    operator Name();
  };

  S::operator Name() { return Name(); }
}
_ZN1N1ScvNS_4NameB4testEB4testEv
N::S::operator N::Name[abi:test][abi:test]()
_ZN1N1ScvNS_4NameB4testEB4testEv
N::S::operator N::Name[abi:test][abi:test]()
std::string variable
namespace std {
  template<typename CharT>
  struct char_traits { };

  template<typename T>
  struct allocator { };

  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    template<
      class CharT,
      class Traits = std::char_traits<CharT>,
      class Allocator = std::allocator<CharT>>
    struct basic_string {
      basic_string();
      basic_string(const CharT*);
    };
    using string = basic_string<char>;
  }
}
namespace N {
  std::string Name;
}
_ZN1N4NameB5cxx11E
N::Name[abi:cxx11]
_ZN1N4NameB5cxx11E
N::Name[abi:cxx11]
template variable explicit tag (C++-14)
namespace N {
  template<typename T>
  __attribute__((abi_tag("test")))
  T Name = 1;

  template unsigned int Name<unsigned int>;
}
_ZN1N4NameB4testIjEE
N::Name[abi:test]<unsigned int>
_ZN1N4NameB4testIjEE
N::Name[abi:test]<unsigned int>
template variable implicit tagged type using tagged template parameter (C++-14)
namespace std {
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String {
      String();
    };
  }
}
namespace N {
  // clang treats this with "internal linkage"
  template<typename T>
  T Name;

  template std::String Name<std::String>;
}
_ZGVN1N4NameINSt7__cxx116StringEEE
guard variable for N::Name<std::__cxx11::String>
_ZN1N4NameINSt7__cxx116StringEEE
N::Name<std::__cxx11::String>
Failed to compile/extract symbols
template variable implicit tagged type using untagged template parameter (C++-14)
namespace std {
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String {
      String();
    };
  }
}
namespace N {
  // clang treats this with "internal linkage"
  template<typename T>
  std::String Name;

  template std::String Name<int>;
}
_ZGVN1N4NameIiEE
guard variable for N::Name<int>
_ZN1N4NameIiEE
N::Name<int>
Failed to compile/extract symbols
cast operator to std::string
namespace std {
  template<typename CharT>
  struct char_traits { };

  template<typename T>
  struct allocator { };

  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    template<
      class CharT,
      class Traits = std::char_traits<CharT>,
      class Allocator = std::allocator<CharT>>
    struct basic_string {
      basic_string();
      basic_string(const CharT*);
    };
    using string = basic_string<char>;
  }
}
namespace N {
  struct Name {
    operator std::string();
  };

  Name::operator std::string() { return ""; }
}
_ZN1N4NamecvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEB5cxx11Ev
N::Name::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >[abi:cxx11]()
_ZN1N4NamecvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEB5cxx11Ev
N::Name::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >[abi:cxx11]()
cast operator to not implicit available tagged struct
namespace N {
  struct
  __attribute__((abi_tag("test"))) Result { };

  struct Name {
    operator Result();
  };

  Name::operator Result() { return Result(); }
}
_ZN1N4NamecvNS_6ResultB4testEB4testEv
N::Name::operator N::Result[abi:test][abi:test]()
_ZN1N4NamecvNS_6ResultB4testEB4testEv
N::Name::operator N::Result[abi:test][abi:test]()
cast operator to implicit available tagged struct
namespace N {
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Result { };

    struct Name {
      operator Result();
    };

    Name::operator Result() { return Result(); }
  }
}
_ZN1N6__test4NamecvNS0_6ResultEEv
N::__test::Name::operator N::__test::Result()
_ZN1N6__test4NamecvNS0_6ResultEEv
N::__test::Name::operator N::__test::Result()
cast operator to implicit tagged struct
namespace N {
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Result { };
  }

  struct Name {
    operator Result();
  };

  Name::operator Result() { return Result(); }
}
_ZN1N4NamecvNS_6__test6ResultEB4testEv
N::Name::operator N::__test::Result[abi:test]()
_ZN1N4NamecvNS_6__test6ResultEB4testEv
N::Name::operator N::__test::Result[abi:test]()
two local variables (visible implicit tag)
namespace std {
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String {
      String();
    };
  }
}
namespace N {
  inline void F() {
    {
      static std::String Name;
    }
    {
      static std::String Name;
    }
  }
  void F2() {
    // instantiate F()
    F();
  }
}
_ZGVZN1N1FEvE4Name
guard variable for N::F()::Name
_ZGVZN1N1FEvE4Name_0
guard variable for N::F()::Name
_ZZN1N1FEvE4NameB5cxx11
N::F()::Name[abi:cxx11]
_ZZN1N1FEvE4NameB5cxx11_0
N::F()::Name[abi:cxx11]
_ZGVZN1N1FEvE4Name
guard variable for N::F()::Name
_ZGVZN1N1FEvE4Name_0
guard variable for N::F()::Name
_ZZN1N1FEvE4NameB5cxx11
N::F()::Name[abi:cxx11]
_ZZN1N1FEvE4NameB5cxx11_0
N::F()::Name[abi:cxx11]
two local variables (hidden implicit tag)
namespace std {
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String {
      String();
    };
  }
}
namespace N {
  inline std::String F() {
    {
      static std::String Name;
    }
    {
      static std::String Name;
      return Name;
    }
  }
  void F2() {
    // instantiate F()
    F();
  }
}
_ZGVZN1N1FEvE4Name
guard variable for N::F()::Name
_ZGVZN1N1FEvE4Name_0
guard variable for N::F()::Name
_ZZN1N1FB5cxx11EvE4Name
N::F[abi:cxx11]()::Name
_ZZN1N1FB5cxx11EvE4Name_0
N::F[abi:cxx11]()::Name
_ZGVZN1N1FEvE4Name
guard variable for N::F()::Name
_ZGVZN1N1FEvE4Name_0
guard variable for N::F()::Name
_ZZN1N1FB5cxx11EvE4Name
N::F[abi:cxx11]()::Name
_ZZN1N1FB5cxx11EvE4Name_0
N::F[abi:cxx11]()::Name
two local variables in template function (visible implicit tag)
namespace std {
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String {
      String();
    };
  }
}
namespace N {
  template<typename T>
  void F() {
    {
      static std::String Name;
    }
    {
      static std::String Name;
    }
  }
  template void F<int>();
}
_ZGVZN1N1FIiEEvvE4Name
guard variable for void N::F<int>()::Name
_ZGVZN1N1FIiEEvvE4Name_0
guard variable for void N::F<int>()::Name
_ZZN1N1FIiEEvvE4NameB5cxx11
void N::F<int>()::Name[abi:cxx11]
_ZZN1N1FIiEEvvE4NameB5cxx11_0
void N::F<int>()::Name[abi:cxx11]
_ZGVZN1N1FIiEEvvE4Name
guard variable for void N::F<int>()::Name
_ZGVZN1N1FIiEEvvE4Name_0
guard variable for void N::F<int>()::Name
_ZZN1N1FIiEEvvE4NameB5cxx11
void N::F<int>()::Name[abi:cxx11]
_ZZN1N1FIiEEvvE4NameB5cxx11_0
void N::F<int>()::Name[abi:cxx11]
two local variables in template function (hidden implicit tag)
namespace std {
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String {
      String();
    };
  }
}
namespace N {
  template<typename T>
  std::String F() {
    {
      static std::String Name;
    }
    {
      static std::String Name;
      return Name;
    }
  }
  template std::String F<int>();
}
_ZGVZN1N1FIiEENSt7__cxx116StringEvE4Name
guard variable for std::__cxx11::String N::F<int>()::Name
_ZGVZN1N1FIiEENSt7__cxx116StringEvE4Name_0
guard variable for std::__cxx11::String N::F<int>()::Name
_ZZN1N1FIiEENSt7__cxx116StringEvE4NameB5cxx11
std::__cxx11::String N::F<int>()::Name[abi:cxx11]
_ZZN1N1FIiEENSt7__cxx116StringEvE4NameB5cxx11_0
std::__cxx11::String N::F<int>()::Name[abi:cxx11]
_ZGVZN1N1FIiEENSt7__cxx116StringEvE4Name
guard variable for std::__cxx11::String N::F<int>()::Name
_ZGVZN1N1FIiEENSt7__cxx116StringEvE4Name_0
guard variable for std::__cxx11::String N::F<int>()::Name
_ZZN1N1FIiEENSt7__cxx116StringEvE4NameB5cxx11
std::__cxx11::String N::F<int>()::Name[abi:cxx11]
_ZZN1N1FIiEENSt7__cxx116StringEvE4NameB5cxx11_0
std::__cxx11::String N::F<int>()::Name[abi:cxx11]
local string literals
namespace N {
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Result {
      const char *str;
    };
  }

  inline Result Name(const char *x = "abc") {
    {
      static const char *s = "xyz"; // no guard
      if (s == x) return Result{nullptr};
    }
    {
      static const char *s = x; // guarded
      if (s == x) return Result{nullptr};
      return Result{s};
    }
  };

  void F() {
    // instantiate Name()
    Name(nullptr);
  }
}
_ZGVZN1N4NameEPKcE1s_0
guard variable for N::Name(char const*)::s
_ZN1N4NameB4testEPKc
N::Name[abi:test](char const*)
_ZZN1N4NameB4testEPKcE1s
N::Name[abi:test](char const*)::s
_ZZN1N4NameB4testEPKcE1s_0
N::Name[abi:test](char const*)::s
_ZGVZN1N4NameEPKcE1s_0
guard variable for N::Name(char const*)::s
_ZN1N4NameB4testEPKc
N::Name[abi:test](char const*)
_ZZN1N4NameB4testEPKcE1s
N::Name[abi:test](char const*)::s
_ZZN1N4NameB4testEPKcE1s_0
N::Name[abi:test](char const*)::s
static var in method in local struct in method in local struct, one implicit tag in signature
namespace N {
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Result {
      const char *str;
    };
  }

  inline Result Name(Result p1) {
    struct T {
      Result F(Result p2) {
        struct S {
          Result F(Result p3) {
            static Result s3 = p3;
            return s3;
          }
        };
        static Result s2 = S().F(p2);
        return s2;
      }
    };
    static Result s1 = T().F(p1);
    return s1;
  }

  void F() {
    // instantiate Name()
    Name(Result());
  }
}
_ZGVZN1N4NameENS_6__test6ResultEE2s1
guard variable for N::Name(N::__test::Result)::s1
_ZGVZZN1N4NameENS_6__test6ResultEEN1T1FES1_E2s2
guard variable for N::Name(N::__test::Result)::T::F(N::__test::Result)::s2
_ZGVZZZN1N4NameENS_6__test6ResultEEN1T1FES1_EN1S1FES1_E2s3
guard variable for N::Name(N::__test::Result)::T::F(N::__test::Result)::S::F(N::__test::Result)::s3
_ZN1N4NameENS_6__test6ResultE
N::Name(N::__test::Result)
_ZZN1N4NameENS_6__test6ResultEE2s1B4test
N::Name(N::__test::Result)::s1[abi:test]
_ZZN1N4NameENS_6__test6ResultEEN1T1FES1_
N::Name(N::__test::Result)::T::F(N::__test::Result)
_ZZZN1N4NameENS_6__test6ResultEEN1T1FES1_E2s2B4test
N::Name(N::__test::Result)::T::F(N::__test::Result)::s2[abi:test]
_ZZZN1N4NameENS_6__test6ResultEEN1T1FES1_EN1S1FES1_
N::Name(N::__test::Result)::T::F(N::__test::Result)::S::F(N::__test::Result)
_ZZZZN1N4NameENS_6__test6ResultEEN1T1FES1_EN1S1FES1_E2s3B4test
N::Name(N::__test::Result)::T::F(N::__test::Result)::S::F(N::__test::Result)::s3[abi:test]
_ZGVZN1N4NameENS_6__test6ResultEE2s1
guard variable for N::Name(N::__test::Result)::s1
_ZGVZZN1N4NameENS_6__test6ResultEEN1T1FES1_E2s2
guard variable for N::Name(N::__test::Result)::T::F(N::__test::Result)::s2
_ZGVZZZN1N4NameENS_6__test6ResultEEN1T1FES1_EN1S1FES1_E2s3
guard variable for N::Name(N::__test::Result)::T::F(N::__test::Result)::S::F(N::__test::Result)::s3
_ZN1N4NameENS_6__test6ResultE
N::Name(N::__test::Result)
_ZZN1N4NameENS_6__test6ResultEE2s1B4test
N::Name(N::__test::Result)::s1[abi:test]
_ZZN1N4NameENS_6__test6ResultEEN1T1FB4testES1_
N::Name(N::__test::Result)::T::F[abi:test](N::__test::Result)
_ZZZN1N4NameENS_6__test6ResultEEN1T1FES1_E2s2B4test
N::Name(N::__test::Result)::T::F(N::__test::Result)::s2[abi:test]
_ZZZN1N4NameENS_6__test6ResultEEN1T1FES1_EN1S1FB4testES1_
N::Name(N::__test::Result)::T::F(N::__test::Result)::S::F[abi:test](N::__test::Result)
_ZZZZN1N4NameENS_6__test6ResultEEN1T1FES1_EN1S1FES1_E2s3B4test
N::Name(N::__test::Result)::T::F(N::__test::Result)::S::F(N::__test::Result)::s3[abi:test]
static var in method in local struct in method in local struct, one implicit tag
namespace N {
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Base { Base(); ~Base(); int state; };
    struct Type1 : Base { };
    struct Type2 : Base { };
    struct Type3 : Base { };
    struct String : Base { };
  }

  inline String Name() {
    struct T {
      Type3 F() {
        struct S {
          Type2 F() {
            static Type3 state3;
            static Type2 state2;
            static Type1 state1;
            return state2;
          }
        };
        static Type3 state3;
        static Type2 state2 = S().F();
        static String string;
        return state3;
      }
    };
    static Type3 state3 = T().F();
    static String result;
    return result;
  }

  void F() {
    // instantiate Name()
    Name();
  }
}
_ZGVZN1N4NameEvE6result
guard variable for N::Name()::result
_ZGVZN1N4NameEvE6state3
guard variable for N::Name()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6state2
guard variable for N::Name()::T::F()::state2
_ZGVZZN1N4NameEvEN1T1FEvE6state3
guard variable for N::Name()::T::F()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6string
guard variable for N::Name()::T::F()::string
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state1
guard variable for N::Name()::T::F()::S::F()::state1
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state2
guard variable for N::Name()::T::F()::S::F()::state2
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state3
guard variable for N::Name()::T::F()::S::F()::state3
_ZN1N4NameB4testEv
N::Name[abi:test]()
_ZZN1N4NameB4testEvE6result
N::Name[abi:test]()::result
_ZZN1N4NameB4testEvE6state3
N::Name[abi:test]()::state3
_ZZN1N4NameB4testEvEN1T1FEv
N::Name[abi:test]()::T::F()
_ZZZN1N4NameB4testEvEN1T1FEvE6state2
N::Name[abi:test]()::T::F()::state2
_ZZZN1N4NameB4testEvEN1T1FEvE6state3
N::Name[abi:test]()::T::F()::state3
_ZZZN1N4NameB4testEvEN1T1FEvE6string
N::Name[abi:test]()::T::F()::string
_ZZZN1N4NameB4testEvEN1T1FEvEN1S1FEv
N::Name[abi:test]()::T::F()::S::F()
_ZZZZN1N4NameB4testEvEN1T1FEvEN1S1FEvE6state1
N::Name[abi:test]()::T::F()::S::F()::state1
_ZZZZN1N4NameB4testEvEN1T1FEvEN1S1FEvE6state2
N::Name[abi:test]()::T::F()::S::F()::state2
_ZZZZN1N4NameB4testEvEN1T1FEvEN1S1FEvE6state3
N::Name[abi:test]()::T::F()::S::F()::state3
_ZGVZN1N4NameEvE6result
guard variable for N::Name()::result
_ZGVZN1N4NameEvE6state3
guard variable for N::Name()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6state2
guard variable for N::Name()::T::F()::state2
_ZGVZZN1N4NameEvEN1T1FEvE6state3
guard variable for N::Name()::T::F()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6string
guard variable for N::Name()::T::F()::string
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state1
guard variable for N::Name()::T::F()::S::F()::state1
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state2
guard variable for N::Name()::T::F()::S::F()::state2
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state3
guard variable for N::Name()::T::F()::S::F()::state3
_ZN1N4NameB4testEv
N::Name[abi:test]()
_ZZN1N4NameB4testEvE6result
N::Name[abi:test]()::result
_ZZN1N4NameB4testEvE6state3
N::Name[abi:test]()::state3
_ZZN1N4NameB4testEvEN1T1FEv
N::Name[abi:test]()::T::F()
_ZZZN1N4NameB4testEvEN1T1FEvE6state2
N::Name[abi:test]()::T::F()::state2
_ZZZN1N4NameB4testEvEN1T1FEvE6state3
N::Name[abi:test]()::T::F()::state3
_ZZZN1N4NameB4testEvEN1T1FEvE6string
N::Name[abi:test]()::T::F()::string
_ZZZN1N4NameB4testEvEN1T1FEvEN1S1FEv
N::Name[abi:test]()::T::F()::S::F()
_ZZZZN1N4NameB4testEvEN1T1FEvEN1S1FEvE6state1
N::Name[abi:test]()::T::F()::S::F()::state1
_ZZZZN1N4NameB4testEvEN1T1FEvEN1S1FEvE6state2
N::Name[abi:test]()::T::F()::S::F()::state2
_ZZZZN1N4NameB4testEvEN1T1FEvEN1S1FEvE6state3
N::Name[abi:test]()::T::F()::S::F()::state3
static var in method in local struct in method in local struct, four implicit tags
namespace N {
  struct Base { Base(); ~Base(); int state; };
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Type1 : Base { };
  }
  inline namespace __test2
  __attribute__((abi_tag("test2"))) {
    struct Type2 : Base { };
  }
  inline namespace __test3
  __attribute__((abi_tag("test3"))) {
    struct Type3 : Base { };
  }
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String : Base { String(); };
  }

  inline String Name() {
    struct T {
      Type3 F() {
        struct S {
          Type2 F() {
            static Type3 state3;
            static Type2 state2;
            static Type1 state1;
            return state2;
          }
        };
        static Type3 state3;
        static Type2 state2 = S().F();
        static String string;
        return state3;
      }
    };
    static Type3 state3 = T().F();
    static String result;
    return result;
  }

  void F() {
    // instantiate Name()
    Name();
  }
}
_ZGVZN1N4NameEvE6result
guard variable for N::Name()::result
_ZGVZN1N4NameEvE6state3
guard variable for N::Name()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6state2
guard variable for N::Name()::T::F()::state2
_ZGVZZN1N4NameEvEN1T1FEvE6state3
guard variable for N::Name()::T::F()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6string
guard variable for N::Name()::T::F()::string
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state1
guard variable for N::Name()::T::F()::S::F()::state1
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state2
guard variable for N::Name()::T::F()::S::F()::state2
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state3
guard variable for N::Name()::T::F()::S::F()::state3
_ZN1N4NameB5cxx11Ev
N::Name[abi:cxx11]()
_ZZN1N4NameB5cxx11EvE6result
N::Name[abi:cxx11]()::result
_ZZN1N4NameB5cxx11EvE6state3B5test3
N::Name[abi:cxx11]()::state3[abi:test3]
_ZZN1N4NameB5cxx11EvEN1T1FB5test3Ev
N::Name[abi:cxx11]()::T::F[abi:test3]()
_ZZZN1N4NameB5cxx11EvEN1T1FEvE6state2B5test2
N::Name[abi:cxx11]()::T::F()::state2[abi:test2]
_ZZZN1N4NameB5cxx11EvEN1T1FEvE6state3B5test3
N::Name[abi:cxx11]()::T::F()::state3[abi:test3]
_ZZZN1N4NameB5cxx11EvEN1T1FEvE6string
N::Name[abi:cxx11]()::T::F()::string
_ZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FB5test2Ev
N::Name[abi:cxx11]()::T::F()::S::F[abi:test2]()
_ZZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FEvE6state1B4test
N::Name[abi:cxx11]()::T::F()::S::F()::state1[abi:test]
_ZZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FEvE6state2B5test2
N::Name[abi:cxx11]()::T::F()::S::F()::state2[abi:test2]
_ZZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FEvE6state3B5test3
N::Name[abi:cxx11]()::T::F()::S::F()::state3[abi:test3]
_ZGVZN1N4NameEvE6result
guard variable for N::Name()::result
_ZGVZN1N4NameEvE6state3
guard variable for N::Name()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6state2
guard variable for N::Name()::T::F()::state2
_ZGVZZN1N4NameEvEN1T1FEvE6state3
guard variable for N::Name()::T::F()::state3
_ZGVZZN1N4NameEvEN1T1FEvE6string
guard variable for N::Name()::T::F()::string
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state1
guard variable for N::Name()::T::F()::S::F()::state1
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state2
guard variable for N::Name()::T::F()::S::F()::state2
_ZGVZZZN1N4NameEvEN1T1FEvEN1S1FEvE6state3
guard variable for N::Name()::T::F()::S::F()::state3
_ZN1N4NameB5cxx11Ev
N::Name[abi:cxx11]()
_ZZN1N4NameB5cxx11EvE6result
N::Name[abi:cxx11]()::result
_ZZN1N4NameB5cxx11EvE6state3B5test3
N::Name[abi:cxx11]()::state3[abi:test3]
_ZZN1N4NameB5cxx11EvEN1T1FB5test3Ev
N::Name[abi:cxx11]()::T::F[abi:test3]()
_ZZZN1N4NameB5cxx11EvEN1T1FEvE6state2B5test2
N::Name[abi:cxx11]()::T::F()::state2[abi:test2]
_ZZZN1N4NameB5cxx11EvEN1T1FEvE6state3B5test3
N::Name[abi:cxx11]()::T::F()::state3[abi:test3]
_ZZZN1N4NameB5cxx11EvEN1T1FEvE6string
N::Name[abi:cxx11]()::T::F()::string
_ZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FB5test2Ev
N::Name[abi:cxx11]()::T::F()::S::F[abi:test2]()
_ZZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FEvE6state1B4test
N::Name[abi:cxx11]()::T::F()::S::F()::state1[abi:test]
_ZZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FEvE6state2B5test2
N::Name[abi:cxx11]()::T::F()::S::F()::state2[abi:test2]
_ZZZZN1N4NameB5cxx11EvEN1T1FEvEN1S1FEvE6state3B5test3
N::Name[abi:cxx11]()::T::F()::S::F()::state3[abi:test3]
static var in method in local struct in method in local struct, four tags, explicit tags on functions
namespace N {
  struct Base { Base(); ~Base(); int state; };
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Type1 : Base { };
  }
  inline namespace __test2
  __attribute__((abi_tag("test2"))) {
    struct Type2 : Base { };
  }
  inline namespace __test3
  __attribute__((abi_tag("test3"))) {
    struct Type3 : Base { };
  }
  inline namespace __cxx11
  __attribute__((abi_tag("cxx11"))) {
    struct String : Base { };
  }

  __attribute__((abi_tag("cxx11")))
  inline String Name() {
    struct T {
      __attribute__((abi_tag("test3")))
      Type3 F() {
        struct S {
          __attribute__((abi_tag("test2")))
          Type2 F() {
            static Type3 state3;
            static Type2 state2;
            static Type1 state1;
            return state2;
          }
        };
        static Type3 state3;
        static Type2 state2 = S().F();
        static String string;
        return state3;
      }
    };
    static Type3 state3 = T().F();
    static String result;
    return result;
  }

  void F() {
    // instantiate Name()
    Name();
  }
}
_ZGVZN1N4NameB5cxx11EvE6result
guard variable for N::Name[abi:cxx11]()::result
_ZGVZN1N4NameB5cxx11EvE6state3
guard variable for N::Name[abi:cxx11]()::state3
_ZGVZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state2
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::state2
_ZGVZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state3
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::state3
_ZGVZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6string
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::string
_ZGVZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state1
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state1
_ZGVZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state2
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state2
_ZGVZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state3
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state3
_ZN1N4NameB5cxx11Ev
N::Name[abi:cxx11]()
_ZZN1N4NameB5cxx11EvE6result
N::Name[abi:cxx11]()::result
_ZZN1N4NameB5cxx11EvE6state3B5test3
N::Name[abi:cxx11]()::state3[abi:test3]
_ZZN1N4NameB5cxx11EvEN1T1FB5test3Ev
N::Name[abi:cxx11]()::T::F[abi:test3]()
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state2B5test2
N::Name[abi:cxx11]()::T::F[abi:test3]()::state2[abi:test2]
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state3
N::Name[abi:cxx11]()::T::F[abi:test3]()::state3
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6string
N::Name[abi:cxx11]()::T::F[abi:test3]()::string
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2Ev
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()
_ZZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state1B4test
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state1[abi:test]
_ZZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state2
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state2
_ZZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state3
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state3
_ZGVZN1N4NameB5cxx11EvE6result
guard variable for N::Name[abi:cxx11]()::result
_ZGVZN1N4NameB5cxx11EvE6state3
guard variable for N::Name[abi:cxx11]()::state3
_ZGVZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state2
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::state2
_ZGVZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state3
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::state3
_ZGVZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6string
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::string
_ZGVZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state1
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state1
_ZGVZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state2
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state2
_ZGVZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state3
guard variable for N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state3
_ZN1N4NameB5cxx11Ev
N::Name[abi:cxx11]()
_ZZN1N4NameB5cxx11EvE6result
N::Name[abi:cxx11]()::result
_ZZN1N4NameB5cxx11EvE6state3B5test3
N::Name[abi:cxx11]()::state3[abi:test3]
_ZZN1N4NameB5cxx11EvEN1T1FB5test3Ev
N::Name[abi:cxx11]()::T::F[abi:test3]()
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state2B5test2
N::Name[abi:cxx11]()::T::F[abi:test3]()::state2[abi:test2]
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6state3
N::Name[abi:cxx11]()::T::F[abi:test3]()::state3
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvE6string
N::Name[abi:cxx11]()::T::F[abi:test3]()::string
_ZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2Ev
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()
_ZZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state1B4test
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state1[abi:test]
_ZZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state2
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state2
_ZZZZN1N4NameB5cxx11EvEN1T1FB5test3EvEN1S1FB5test2EvE6state3
N::Name[abi:cxx11]()::T::F[abi:test3]()::S::F[abi:test2]()::state3
method in local struct, tagged parameter
namespace N {
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Result { };
  }

  inline Result F(Result) {
    struct S {
      Result Name() {
        return Result();
      }
    };
    return S().Name();
  }

  void F2() {
    // instantiate F()
    F(Result());
  }
}
_ZZN1N1FENS_6__test6ResultEEN1S4NameB4testEv
N::F(N::__test::Result)::S::Name[abi:test]()
_ZZN1N1FENS_6__test6ResultEEN1S4NameB4testEv
N::F(N::__test::Result)::S::Name[abi:test]()
typedef anonymous struct type with abi tag as template parameter
namespace N {
  template<typename X>
  __attribute__((abi_tag("test")))
  void Name(X) { }
  typedef struct
  __attribute__((abi_tag("test"))) {
    int a;
  } Y;
  Y X;
  void F() { Name(X); }
}
_ZN1N4NameB4testINS_1YB4testEEEvT_
void N::Name[abi:test]<N::Y[abi:test]>(N::Y[abi:test])
_ZN1N4NameB4testINS_1YB4testEEEvT_
void N::Name[abi:test]<N::Y[abi:test]>(N::Y[abi:test])
call lambda for default argument of struct method
namespace N {
  struct S {
    inline void F(int i = []()
    __attribute__((abi_tag("test"))) {
      static int Name;
      return Name++;
    }()) {
    }
  };

  void F2() {
    // instantiate F()
    S().F();
  }
}
_ZZZN1N1S1FEiEd_NKUlvE_clB4testEvE4Name
N::S::F(int)::{default arg#1}::{lambda()#1}::operator()[abi:test]() const::Name
_ZZZN1N1S1FEiEd_NKUlvE_clB4testEvE4Name
N::S::F(int)::{default arg#1}::{lambda()#1}::operator()[abi:test]() const::Name
implicitly tagged return type in template function
namespace N {
  inline namespace __test
  __attribute__((abi_tag("test"))) {
    struct Result {
    };
  }

  template<typename T>
  Result Name(T) {
    return Result();
  };

  template Result Name<int>(int);
}
_ZN1N4NameIiEENS_6__test6ResultET_
N::__test::Result N::Name<int>(int)
_ZN1N4NameIiEENS_6__test6ResultET_
N::__test::Result N::Name<int>(int)