[clang] 554ba99 - Revert "[Clang] Refactor "Designators" into a unified implementation [NFC]"

Bill Wendling via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 2 12:09:40 PST 2023


Author: Bill Wendling
Date: 2023-03-02T12:09:29-08:00
New Revision: 554ba996956559acdab777d18999b9985d95be4c

URL: https://github.com/llvm/llvm-project/commit/554ba996956559acdab777d18999b9985d95be4c
DIFF: https://github.com/llvm/llvm-project/commit/554ba996956559acdab777d18999b9985d95be4c.diff

LOG: Revert "[Clang] Refactor "Designators" into a unified implementation [NFC]"

This reverts commit 3c07db5f58e9852f35202f0fffed50fc7506f37b.

This caused https://github.com/llvm/llvm-project/issues/61118. Reverting
to ensure this is a pure NFC change.

Added: 
    clang/include/clang/Sema/Designator.h

Modified: 
    clang-tools-extra/clangd/FindTarget.cpp
    clang/include/clang/AST/Expr.h
    clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h
    clang/lib/AST/ASTImporter.cpp
    clang/lib/AST/Expr.cpp
    clang/lib/AST/StmtPrinter.cpp
    clang/lib/AST/StmtProfile.cpp
    clang/lib/Index/IndexBody.cpp
    clang/lib/Parse/ParseInit.cpp
    clang/lib/Sema/SemaCodeComplete.cpp
    clang/lib/Sema/SemaExpr.cpp
    clang/lib/Sema/SemaInit.cpp
    clang/lib/Sema/TreeTransform.h
    clang/lib/Serialization/ASTReaderStmt.cpp
    clang/lib/Serialization/ASTWriterStmt.cpp
    clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp
    clang/tools/libclang/CIndex.cpp

Removed: 
    clang/include/clang/AST/Designator.h


################################################################################
diff  --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp
index 9656d9ba34550..1caf70183fdb6 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -285,7 +285,8 @@ struct TargetFinder {
         Outer.add(CCE->getConstructor(), Flags);
       }
       void VisitDesignatedInitExpr(const DesignatedInitExpr *DIE) {
-        for (const Designator &D : llvm::reverse(DIE->designators()))
+        for (const DesignatedInitExpr::Designator &D :
+             llvm::reverse(DIE->designators()))
           if (D.isFieldDesignator()) {
             Outer.add(D.getField(), Flags);
             // We don't know which designator was intended, we assume the outer.
@@ -800,7 +801,7 @@ llvm::SmallVector<ReferenceLoc> refInStmt(const Stmt *S,
     }
 
     void VisitDesignatedInitExpr(const DesignatedInitExpr *DIE) {
-      for (const Designator &D : DIE->designators()) {
+      for (const DesignatedInitExpr::Designator &D : DIE->designators()) {
         if (!D.isFieldDesignator())
           continue;
 

diff  --git a/clang/include/clang/AST/Designator.h b/clang/include/clang/AST/Designator.h
deleted file mode 100644
index c9884680da14c..0000000000000
--- a/clang/include/clang/AST/Designator.h
+++ /dev/null
@@ -1,326 +0,0 @@
-//===--- Designator.h - Initialization Designator ---------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines interfaces used to represent designators (i.e. C99
-// designated initializers) during parsing and sema.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_AST_DESIGNATOR_H
-#define LLVM_CLANG_AST_DESIGNATOR_H
-
-#include "clang/Basic/SourceLocation.h"
-#include "llvm/ADT/SmallVector.h"
-
-namespace clang {
-
-class Expr;
-class FieldDecl;
-class IdentifierInfo;
-class Sema;
-
-/// Designator - A designator in a C99 designated initializer.
-///
-/// This class is a discriminated union which holds the various
-/// 
diff erent sorts of designators possible. A Designation is an array of
-/// these.  An example of a designator are things like this:
-///
-///      [8] .field [47]        // C99 designation: 3 designators
-///      [8 ... 47]  field:     // GNU extensions: 2 designators
-///
-/// These occur in initializers, e.g.:
-///
-///      int a[10] = {2, 4, [8]=9, 10};
-///
-class Designator {
-  enum DesignatorKind {
-    FieldDesignator,
-    ArrayDesignatorExpr,
-    ArrayDesignatorInt,
-    ArrayRangeDesignatorExpr,
-    ArrayRangeDesignatorInt,
-  };
-
-  DesignatorKind Kind;
-
-  /// A field designator, e.g., ".x = 42".
-  class FieldDesignatorInfo {
-    /// Refers to the field that is being initialized. The low bit of this
-    /// field determines whether this is actually a pointer to an
-    /// IdentifierInfo (if 1) or a FieldDecl (if 0). When initially
-    /// constructed, a field designator will store an IdentifierInfo*. After
-    /// semantic analysis has resolved that name, the field designator will
-    /// instead store a FieldDecl*.
-    uintptr_t NameOrField;
-
-  public:
-    /// The location of the '.' in the designated initializer.
-    SourceLocation DotLoc;
-
-    /// The location of the field name in the designated initializer.
-    SourceLocation NameLoc;
-
-    FieldDesignatorInfo(const IdentifierInfo *II, SourceLocation DotLoc,
-                        SourceLocation NameLoc)
-        : NameOrField(reinterpret_cast<uintptr_t>(II) | 0x01), DotLoc(DotLoc),
-          NameLoc(NameLoc) {}
-
-    FieldDecl *getFieldDecl() const {
-      if (NameOrField & 0x01)
-        return nullptr;
-      return reinterpret_cast<FieldDecl *>(NameOrField);
-    }
-    const IdentifierInfo *getIdentifierInfo() const {
-      if (NameOrField & 0x01)
-        return reinterpret_cast<const IdentifierInfo *>(NameOrField & ~0x1);
-      return nullptr;
-    }
-
-    void set(FieldDecl *FD) { NameOrField = reinterpret_cast<uintptr_t>(FD); }
-  };
-
-  /// An array designator, e.g., "[42] = 0" and "[42 ... 50] = 1".
-  template <typename Ty> struct ArrayDesignatorInfo {
-    /// Location of the first and last index expression within the designated
-    /// initializer expression's list of subexpressions.
-    Ty Start;
-    Ty End;
-
-    /// The location of the '[' starting the array designator.
-    SourceLocation LBracketLoc;
-
-    /// The location of the ellipsis separating the start and end indices.
-    /// Only valid for GNU array-range designators.
-    SourceLocation EllipsisLoc;
-
-    /// The location of the ']' terminating the array designator.
-    SourceLocation RBracketLoc;
-
-    ArrayDesignatorInfo(Ty Start, Ty End, SourceLocation LBracketLoc,
-                        SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
-        : Start(Start), End(End), LBracketLoc(LBracketLoc),
-          EllipsisLoc(EllipsisLoc), RBracketLoc(RBracketLoc) {}
-
-    Ty getStart() const { return Start; }
-    Ty getEnd() const { return End; }
-  };
-
-  union {
-    FieldDesignatorInfo FieldInfo;
-    ArrayDesignatorInfo<Expr *> ArrayInfoExpr;
-    ArrayDesignatorInfo<unsigned> ArrayInfoInt;
-  };
-
-  Designator(DesignatorKind Kind) : Kind(Kind) {}
-
-public:
-  Designator() {}
-
-  bool isFieldDesignator() const { return Kind == FieldDesignator; }
-  bool isArrayDesignator() const {
-    return Kind == ArrayDesignatorExpr || Kind == ArrayDesignatorInt;
-  }
-  bool isArrayRangeDesignator() const {
-    return Kind == ArrayRangeDesignatorExpr || Kind == ArrayRangeDesignatorInt;
-  }
-
-  /// FieldDesignatorInfo:
-  static Designator CreateFieldDesignator(const IdentifierInfo *FieldName,
-                                          SourceLocation DotLoc,
-                                          SourceLocation NameLoc) {
-    Designator D(FieldDesignator);
-    new (&D.FieldInfo) FieldDesignatorInfo(FieldName, DotLoc, NameLoc);
-    return D;
-  }
-
-  const IdentifierInfo *getFieldName() const;
-
-  FieldDecl *getField() const {
-    assert(isFieldDesignator() && "Invalid accessor");
-    return FieldInfo.getFieldDecl();
-  }
-
-  void setField(FieldDecl *FD) {
-    assert(isFieldDesignator() && "Invalid accessor");
-    FieldInfo.set(FD);
-  }
-
-  SourceLocation getDotLoc() const {
-    assert(isFieldDesignator() && "Invalid accessor");
-    return FieldInfo.DotLoc;
-  }
-
-  SourceLocation getFieldLoc() const {
-    assert(isFieldDesignator() && "Invalid accessor");
-    return FieldInfo.NameLoc;
-  }
-
-  /// ArrayDesignatorInfo:
-  static Designator
-  CreateArrayDesignator(Expr *Start, SourceLocation LBracketLoc,
-                        SourceLocation RBracketLoc = SourceLocation()) {
-    Designator D(ArrayDesignatorExpr);
-    new (&D.ArrayInfoExpr) ArrayDesignatorInfo<Expr *>(
-        Start, nullptr, LBracketLoc, SourceLocation(), RBracketLoc);
-    return D;
-  }
-  static Designator
-  CreateArrayDesignator(unsigned Start, SourceLocation LBracketLoc,
-                        SourceLocation RBracketLoc = SourceLocation()) {
-    Designator D(ArrayDesignatorInt);
-    new (&D.ArrayInfoInt) ArrayDesignatorInfo<unsigned>(
-        Start, 0, LBracketLoc, SourceLocation(), RBracketLoc);
-    return D;
-  }
-
-  template <typename Ty = Expr *> Ty getArrayIndex() const {
-    assert(isArrayDesignator() && "Invalid accessor");
-    return ArrayInfoExpr.getStart();
-  }
-
-  /// ArrayRangeDesignatorInfo:
-  static Designator
-  CreateArrayRangeDesignator(Expr *Start, Expr *End, SourceLocation LBracketLoc,
-                             SourceLocation EllipsisLoc,
-                             SourceLocation RBracketLoc = SourceLocation()) {
-    Designator D(ArrayRangeDesignatorExpr);
-    new (&D.ArrayInfoExpr) ArrayDesignatorInfo<Expr *>(
-        Start, End, LBracketLoc, EllipsisLoc, RBracketLoc);
-    return D;
-  }
-  static Designator
-  CreateArrayRangeDesignator(unsigned Index, SourceLocation LBracketLoc,
-                             SourceLocation EllipsisLoc,
-                             SourceLocation RBracketLoc = SourceLocation()) {
-    Designator D(ArrayRangeDesignatorInt);
-    new (&D.ArrayInfoInt) ArrayDesignatorInfo<unsigned>(
-        Index, 0, LBracketLoc, EllipsisLoc, RBracketLoc);
-    return D;
-  }
-
-  Expr *getArrayRangeStart() const {
-    assert(isArrayRangeDesignator() && "Invalid accessor");
-    return ArrayInfoExpr.getStart();
-  }
-
-  Expr *getArrayRangeEnd() const {
-    assert(isArrayRangeDesignator() && "Invalid accessor");
-    return ArrayInfoExpr.getEnd();
-  }
-
-  SourceLocation getLBracketLoc() const {
-    switch (Kind) {
-    default:
-      break;
-    case ArrayDesignatorExpr:
-    case ArrayRangeDesignatorExpr:
-      return ArrayInfoExpr.LBracketLoc;
-    case ArrayDesignatorInt:
-    case ArrayRangeDesignatorInt:
-      return ArrayInfoInt.LBracketLoc;
-    }
-
-    assert(false && "Invalid accessor");
-    return SourceLocation();
-  }
-
-  SourceLocation getEllipsisLoc() const {
-    switch (Kind) {
-    default:
-      break;
-    case ArrayRangeDesignatorExpr:
-      return ArrayInfoExpr.EllipsisLoc;
-    case ArrayRangeDesignatorInt:
-      return ArrayInfoInt.EllipsisLoc;
-    }
-
-    assert(false && "Invalid accessor");
-    return SourceLocation();
-  }
-
-  SourceLocation getRBracketLoc() const {
-    switch (Kind) {
-    default:
-      break;
-    case ArrayDesignatorExpr:
-    case ArrayRangeDesignatorExpr:
-      return ArrayInfoExpr.RBracketLoc;
-    case ArrayDesignatorInt:
-    case ArrayRangeDesignatorInt:
-      return ArrayInfoInt.RBracketLoc;
-    }
-
-    assert(false && "Invalid accessor");
-    return SourceLocation();
-  }
-
-  void setRBracketLoc(SourceLocation RBracketLoc) {
-    switch (Kind) {
-    default:
-      assert(false && "Invalid accessor");
-      break;
-    case ArrayDesignatorExpr:
-    case ArrayRangeDesignatorExpr:
-      ArrayInfoExpr.RBracketLoc = RBracketLoc;
-      break;
-    case ArrayDesignatorInt:
-    case ArrayRangeDesignatorInt:
-      ArrayInfoInt.RBracketLoc = RBracketLoc;
-      break;
-    }
-  }
-
-  unsigned getFirstExprIndex() const {
-    if (Kind == ArrayDesignatorInt || Kind == ArrayRangeDesignatorInt)
-      return ArrayInfoInt.getStart();
-
-    assert(false && "Invalid accessor");
-    return 0;
-  }
-
-  /// Source location accessors.
-  SourceLocation getBeginLoc() const LLVM_READONLY {
-    if (isFieldDesignator())
-      return getDotLoc().isInvalid() ? getFieldLoc() : getDotLoc();
-    return getLBracketLoc();
-  }
-  SourceLocation getEndLoc() const LLVM_READONLY {
-    return isFieldDesignator() ? getFieldLoc() : getRBracketLoc();
-  }
-  SourceRange getSourceRange() const LLVM_READONLY {
-    return SourceRange(getBeginLoc(), getEndLoc());
-  }
-};
-
-/// Designation - Represent a full designation, which is a sequence of
-/// designators.  This class is mostly a helper for InitListDesignations.
-class Designation {
-  /// Designators - The actual designators for this initializer.
-  SmallVector<Designator, 2> Designators;
-
-public:
-  /// AddDesignator - Add a designator to the end of this list.
-  void AddDesignator(Designator D) { Designators.push_back(D); }
-
-  bool empty() const { return Designators.empty(); }
-
-  unsigned getNumDesignators() const { return Designators.size(); }
-
-  const Designator &getDesignator(unsigned Idx) const {
-    assert(Idx < getNumDesignators());
-    return Designators[Idx];
-  }
-  Designator &getDesignator(unsigned Idx) {
-    assert(Idx < getNumDesignators());
-    return Designators[Idx];
-  }
-};
-
-} // end namespace clang
-
-#endif

diff  --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 8bc18c025a0cb..df2573324b752 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -19,7 +19,6 @@
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclAccessPair.h"
 #include "clang/AST/DependenceFlags.h"
-#include "clang/AST/Designator.h"
 #include "clang/AST/OperationKinds.h"
 #include "clang/AST/Stmt.h"
 #include "clang/AST/TemplateBase.h"
@@ -5035,6 +5034,10 @@ class InitListExpr : public Expr {
 class DesignatedInitExpr final
     : public Expr,
       private llvm::TrailingObjects<DesignatedInitExpr, Stmt *> {
+public:
+  /// Forward declaration of the Designator class.
+  class Designator;
+
 private:
   /// The location of the '=' or ':' prior to the actual initializer
   /// expression.
@@ -5066,6 +5069,161 @@ class DesignatedInitExpr final
       NumDesignators(0), NumSubExprs(NumSubExprs), Designators(nullptr) { }
 
 public:
+  /// A field designator, e.g., ".x".
+  struct FieldDesignator {
+    /// Refers to the field that is being initialized. The low bit
+    /// of this field determines whether this is actually a pointer
+    /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When
+    /// initially constructed, a field designator will store an
+    /// IdentifierInfo*. After semantic analysis has resolved that
+    /// name, the field designator will instead store a FieldDecl*.
+    uintptr_t NameOrField;
+
+    /// The location of the '.' in the designated initializer.
+    SourceLocation DotLoc;
+
+    /// The location of the field name in the designated initializer.
+    SourceLocation FieldLoc;
+  };
+
+  /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
+  struct ArrayOrRangeDesignator {
+    /// Location of the first index expression within the designated
+    /// initializer expression's list of subexpressions.
+    unsigned Index;
+    /// The location of the '[' starting the array range designator.
+    SourceLocation LBracketLoc;
+    /// The location of the ellipsis separating the start and end
+    /// indices. Only valid for GNU array-range designators.
+    SourceLocation EllipsisLoc;
+    /// The location of the ']' terminating the array range designator.
+    SourceLocation RBracketLoc;
+  };
+
+  /// Represents a single C99 designator.
+  ///
+  /// @todo This class is infuriatingly similar to clang::Designator,
+  /// but minor 
diff erences (storing indices vs. storing pointers)
+  /// keep us from reusing it. Try harder, later, to rectify these
+  /// 
diff erences.
+  class Designator {
+    /// The kind of designator this describes.
+    enum {
+      FieldDesignator,
+      ArrayDesignator,
+      ArrayRangeDesignator
+    } Kind;
+
+    union {
+      /// A field designator, e.g., ".x".
+      struct FieldDesignator Field;
+      /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
+      struct ArrayOrRangeDesignator ArrayOrRange;
+    };
+    friend class DesignatedInitExpr;
+
+  public:
+    Designator() {}
+
+    /// Initializes a field designator.
+    Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc,
+               SourceLocation FieldLoc)
+      : Kind(FieldDesignator) {
+      new (&Field) DesignatedInitExpr::FieldDesignator;
+      Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01;
+      Field.DotLoc = DotLoc;
+      Field.FieldLoc = FieldLoc;
+    }
+
+    /// Initializes an array designator.
+    Designator(unsigned Index, SourceLocation LBracketLoc,
+               SourceLocation RBracketLoc)
+      : Kind(ArrayDesignator) {
+      new (&ArrayOrRange) DesignatedInitExpr::ArrayOrRangeDesignator;
+      ArrayOrRange.Index = Index;
+      ArrayOrRange.LBracketLoc = LBracketLoc;
+      ArrayOrRange.EllipsisLoc = SourceLocation();
+      ArrayOrRange.RBracketLoc = RBracketLoc;
+    }
+
+    /// Initializes a GNU array-range designator.
+    Designator(unsigned Index, SourceLocation LBracketLoc,
+               SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
+      : Kind(ArrayRangeDesignator) {
+      new (&ArrayOrRange) DesignatedInitExpr::ArrayOrRangeDesignator;
+      ArrayOrRange.Index = Index;
+      ArrayOrRange.LBracketLoc = LBracketLoc;
+      ArrayOrRange.EllipsisLoc = EllipsisLoc;
+      ArrayOrRange.RBracketLoc = RBracketLoc;
+    }
+
+    bool isFieldDesignator() const { return Kind == FieldDesignator; }
+    bool isArrayDesignator() const { return Kind == ArrayDesignator; }
+    bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
+
+    IdentifierInfo *getFieldName() const;
+
+    FieldDecl *getField() const {
+      assert(Kind == FieldDesignator && "Only valid on a field designator");
+      if (Field.NameOrField & 0x01)
+        return nullptr;
+      else
+        return reinterpret_cast<FieldDecl *>(Field.NameOrField);
+    }
+
+    void setField(FieldDecl *FD) {
+      assert(Kind == FieldDesignator && "Only valid on a field designator");
+      Field.NameOrField = reinterpret_cast<uintptr_t>(FD);
+    }
+
+    SourceLocation getDotLoc() const {
+      assert(Kind == FieldDesignator && "Only valid on a field designator");
+      return Field.DotLoc;
+    }
+
+    SourceLocation getFieldLoc() const {
+      assert(Kind == FieldDesignator && "Only valid on a field designator");
+      return Field.FieldLoc;
+    }
+
+    SourceLocation getLBracketLoc() const {
+      assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
+             "Only valid on an array or array-range designator");
+      return ArrayOrRange.LBracketLoc;
+    }
+
+    SourceLocation getRBracketLoc() const {
+      assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
+             "Only valid on an array or array-range designator");
+      return ArrayOrRange.RBracketLoc;
+    }
+
+    SourceLocation getEllipsisLoc() const {
+      assert(Kind == ArrayRangeDesignator &&
+             "Only valid on an array-range designator");
+      return ArrayOrRange.EllipsisLoc;
+    }
+
+    unsigned getFirstExprIndex() const {
+      assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
+             "Only valid on an array or array-range designator");
+      return ArrayOrRange.Index;
+    }
+
+    SourceLocation getBeginLoc() const LLVM_READONLY {
+      if (Kind == FieldDesignator)
+        return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc();
+      else
+        return getLBracketLoc();
+    }
+    SourceLocation getEndLoc() const LLVM_READONLY {
+      return Kind == FieldDesignator ? getFieldLoc() : getRBracketLoc();
+    }
+    SourceRange getSourceRange() const LLVM_READONLY {
+      return SourceRange(getBeginLoc(), getEndLoc());
+    }
+  };
+
   static DesignatedInitExpr *Create(const ASTContext &C,
                                     llvm::ArrayRef<Designator> Designators,
                                     ArrayRef<Expr*> IndexExprs,

diff  --git a/clang/include/clang/Sema/Designator.h b/clang/include/clang/Sema/Designator.h
new file mode 100644
index 0000000000000..84837bfeba5bb
--- /dev/null
+++ b/clang/include/clang/Sema/Designator.h
@@ -0,0 +1,214 @@
+//===--- Designator.h - Initialization Designator ---------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines interfaces used to represent designators (a la
+// C99 designated initializers) during parsing.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_SEMA_DESIGNATOR_H
+#define LLVM_CLANG_SEMA_DESIGNATOR_H
+
+#include "clang/Basic/SourceLocation.h"
+#include "llvm/ADT/SmallVector.h"
+
+namespace clang {
+
+class Expr;
+class IdentifierInfo;
+class Sema;
+
+/// Designator - A designator in a C99 designated initializer.
+///
+/// This class is a discriminated union which holds the various
+/// 
diff erent sorts of designators possible.  A Designation is an array of
+/// these.  An example of a designator are things like this:
+///     [8] .field [47]        // C99 designation: 3 designators
+///     [8 ... 47]  field:     // GNU extensions: 2 designators
+/// These occur in initializers, e.g.:
+///  int a[10] = {2, 4, [8]=9, 10};
+///
+class Designator {
+public:
+  enum DesignatorKind {
+    FieldDesignator, ArrayDesignator, ArrayRangeDesignator
+  };
+private:
+  Designator() {};
+
+  DesignatorKind Kind;
+
+  struct FieldDesignatorInfo {
+    const IdentifierInfo *II;
+    SourceLocation DotLoc;
+    SourceLocation NameLoc;
+  };
+  struct ArrayDesignatorInfo {
+    Expr *Index;
+    SourceLocation LBracketLoc;
+    mutable SourceLocation RBracketLoc;
+  };
+  struct ArrayRangeDesignatorInfo {
+    Expr *Start, *End;
+    SourceLocation LBracketLoc, EllipsisLoc;
+    mutable SourceLocation RBracketLoc;
+  };
+
+  union {
+    FieldDesignatorInfo FieldInfo;
+    ArrayDesignatorInfo ArrayInfo;
+    ArrayRangeDesignatorInfo ArrayRangeInfo;
+  };
+
+public:
+
+  DesignatorKind getKind() const { return Kind; }
+  bool isFieldDesignator() const { return Kind == FieldDesignator; }
+  bool isArrayDesignator() const { return Kind == ArrayDesignator; }
+  bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
+
+  const IdentifierInfo *getField() const {
+    assert(isFieldDesignator() && "Invalid accessor");
+    return FieldInfo.II;
+  }
+
+  SourceLocation getDotLoc() const {
+    assert(isFieldDesignator() && "Invalid accessor");
+    return FieldInfo.DotLoc;
+  }
+
+  SourceLocation getFieldLoc() const {
+    assert(isFieldDesignator() && "Invalid accessor");
+    return FieldInfo.NameLoc;
+  }
+
+  Expr *getArrayIndex() const {
+    assert(isArrayDesignator() && "Invalid accessor");
+    return ArrayInfo.Index;
+  }
+
+  Expr *getArrayRangeStart() const {
+    assert(isArrayRangeDesignator() && "Invalid accessor");
+    return ArrayRangeInfo.Start;
+  }
+  Expr *getArrayRangeEnd() const {
+    assert(isArrayRangeDesignator() && "Invalid accessor");
+    return ArrayRangeInfo.End;
+  }
+
+  SourceLocation getLBracketLoc() const {
+    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
+           "Invalid accessor");
+    if (isArrayDesignator())
+      return ArrayInfo.LBracketLoc;
+    else
+      return ArrayRangeInfo.LBracketLoc;
+  }
+
+  SourceLocation getRBracketLoc() const {
+    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
+           "Invalid accessor");
+    if (isArrayDesignator())
+      return ArrayInfo.RBracketLoc;
+    else
+      return ArrayRangeInfo.RBracketLoc;
+  }
+
+  SourceLocation getEllipsisLoc() const {
+    assert(isArrayRangeDesignator() && "Invalid accessor");
+    return ArrayRangeInfo.EllipsisLoc;
+  }
+
+  static Designator getField(const IdentifierInfo *II, SourceLocation DotLoc,
+                             SourceLocation NameLoc) {
+    Designator D;
+    D.Kind = FieldDesignator;
+    new (&D.FieldInfo) FieldDesignatorInfo;
+    D.FieldInfo.II = II;
+    D.FieldInfo.DotLoc = DotLoc;
+    D.FieldInfo.NameLoc = NameLoc;
+    return D;
+  }
+
+  static Designator getArray(Expr *Index,
+                             SourceLocation LBracketLoc) {
+    Designator D;
+    D.Kind = ArrayDesignator;
+    new (&D.ArrayInfo) ArrayDesignatorInfo;
+    D.ArrayInfo.Index = Index;
+    D.ArrayInfo.LBracketLoc = LBracketLoc;
+    D.ArrayInfo.RBracketLoc = SourceLocation();
+    return D;
+  }
+
+  static Designator getArrayRange(Expr *Start,
+                                  Expr *End,
+                                  SourceLocation LBracketLoc,
+                                  SourceLocation EllipsisLoc) {
+    Designator D;
+    D.Kind = ArrayRangeDesignator;
+    new (&D.ArrayRangeInfo) ArrayRangeDesignatorInfo;
+    D.ArrayRangeInfo.Start = Start;
+    D.ArrayRangeInfo.End = End;
+    D.ArrayRangeInfo.LBracketLoc = LBracketLoc;
+    D.ArrayRangeInfo.EllipsisLoc = EllipsisLoc;
+    D.ArrayRangeInfo.RBracketLoc = SourceLocation();
+    return D;
+  }
+
+  void setRBracketLoc(SourceLocation RBracketLoc) const {
+    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
+           "Invalid accessor");
+    if (isArrayDesignator())
+      ArrayInfo.RBracketLoc = RBracketLoc;
+    else
+      ArrayRangeInfo.RBracketLoc = RBracketLoc;
+  }
+
+  /// ClearExprs - Null out any expression references, which prevents
+  /// them from being 'delete'd later.
+  void ClearExprs(Sema &Actions) {}
+
+  /// FreeExprs - Release any unclaimed memory for the expressions in
+  /// this designator.
+  void FreeExprs(Sema &Actions) {}
+};
+
+
+/// Designation - Represent a full designation, which is a sequence of
+/// designators.  This class is mostly a helper for InitListDesignations.
+class Designation {
+  /// Designators - The actual designators for this initializer.
+  SmallVector<Designator, 2> Designators;
+
+public:
+  /// AddDesignator - Add a designator to the end of this list.
+  void AddDesignator(Designator D) {
+    Designators.push_back(D);
+  }
+
+  bool empty() const { return Designators.empty(); }
+
+  unsigned getNumDesignators() const { return Designators.size(); }
+  const Designator &getDesignator(unsigned Idx) const {
+    assert(Idx < Designators.size());
+    return Designators[Idx];
+  }
+
+  /// ClearExprs - Null out any expression references, which prevents them from
+  /// being 'delete'd later.
+  void ClearExprs(Sema &Actions) {}
+
+  /// FreeExprs - Release any unclaimed memory for the expressions in this
+  /// designation.
+  void FreeExprs(Sema &Actions) {}
+};
+
+} // end namespace clang
+
+#endif

diff  --git a/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h b/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h
index ead5a71bedc41..6fb2decf8614a 100644
--- a/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h
+++ b/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h
@@ -123,7 +123,7 @@ class RecursiveSymbolVisitor
   }
 
   bool VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
-    for (const Designator &D : E->designators()) {
+    for (const DesignatedInitExpr::Designator &D : E->designators()) {
       if (D.isFieldDesignator() && D.getField()) {
         const FieldDecl *Decl = D.getField();
         if (!visit(Decl, D.getFieldLoc(), D.getFieldLoc()))

diff  --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index 99f72d0a2fe64..4c173ebb10d1e 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -27,7 +27,6 @@
 #include "clang/AST/DeclTemplate.h"
 #include "clang/AST/DeclVisitor.h"
 #include "clang/AST/DeclarationName.h"
-#include "clang/AST/Designator.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExprObjC.h"
@@ -437,6 +436,8 @@ namespace clang {
     Expected<CXXCastPath> ImportCastPath(CastExpr *E);
     Expected<APValue> ImportAPValue(const APValue &FromValue);
 
+    using Designator = DesignatedInitExpr::Designator;
+
     /// What we should import from the definition.
     enum ImportDefinitionKind {
       /// Import the default subset of the definition, which might be
@@ -961,7 +962,9 @@ Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {
                               NumDecls);
 }
 
-template <> Expected<Designator> ASTNodeImporter::import(const Designator &D) {
+template <>
+Expected<ASTNodeImporter::Designator>
+ASTNodeImporter::import(const Designator &D) {
   if (D.isFieldDesignator()) {
     IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());
 
@@ -973,8 +976,7 @@ template <> Expected<Designator> ASTNodeImporter::import(const Designator &D) {
     if (!ToFieldLocOrErr)
       return ToFieldLocOrErr.takeError();
 
-    return Designator::CreateFieldDesignator(ToFieldName, *ToDotLocOrErr,
-                                             *ToFieldLocOrErr);
+    return Designator(ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
   }
 
   ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());
@@ -986,15 +988,15 @@ template <> Expected<Designator> ASTNodeImporter::import(const Designator &D) {
     return ToRBracketLocOrErr.takeError();
 
   if (D.isArrayDesignator())
-    return Designator::CreateArrayDesignator(
-        D.getFirstExprIndex(), *ToLBracketLocOrErr, *ToRBracketLocOrErr);
+    return Designator(D.getFirstExprIndex(),
+                      *ToLBracketLocOrErr, *ToRBracketLocOrErr);
 
   ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());
   if (!ToEllipsisLocOrErr)
     return ToEllipsisLocOrErr.takeError();
 
   assert(D.isArrayRangeDesignator());
-  return Designator::CreateArrayRangeDesignator(
+  return Designator(
       D.getFirstExprIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
       *ToRBracketLocOrErr);
 }

diff  --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 3d508ba4dc87c..67862a8692acd 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -4389,11 +4389,11 @@ GenericSelectionExpr::CreateEmpty(const ASTContext &Context,
 //  DesignatedInitExpr
 //===----------------------------------------------------------------------===//
 
-const IdentifierInfo *Designator::getFieldName() const {
-  assert(isFieldDesignator() && "Invalid accessor");
-  if (auto *II = FieldInfo.getIdentifierInfo())
-    return II;
-  return FieldInfo.getFieldDecl()->getIdentifier();
+IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() const {
+  assert(Kind == FieldDesignator && "Only valid on a field designator");
+  if (Field.NameOrField & 0x01)
+    return reinterpret_cast<IdentifierInfo *>(Field.NameOrField & ~0x01);
+  return getField()->getIdentifier();
 }
 
 DesignatedInitExpr::DesignatedInitExpr(const ASTContext &C, QualType Ty,
@@ -4468,9 +4468,14 @@ SourceRange DesignatedInitExpr::getDesignatorsSourceRange() const {
 }
 
 SourceLocation DesignatedInitExpr::getBeginLoc() const {
+  SourceLocation StartLoc;
   auto *DIE = const_cast<DesignatedInitExpr *>(this);
   Designator &First = *DIE->getDesignator(0);
-  return First.getBeginLoc();
+  if (First.isFieldDesignator())
+    StartLoc = GNUSyntax ? First.Field.FieldLoc : First.Field.DotLoc;
+  else
+    StartLoc = First.ArrayOrRange.LBracketLoc;
+  return StartLoc;
 }
 
 SourceLocation DesignatedInitExpr::getEndLoc() const {
@@ -4478,18 +4483,20 @@ SourceLocation DesignatedInitExpr::getEndLoc() const {
 }
 
 Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) const {
-  assert(D.isArrayDesignator() && "Requires array designator");
-  return getSubExpr(D.getFirstExprIndex() + 1);
+  assert(D.Kind == Designator::ArrayDesignator && "Requires array designator");
+  return getSubExpr(D.ArrayOrRange.Index + 1);
 }
 
 Expr *DesignatedInitExpr::getArrayRangeStart(const Designator &D) const {
-  assert(D.isArrayRangeDesignator() && "Requires array range designator");
-  return getSubExpr(D.getFirstExprIndex() + 1);
+  assert(D.Kind == Designator::ArrayRangeDesignator &&
+         "Requires array range designator");
+  return getSubExpr(D.ArrayOrRange.Index + 1);
 }
 
 Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator &D) const {
-  assert(D.isArrayRangeDesignator() && "Requires array range designator");
-  return getSubExpr(D.getFirstExprIndex() + 2);
+  assert(D.Kind == Designator::ArrayRangeDesignator &&
+         "Requires array range designator");
+  return getSubExpr(D.ArrayOrRange.Index + 2);
 }
 
 /// Replaces the designator at index @p Idx with the series

diff  --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index bc618e2e53d06..00fe2c5974c76 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -1737,10 +1737,10 @@ void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
 
 void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
   bool NeedsEquals = true;
-  for (const Designator &D : Node->designators()) {
+  for (const DesignatedInitExpr::Designator &D : Node->designators()) {
     if (D.isFieldDesignator()) {
       if (D.getDotLoc().isInvalid()) {
-        if (const IdentifierInfo *II = D.getFieldName()) {
+        if (IdentifierInfo *II = D.getFieldName()) {
           OS << II->getName() << ":";
           NeedsEquals = false;
         }

diff  --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index c12b5dad204a5..960cc4f4fc27b 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -1506,7 +1506,7 @@ void StmtProfiler::VisitInitListExpr(const InitListExpr *S) {
 void StmtProfiler::VisitDesignatedInitExpr(const DesignatedInitExpr *S) {
   VisitExpr(S);
   ID.AddBoolean(S->usesGNUSyntax());
-  for (const Designator &D : S->designators()) {
+  for (const DesignatedInitExpr::Designator &D : S->designators()) {
     if (D.isFieldDesignator()) {
       ID.AddInteger(0);
       VisitName(D.getFieldName());

diff  --git a/clang/lib/Index/IndexBody.cpp b/clang/lib/Index/IndexBody.cpp
index 023cd87bb2084..8b8235c133023 100644
--- a/clang/lib/Index/IndexBody.cpp
+++ b/clang/lib/Index/IndexBody.cpp
@@ -202,7 +202,7 @@ class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> {
   }
 
   bool VisitDesignatedInitExpr(DesignatedInitExpr *E) {
-    for (Designator &D : llvm::reverse(E->designators())) {
+    for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) {
       if (D.isFieldDesignator() && D.getField())
         return IndexCtx.handleReference(D.getField(), D.getFieldLoc(), Parent,
                                         ParentDC, SymbolRoleSet(), {}, E);
@@ -416,7 +416,7 @@ class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> {
     };
 
     auto visitSyntacticDesignatedInitExpr = [&](DesignatedInitExpr *E) -> bool {
-      for (Designator &D : llvm::reverse(E->designators())) {
+      for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) {
         if (D.isFieldDesignator() && D.getField())
           return IndexCtx.handleReference(D.getField(), D.getFieldLoc(),
                                           Parent, ParentDC, SymbolRoleSet(),

diff  --git a/clang/lib/Parse/ParseInit.cpp b/clang/lib/Parse/ParseInit.cpp
index 900927fd97fbc..af0c3b47958d2 100644
--- a/clang/lib/Parse/ParseInit.cpp
+++ b/clang/lib/Parse/ParseInit.cpp
@@ -10,11 +10,11 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "clang/AST/Designator.h"
 #include "clang/Basic/TokenKinds.h"
 #include "clang/Parse/ParseDiagnostic.h"
 #include "clang/Parse/Parser.h"
 #include "clang/Parse/RAIIObjectsForParser.h"
+#include "clang/Sema/Designator.h"
 #include "clang/Sema/Ownership.h"
 #include "clang/Sema/Scope.h"
 #include "llvm/ADT/STLExtras.h"
@@ -181,8 +181,7 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
                                       NewSyntax);
 
     Designation D;
-    D.AddDesignator(Designator::CreateFieldDesignator(
-        FieldName, SourceLocation(), NameLoc));
+    D.AddDesignator(Designator::getField(FieldName, SourceLocation(), NameLoc));
     PreferredType.enterDesignatedInitializer(
         Tok.getLocation(), DesignatorCompletion.PreferredBaseType, D);
     return Actions.ActOnDesignatedInitializer(D, ColonLoc, true,
@@ -211,8 +210,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
         return ExprError();
       }
 
-      Desig.AddDesignator(Designator::CreateFieldDesignator(
-          Tok.getIdentifierInfo(), DotLoc, Tok.getLocation()));
+      Desig.AddDesignator(Designator::getField(Tok.getIdentifierInfo(), DotLoc,
+                                               Tok.getLocation()));
       ConsumeToken(); // Eat the identifier.
       continue;
     }
@@ -361,8 +360,7 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
 
     // If this is a normal array designator, remember it.
     if (Tok.isNot(tok::ellipsis)) {
-      Desig.AddDesignator(
-          Designator::CreateArrayDesignator(Idx.get(), StartLoc));
+      Desig.AddDesignator(Designator::getArray(Idx.get(), StartLoc));
     } else {
       // Handle the gnu array range extension.
       Diag(Tok, diag::ext_gnu_array_range);
@@ -373,8 +371,9 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
         SkipUntil(tok::r_square, StopAtSemi);
         return RHS;
       }
-      Desig.AddDesignator(Designator::CreateArrayRangeDesignator(
-          Idx.get(), RHS.get(), StartLoc, EllipsisLoc));
+      Desig.AddDesignator(Designator::getArrayRange(Idx.get(),
+                                                    RHS.get(),
+                                                    StartLoc, EllipsisLoc));
     }
 
     T.consumeClose();

diff  --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index d5f906b1c7a93..144bbe150abb9 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -15,7 +15,6 @@
 #include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
-#include "clang/AST/Designator.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExprConcepts.h"
@@ -33,6 +32,7 @@
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Sema/CodeCompleteConsumer.h"
 #include "clang/Sema/DeclSpec.h"
+#include "clang/Sema/Designator.h"
 #include "clang/Sema/Lookup.h"
 #include "clang/Sema/Overload.h"
 #include "clang/Sema/ParsedAttr.h"
@@ -6217,7 +6217,7 @@ getNextAggregateIndexAfterDesignatedInit(const ResultCandidate &Aggregate,
 
   // Look for designated initializers.
   // They're in their syntactic form, not yet resolved to fields.
-  const IdentifierInfo *DesignatedFieldName = nullptr;
+  IdentifierInfo *DesignatedFieldName = nullptr;
   unsigned ArgsAfterDesignator = 0;
   for (const Expr *Arg : Args) {
     if (const auto *DIE = dyn_cast<DesignatedInitExpr>(Arg)) {
@@ -6423,7 +6423,7 @@ static QualType getDesignatedType(QualType BaseType, const Designation &Desig) {
       assert(D.isFieldDesignator());
       auto *RD = getAsRecordDecl(BaseType);
       if (RD && RD->isCompleteDefinition()) {
-        for (const auto *Member : RD->lookup(D.getFieldName()))
+        for (const auto *Member : RD->lookup(D.getField()))
           if (const FieldDecl *FD = llvm::dyn_cast<FieldDecl>(Member)) {
             NextType = FD->getType();
             break;

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ad834690893c2..3207f42aad63c 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -19,7 +19,6 @@
 #include "clang/AST/CXXInheritance.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
-#include "clang/AST/Designator.h"
 #include "clang/AST/EvaluatedExprVisitor.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
@@ -41,6 +40,7 @@
 #include "clang/Sema/AnalysisBasedWarnings.h"
 #include "clang/Sema/DeclSpec.h"
 #include "clang/Sema/DelayedDiagnostic.h"
+#include "clang/Sema/Designator.h"
 #include "clang/Sema/Initialization.h"
 #include "clang/Sema/Lookup.h"
 #include "clang/Sema/Overload.h"

diff  --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index 4df4715376593..ddb2b5cf5cd16 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -12,7 +12,6 @@
 
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/DeclObjC.h"
-#include "clang/AST/Designator.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExprObjC.h"
 #include "clang/AST/ExprOpenMP.h"
@@ -20,6 +19,7 @@
 #include "clang/Basic/CharInfo.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/TargetInfo.h"
+#include "clang/Sema/Designator.h"
 #include "clang/Sema/Initialization.h"
 #include "clang/Sema/Lookup.h"
 #include "clang/Sema/SemaInternal.h"
@@ -2340,17 +2340,19 @@ static void ExpandAnonymousFieldDesignator(Sema &SemaRef,
                                            DesignatedInitExpr *DIE,
                                            unsigned DesigIdx,
                                            IndirectFieldDecl *IndirectField) {
+  typedef DesignatedInitExpr::Designator Designator;
+
   // Build the replacement designators.
   SmallVector<Designator, 4> Replacements;
   for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(),
        PE = IndirectField->chain_end(); PI != PE; ++PI) {
     if (PI + 1 == PE)
-      Replacements.push_back(Designator::CreateFieldDesignator(
-          nullptr, DIE->getDesignator(DesigIdx)->getDotLoc(),
-          DIE->getDesignator(DesigIdx)->getFieldLoc()));
+      Replacements.push_back(Designator((IdentifierInfo *)nullptr,
+                                    DIE->getDesignator(DesigIdx)->getDotLoc(),
+                                DIE->getDesignator(DesigIdx)->getFieldLoc()));
     else
-      Replacements.push_back(Designator::CreateFieldDesignator(
-          nullptr, SourceLocation(), SourceLocation()));
+      Replacements.push_back(Designator((IdentifierInfo *)nullptr,
+                                        SourceLocation(), SourceLocation()));
     assert(isa<FieldDecl>(*PI));
     Replacements.back().setField(cast<FieldDecl>(*PI));
   }
@@ -2493,7 +2495,7 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
     return hadError && !prevHadError;
   }
 
-  Designator *D = DIE->getDesignator(DesigIdx);
+  DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx);
   bool IsFirstDesignator = (DesigIdx == 0);
   if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
     // Determine the structural initializer list that corresponds to the
@@ -2575,7 +2577,7 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
 
     FieldDecl *KnownField = D->getField();
     if (!KnownField) {
-      const IdentifierInfo *FieldName = D->getFieldName();
+      IdentifierInfo *FieldName = D->getFieldName();
       DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName);
       for (NamedDecl *ND : Lookup) {
         if (auto *FD = dyn_cast<FieldDecl>(ND)) {
@@ -2751,7 +2753,8 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
         // We can't designate an object within the flexible array
         // member (because GCC doesn't allow it).
         if (!VerifyOnly) {
-          Designator *NextD = DIE->getDesignator(DesigIdx + 1);
+          DesignatedInitExpr::Designator *NextD
+            = DIE->getDesignator(DesigIdx + 1);
           SemaRef.Diag(NextD->getBeginLoc(),
                        diag::err_designator_into_flexible_array_member)
               << SourceRange(NextD->getBeginLoc(), DIE->getEndLoc());
@@ -3211,32 +3214,40 @@ CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) {
 
 ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
                                             SourceLocation EqualOrColonLoc,
-                                            bool GNUSyntax, ExprResult Init) {
+                                            bool GNUSyntax,
+                                            ExprResult Init) {
+  typedef DesignatedInitExpr::Designator ASTDesignator;
+
   bool Invalid = false;
-  SmallVector<Designator, 32> Designators;
+  SmallVector<ASTDesignator, 32> Designators;
   SmallVector<Expr *, 32> InitExpressions;
 
   // Build designators and check array designator expressions.
   for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) {
     const Designator &D = Desig.getDesignator(Idx);
+    switch (D.getKind()) {
+    case Designator::FieldDesignator:
+      Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(),
+                                          D.getFieldLoc()));
+      break;
 
-    if (D.isFieldDesignator()) {
-      Designators.push_back(Designator::CreateFieldDesignator(
-          D.getFieldName(), D.getDotLoc(), D.getFieldLoc()));
-    } else if (D.isArrayDesignator()) {
+    case Designator::ArrayDesignator: {
       Expr *Index = static_cast<Expr *>(D.getArrayIndex());
       llvm::APSInt IndexValue;
-
       if (!Index->isTypeDependent() && !Index->isValueDependent())
         Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).get();
       if (!Index)
         Invalid = true;
       else {
-        Designators.push_back(Designator::CreateArrayDesignator(
-            InitExpressions.size(), D.getLBracketLoc(), D.getRBracketLoc()));
+        Designators.push_back(ASTDesignator(InitExpressions.size(),
+                                            D.getLBracketLoc(),
+                                            D.getRBracketLoc()));
         InitExpressions.push_back(Index);
       }
-    } else if (D.isArrayRangeDesignator()) {
+      break;
+    }
+
+    case Designator::ArrayRangeDesignator: {
       Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart());
       Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd());
       llvm::APSInt StartValue;
@@ -3245,11 +3256,9 @@ ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
                             StartIndex->isValueDependent();
       bool EndDependent = EndIndex->isTypeDependent() ||
                           EndIndex->isValueDependent();
-
       if (!StartDependent)
         StartIndex =
             CheckArrayDesignatorExpr(*this, StartIndex, StartValue).get();
-
       if (!EndDependent)
         EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).get();
 
@@ -3270,19 +3279,25 @@ ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
             << StartIndex->getSourceRange() << EndIndex->getSourceRange();
           Invalid = true;
         } else {
-          Designators.push_back(Designator::CreateArrayRangeDesignator(
-              InitExpressions.size(), D.getLBracketLoc(), D.getEllipsisLoc(),
-              D.getRBracketLoc()));
+          Designators.push_back(ASTDesignator(InitExpressions.size(),
+                                              D.getLBracketLoc(),
+                                              D.getEllipsisLoc(),
+                                              D.getRBracketLoc()));
           InitExpressions.push_back(StartIndex);
           InitExpressions.push_back(EndIndex);
         }
       }
+      break;
+    }
     }
   }
 
   if (Invalid || Init.isInvalid())
     return ExprError();
 
+  // Clear out the expressions within the designation.
+  Desig.ClearExprs(*this);
+
   return DesignatedInitExpr::Create(Context, Designators, InitExpressions,
                                     EqualOrColonLoc, GNUSyntax,
                                     Init.getAs<Expr>());

diff  --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 7e4fbdedc62cc..44e4a14b487be 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -18,10 +18,9 @@
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
-#include "clang/AST/Designator.h"
 #include "clang/AST/Expr.h"
-#include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExprConcepts.h"
+#include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExprObjC.h"
 #include "clang/AST/ExprOpenMP.h"
 #include "clang/AST/OpenMPClause.h"
@@ -31,6 +30,7 @@
 #include "clang/AST/StmtOpenMP.h"
 #include "clang/Basic/DiagnosticParse.h"
 #include "clang/Basic/OpenMPKinds.h"
+#include "clang/Sema/Designator.h"
 #include "clang/Sema/Lookup.h"
 #include "clang/Sema/Ownership.h"
 #include "clang/Sema/ParsedTemplate.h"
@@ -11604,10 +11604,11 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
   // transform the designators.
   SmallVector<Expr*, 4> ArrayExprs;
   bool ExprChanged = false;
-  for (const Designator &D : E->designators()) {
+  for (const DesignatedInitExpr::Designator &D : E->designators()) {
     if (D.isFieldDesignator()) {
-      Desig.AddDesignator(Designator::CreateFieldDesignator(
-          D.getFieldName(), D.getDotLoc(), D.getFieldLoc()));
+      Desig.AddDesignator(Designator::getField(D.getFieldName(),
+                                               D.getDotLoc(),
+                                               D.getFieldLoc()));
       if (D.getField()) {
         FieldDecl *Field = cast_or_null<FieldDecl>(
             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
@@ -11630,7 +11631,7 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
         return ExprError();
 
       Desig.AddDesignator(
-          Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc()));
+          Designator::getArray(Index.get(), D.getLBracketLoc()));
 
       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
       ArrayExprs.push_back(Index.get());
@@ -11647,8 +11648,10 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
     if (End.isInvalid())
       return ExprError();
 
-    Desig.AddDesignator(Designator::CreateArrayRangeDesignator(
-        Start.get(), End.get(), D.getLBracketLoc(), D.getEllipsisLoc()));
+    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
+                                                  End.get(),
+                                                  D.getLBracketLoc(),
+                                                  D.getEllipsisLoc()));
 
     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
                   End.get() != E->getArrayRangeEnd(D);

diff  --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 3eae047b63b4c..46d653c7f9407 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -1199,6 +1199,8 @@ void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
 }
 
 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
+  using Designator = DesignatedInitExpr::Designator;
+
   VisitExpr(E);
   unsigned NumSubExprs = Record.readInt();
   assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
@@ -1214,8 +1216,8 @@ void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
       auto *Field = readDeclAs<FieldDecl>();
       SourceLocation DotLoc = readSourceLocation();
       SourceLocation FieldLoc = readSourceLocation();
-      Designators.push_back(Designator::CreateFieldDesignator(
-          Field->getIdentifier(), DotLoc, FieldLoc));
+      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
+                                       FieldLoc));
       Designators.back().setField(Field);
       break;
     }
@@ -1224,8 +1226,7 @@ void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
       const IdentifierInfo *Name = Record.readIdentifier();
       SourceLocation DotLoc = readSourceLocation();
       SourceLocation FieldLoc = readSourceLocation();
-      Designators.push_back(
-          Designator::CreateFieldDesignator(Name, DotLoc, FieldLoc));
+      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
       break;
     }
 
@@ -1233,8 +1234,7 @@ void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
       unsigned Index = Record.readInt();
       SourceLocation LBracketLoc = readSourceLocation();
       SourceLocation RBracketLoc = readSourceLocation();
-      Designators.push_back(
-          Designator::CreateArrayDesignator(Index, LBracketLoc, RBracketLoc));
+      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
       break;
     }
 
@@ -1243,8 +1243,8 @@ void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
       SourceLocation LBracketLoc = readSourceLocation();
       SourceLocation EllipsisLoc = readSourceLocation();
       SourceLocation RBracketLoc = readSourceLocation();
-      Designators.push_back(Designator::CreateArrayRangeDesignator(
-          Index, LBracketLoc, EllipsisLoc, RBracketLoc));
+      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
+                                       RBracketLoc));
       break;
     }
     }

diff  --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index 3f6c93a68208a..b35a7cee5af20 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -1085,7 +1085,7 @@ void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
     Record.AddStmt(E->getSubExpr(I));
   Record.AddSourceLocation(E->getEqualOrColonLoc());
   Record.push_back(E->usesGNUSyntax());
-  for (const Designator &D : E->designators()) {
+  for (const DesignatedInitExpr::Designator &D : E->designators()) {
     if (D.isFieldDesignator()) {
       if (FieldDecl *Field = D.getField()) {
         Record.push_back(serialization::DESIG_FIELD_DECL);

diff  --git a/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp b/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp
index 03893ca974fcf..aecfffcbef1fa 100644
--- a/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp
+++ b/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp
@@ -227,7 +227,7 @@ class RenameLocFinder : public RecursiveASTVisitor<RenameLocFinder> {
   }
 
   bool VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
-    for (const Designator &D : E->designators()) {
+    for (const DesignatedInitExpr::Designator &D : E->designators()) {
       if (D.isFieldDesignator() && D.getField()) {
         const FieldDecl *Decl = D.getField();
         if (isInUSRSet(Decl)) {

diff  --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 0a3d2b082a32c..46c9cfae202e5 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -2854,7 +2854,8 @@ void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) {
 }
 void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
   AddStmt(E->getInit());
-  for (const Designator &D : llvm::reverse(E->designators())) {
+  for (const DesignatedInitExpr::Designator &D :
+       llvm::reverse(E->designators())) {
     if (D.isFieldDesignator()) {
       if (FieldDecl *Field = D.getField())
         AddMemberRef(Field, D.getFieldLoc());


        


More information about the cfe-commits mailing list