diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2011-09-24 17:48:25 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2011-09-24 17:48:25 +0000 |
commit | 6df6548e44a61c444bd85dccd0398cba047c79b1 (patch) | |
tree | 2758dd4121d78176521748827c41dd10fa78b9f4 /include/clang/Sema/MultiInitializer.h | |
parent | cea8d966f826554f0679595e9371e314e8dbc1cf (diff) |
Correctly parse braced member initializers (even in delayed parsing) and correctly pass
the information on to Sema. There's still an incorrectness in the way template instantiation
works now, but that is due to a far larger underlying representational problem.
Also add a test case for various list initialization cases of scalars, which test this
commit as well as the previous one.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140460 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Sema/MultiInitializer.h')
-rw-r--r-- | include/clang/Sema/MultiInitializer.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/include/clang/Sema/MultiInitializer.h b/include/clang/Sema/MultiInitializer.h new file mode 100644 index 0000000000..c44e3934db --- /dev/null +++ b/include/clang/Sema/MultiInitializer.h @@ -0,0 +1,72 @@ +//===--- MultiInitializer.h - Initializer expression group ------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the MultiInitializer class, which can represent a list +// initializer or a parentheses-wrapped group of expressions in a C++ member +// initializer. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_SEMA_MULTIINITIALIZER_H +#define LLVM_CLANG_SEMA_MULTIINITIALIZER_H + +#include "clang/Sema/Ownership.h" +#include "clang/Basic/SourceLocation.h" +#include "llvm/ADT/PointerUnion.h" + +namespace clang { + class ASTContext; + class Expr; + class InitializationKind; + class InitializedEntity; + class InitListExpr; + class Sema; + +class MultiInitializer { + llvm::PointerUnion<Expr*, Expr**> InitListOrExpressions; + unsigned NumInitializers; + SourceLocation LParenLoc; + SourceLocation RParenLoc; + + InitListExpr *getInitList() const; + Expr **getExpressions() const { return InitListOrExpressions.get<Expr**>(); } + +public: + MultiInitializer(Expr* InitList) + : InitListOrExpressions(InitList) + {} + + MultiInitializer(SourceLocation LParenLoc, Expr **Exprs, unsigned NumInits, + SourceLocation RParenLoc) + : InitListOrExpressions(Exprs), NumInitializers(NumInits), + LParenLoc(LParenLoc), RParenLoc(RParenLoc) + {} + + bool isInitializerList() const { return InitListOrExpressions.is<Expr*>(); } + + SourceLocation getStartLoc() const; + SourceLocation getEndLoc() const; + + typedef Expr **iterator; + iterator begin() const; + iterator end() const; + + bool isTypeDependent() const; + + bool DiagnoseUnexpandedParameterPack(Sema &SemaRef) const; + + // Return the InitListExpr or create a ParenListExpr. + Expr *CreateInitExpr(ASTContext &Ctx, QualType T) const; + + ExprResult PerformInit(Sema &SemaRef, InitializedEntity Entity, + InitializationKind Kind) const; +}; +} + +#endif |