17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===//
27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//                     The LLVM Compiler Infrastructure
47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source
67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details.
77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//  This file defines common functions that both ASTReader and ASTWriter use.
117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "ASTCommon.h"
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/AST/DeclCXX.h"
165a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor#include "clang/AST/DeclObjC.h"
177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/IdentifierTable.h"
187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/ASTDeserializationListener.h"
197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h"
207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang;
227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Give ASTDeserializationListener's VTable a home.
247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeserializationListener::~ASTDeserializationListener() { }
257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::TypeIdx
277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned ID = 0;
297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (BT->getKind()) {
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Void:
3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_VOID_ID;
3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Bool:
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_BOOL_ID;
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Char_U:
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_CHAR_U_ID;
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::UChar:
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_UCHAR_ID;
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::UShort:
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_USHORT_ID;
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::UInt:
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_UINT_ID;
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::ULong:
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_ULONG_ID;
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::ULongLong:
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_ULONGLONG_ID;
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::UInt128:
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_UINT128_ID;
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Char_S:
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_CHAR_S_ID;
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::SChar:
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_SCHAR_ID;
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::WChar_S:
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::WChar_U:
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_WCHAR_ID;
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Short:
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_SHORT_ID;
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Int:
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_INT_ID;
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Long:
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_LONG_ID;
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::LongLong:
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_LONGLONG_ID;
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Int128:
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_INT128_ID;
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Half:
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_HALF_ID;
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Float:
8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_FLOAT_ID;
8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Double:
8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_DOUBLE_ID;
9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::LongDouble:
9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_LONGDOUBLE_ID;
9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case BuiltinType::Float128:
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ID = PREDEF_TYPE_FLOAT128_ID;
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    break;
9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::NullPtr:
9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_NULLPTR_ID;
9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Char16:
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_CHAR16_ID;
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Char32:
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_CHAR32_ID;
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Overload:
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_OVERLOAD_ID;
10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::BoundMember:
11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_BOUND_MEMBER;
11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::PseudoObject:
11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_PSEUDO_OBJECT;
11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::Dependent:
11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_DEPENDENT_ID;
11787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::UnknownAny:
11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_UNKNOWN_ANY;
12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::ARCUnbridgedCast:
12287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;
12387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
12487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::ObjCId:
12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_OBJC_ID;
12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::ObjCClass:
12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_OBJC_CLASS;
12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::ObjCSel:
13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_OBJC_SEL;
13287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case BuiltinType::Id: \
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ID = PREDEF_TYPE_##Id##_ID; \
13687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Basic/OpenCLImageTypes.def"
13887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLSampler:
13987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_SAMPLER_ID;
14087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLEvent:
14287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_EVENT_ID;
14387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLClkEvent:
14587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_CLK_EVENT_ID;
14687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
14787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLQueue:
14887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_QUEUE_ID;
14987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
15087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLNDRange:
15187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_NDRANGE_ID;
15287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
15387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLReserveID:
15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_RESERVE_ID_ID;
15587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::BuiltinFn:
15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_BUILTIN_FN;
15887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OMPArraySection:
16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ID = PREDEF_TYPE_OMP_ARRAY_SECTION;
16187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return TypeIdx(ID);
1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned serialization::ComputeHash(Selector Sel) {
1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned N = Sel.getNumArgs();
1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (N == 0)
1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ++N;
1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned R = 5381;
1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0; I != N; ++I)
1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      R = llvm::HashString(II->getName(), R);
1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return R;
1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1775a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
178e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregorconst DeclContext *
179e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregorserialization::getDefinitiveDeclContext(const DeclContext *DC) {
1805a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  switch (DC->getDeclKind()) {
1815a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // These entities may have multiple definitions.
1825a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::TranslationUnit:
1833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  case Decl::ExternCContext:
1845a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::Namespace:
1855a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::LinkageSpec:
1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
1875a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
1885a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // C/C++ tag types can only be defined in one place.
1895a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::Enum:
1905a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::Record:
1915a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor    if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
1925a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor      return Def;
1936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
1945a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
1955a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // FIXME: These can be defined in one place... except special member
1965a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // functions and out-of-line definitions.
1975a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::CXXRecord:
1985a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ClassTemplateSpecialization:
1995a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ClassTemplatePartialSpecialization:
2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
2015a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
2025a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // Each function, method, and block declaration is its own DeclContext.
2035a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::Function:
2045a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::CXXMethod:
2055a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::CXXConstructor:
2065a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::CXXDestructor:
2075a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::CXXConversion:
2085a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ObjCMethod:
2095a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::Block:
2106afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj  case Decl::Captured:
2115a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor    // Objective C categories, category implementations, and class
2125a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor    // implementations can only be defined in one place.
2135a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ObjCCategory:
2145a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ObjCCategoryImpl:
2155a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ObjCImplementation:
216e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor    return DC;
2175a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
2185a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ObjCProtocol:
2195a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor    if (const ObjCProtocolDecl *Def
2205a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor          = cast<ObjCProtocolDecl>(DC)->getDefinition())
2215a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor      return Def;
2226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
2235a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
2245a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // FIXME: These are defined in one place, but properties in class extensions
2255a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // end up being back-patched into the main interface. See
2265a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  // Sema::HandlePropertyInClassExtension for the offending code.
2275a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  case Decl::ObjCInterface:
2286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
2296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2305a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  default:
2315a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor    llvm_unreachable("Unhandled DeclContext in AST reader");
2325a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor  }
2335a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
234e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor  llvm_unreachable("Unhandled decl kind");
2359cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor}
2369cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor
2379cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregorbool serialization::isRedeclarableDeclKind(unsigned Kind) {
2389cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  switch (static_cast<Decl::Kind>(Kind)) {
2393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  case Decl::TranslationUnit:
2403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  case Decl::ExternCContext:
2413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    // Special case of a "merged" declaration.
2423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return true;
2433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
2449cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Namespace:
245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case Decl::NamespaceAlias:
2469cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Typedef:
2479cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::TypeAlias:
2489cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Enum:
2499cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Record:
2509cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::CXXRecord:
2519cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ClassTemplateSpecialization:
2529cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ClassTemplatePartialSpecialization:
253ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  case Decl::VarTemplateSpecialization:
254ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  case Decl::VarTemplatePartialSpecialization:
2559cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Function:
2569cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::CXXMethod:
2579cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::CXXConstructor:
2589cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::CXXDestructor:
2599cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::CXXConversion:
260f06a2893bc9778857295c64ee32b4a899a338480Richard Smith  case Decl::UsingShadow:
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::ConstructorUsingShadow:
2629cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Var:
2639cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::FunctionTemplate:
2649cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ClassTemplate:
265ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  case Decl::VarTemplate:
2669cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::TypeAliasTemplate:
2679cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCProtocol:
2689cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCInterface:
269684aa73192d92850a926870be62a1787eb5b7ed9Michael Han  case Decl::Empty:
2709cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor    return true;
2719cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor
2729cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  // Never redeclarable.
2739cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::UsingDirective:
2749cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Label:
2759cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::UnresolvedUsingTypename:
2769cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::TemplateTypeParm:
2779cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::EnumConstant:
2789cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::UnresolvedUsingValue:
2799cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::IndirectField:
2809cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Field:
28176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  case Decl::MSProperty:
2829cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCIvar:
2839cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCAtDefsField:
2849cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::NonTypeTemplateParm:
2859cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::TemplateTemplateParm:
2869cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Using:
2879cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCMethod:
2889cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCCategory:
2899cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCCategoryImpl:
2909cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCImplementation:
2919cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCProperty:
2929cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCCompatibleAlias:
2939cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::LinkageSpec:
2949cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ObjCPropertyImpl:
2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::PragmaComment:
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::PragmaDetectMismatch:
2979cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::FileScopeAsm:
2989cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::AccessSpec:
2999cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Friend:
3009cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::FriendTemplate:
3019cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::StaticAssert:
3029cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Block:
3036afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj  case Decl::Captured:
3049cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::ClassScopeFunctionSpecialization:
3059cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  case Decl::Import:
306c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  case Decl::OMPThreadPrivate:
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::OMPCapturedExpr:
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::OMPDeclareReduction:
30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case Decl::BuiltinTemplate:
3109cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor    return false;
311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // These indirectly derive from Redeclarable<T> but are not actually
313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // redeclarable.
314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case Decl::ImplicitParam:
315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case Decl::ParmVar:
31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case Decl::ObjCTypeParam:
317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return false;
3189cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  }
3195a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor
3209cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor  llvm_unreachable("Unhandled declaration kind");
3215a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor}
322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
3240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Friend declarations in dependent contexts aren't anonymous in the usual
3250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // sense, but they cannot be found by name lookup in their semantic context
3260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // (or indeed in any context), so we treat them as anonymous.
3270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  //
3280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // This doesn't apply to friend tag decls; Sema makes those available to name
3290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // lookup in the surrounding context.
3300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (D->getFriendObjectKind() &&
3310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
3320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // For function templates and class templates, the template is numbered and
3330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // not its pattern.
3340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (auto *FD = dyn_cast<FunctionDecl>(D))
3350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return !FD->getDescribedFunctionTemplate();
3360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (auto *RD = dyn_cast<CXXRecordDecl>(D))
3370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return !RD->getDescribedClassTemplate();
3380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    return true;
3390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
3400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Otherwise, we only care about anonymous class members.
342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->getDeclName() || !isa<CXXRecordDecl>(D->getLexicalDeclContext()))
343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return false;
344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return isa<TagDecl>(D) || isa<FieldDecl>(D);
345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
347