blob: 579fe37feb56757e92b62961ff1638b2d32881a2 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Sema.h - Semantic Analysis & AST Building --------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the Sema class, which performs semantic analysis and
11// builds ASTs.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_AST_SEMA_H
16#define LLVM_CLANG_AST_SEMA_H
17
Chris Lattner2a1e2ed2008-04-11 07:00:53 +000018#include "IdentifierResolver.h"
Argiris Kirtzidis38f16712008-07-01 10:37:29 +000019#include "CXXFieldCollector.h"
Douglas Gregord2baafd2008-10-21 16:13:35 +000020#include "SemaOverload.h"
Douglas Gregor78d70132009-01-14 22:20:51 +000021#include "clang/AST/DeclBase.h"
Douglas Gregorc3221aa2009-04-24 21:10:55 +000022#include "clang/AST/DeclObjC.h"
Anders Carlssona35faf92009-06-05 03:43:12 +000023#include "clang/AST/DeclTemplate.h"
Chris Lattner4b009652007-07-25 00:24:17 +000024#include "clang/Parse/Action.h"
Chris Lattner545f39e2009-01-29 05:15:15 +000025#include "clang/Sema/SemaDiagnostic.h"
Chris Lattner4b009652007-07-25 00:24:17 +000026#include "llvm/ADT/SmallVector.h"
Fariborz Jahanian67907bd2007-10-05 18:00:57 +000027#include "llvm/ADT/DenseSet.h"
Chris Lattnera7a191c2007-10-07 01:13:46 +000028#include "llvm/ADT/SmallPtrSet.h"
Argiris Kirtzidis38f16712008-07-01 10:37:29 +000029#include "llvm/ADT/OwningPtr.h"
Douglas Gregorb9ef0552009-01-16 00:38:09 +000030#include <string>
Douglas Gregorbb461502008-10-24 04:54:22 +000031#include <vector>
Chris Lattner4b009652007-07-25 00:24:17 +000032
Chris Lattner3429a812007-08-23 05:46:52 +000033namespace llvm {
34 class APSInt;
35}
36
Chris Lattner4b009652007-07-25 00:24:17 +000037namespace clang {
38 class ASTContext;
Chris Lattnera8c2d592008-02-06 00:46:58 +000039 class ASTConsumer;
Chris Lattner4b009652007-07-25 00:24:17 +000040 class Preprocessor;
41 class Decl;
Chris Lattnerf3874bc2008-04-06 04:47:34 +000042 class DeclContext;
Daniel Dunbar8d03cbe2008-08-11 03:27:53 +000043 class DeclSpec;
Douglas Gregorc3221aa2009-04-24 21:10:55 +000044 class ExternalSemaSource;
Steve Naroffe57c21a2008-04-01 23:04:06 +000045 class NamedDecl;
Sebastian Redl91f9b0a2008-12-13 16:23:55 +000046 class Stmt;
Chris Lattner4b009652007-07-25 00:24:17 +000047 class Expr;
Steve Naroff9091f3f2007-09-02 15:34:30 +000048 class InitListExpr;
Douglas Gregorc5a6bdc2009-01-22 00:58:24 +000049 class DesignatedInitExpr;
Chris Lattner83bd5eb2007-12-28 05:29:59 +000050 class CallExpr;
Douglas Gregor566782a2009-01-06 05:10:23 +000051 class DeclRefExpr;
Chris Lattner4b009652007-07-25 00:24:17 +000052 class VarDecl;
53 class ParmVarDecl;
54 class TypedefDecl;
55 class FunctionDecl;
56 class QualType;
Sebastian Redl9cc59542009-03-07 12:16:37 +000057 class LangOptions;
Chris Lattner4b009652007-07-25 00:24:17 +000058 class Token;
59 class IntegerLiteral;
Steve Naroff0d4e6ad2008-01-22 00:55:40 +000060 class StringLiteral;
Chris Lattner4b009652007-07-25 00:24:17 +000061 class ArrayType;
62 class LabelStmt;
63 class SwitchStmt;
Sebastian Redl3b1ef312009-04-27 21:33:24 +000064 class CXXTryStmt;
Nate Begemanaf6ed502008-04-18 23:10:10 +000065 class ExtVectorType;
Steve Naroff82113e32007-07-29 16:33:31 +000066 class TypedefDecl;
Douglas Gregor279272e2009-02-04 19:02:06 +000067 class TemplateDecl;
Douglas Gregorad964b32009-02-17 01:05:43 +000068 class TemplateArgument;
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +000069 class TemplateArgumentList;
Douglas Gregord406b032009-02-06 22:42:48 +000070 class TemplateParameterList;
Douglas Gregor35d81bb2009-02-09 23:23:08 +000071 class TemplateTemplateParmDecl;
Douglas Gregor58944ac2009-05-31 09:31:02 +000072 class ClassTemplatePartialSpecializationDecl;
Douglas Gregor0d93f692009-02-25 22:02:03 +000073 class ClassTemplateDecl;
Ted Kremenek42730c52008-01-07 19:49:32 +000074 class ObjCInterfaceDecl;
Steve Naroffe57c21a2008-04-01 23:04:06 +000075 class ObjCCompatibleAliasDecl;
Ted Kremenek42730c52008-01-07 19:49:32 +000076 class ObjCProtocolDecl;
Chris Lattner7cc13bf2009-03-01 00:56:52 +000077 class ObjCImplDecl;
Ted Kremenek42730c52008-01-07 19:49:32 +000078 class ObjCImplementationDecl;
79 class ObjCCategoryImplDecl;
80 class ObjCCategoryDecl;
81 class ObjCIvarDecl;
82 class ObjCMethodDecl;
Fariborz Jahanianed986602008-05-01 00:03:38 +000083 class ObjCPropertyDecl;
Steve Naroffab63fd62009-01-08 17:28:14 +000084 class ObjCContainerDecl;
Douglas Gregorbb461502008-10-24 04:54:22 +000085 class BasePaths;
Sebastian Redl9cc59542009-03-07 12:16:37 +000086 struct MemberLookupCriteria;
Anders Carlsson5552c802009-05-30 21:05:25 +000087 class CXXTemporary;
Steve Naroff82113e32007-07-29 16:33:31 +000088
Chris Lattner2616d8c2009-04-18 20:01:55 +000089/// BlockSemaInfo - When a block is being parsed, this contains information
90/// about the block. It is pointed to from Sema::CurBlock.
91struct BlockSemaInfo {
92 llvm::SmallVector<ParmVarDecl*, 8> Params;
93 bool hasPrototype;
94 bool isVariadic;
95 bool hasBlockDeclRefExprs;
96
97 BlockDecl *TheDecl;
98
99 /// TheScope - This is the scope for the block itself, which contains
100 /// arguments etc.
101 Scope *TheScope;
102
103 /// ReturnType - This will get set to block result type, by looking at
104 /// return types, if any, in the block body.
105 Type *ReturnType;
106
107 /// LabelMap - This is a mapping from label identifiers to the LabelStmt for
108 /// it (which acts like the label decl in some ways). Forward referenced
109 /// labels have a LabelStmt created for them with a null location & SubStmt.
110 llvm::DenseMap<IdentifierInfo*, LabelStmt*> LabelMap;
111
Chris Lattneree5a1a22009-04-18 20:10:59 +0000112 /// SwitchStack - This is the current set of active switch statements in the
113 /// block.
114 llvm::SmallVector<SwitchStmt*, 8> SwitchStack;
115
Chris Lattnere7765e12009-04-19 05:28:12 +0000116 /// SavedFunctionNeedsScopeChecking - This is the value of
117 /// CurFunctionNeedsScopeChecking at the point when the block started.
118 bool SavedFunctionNeedsScopeChecking;
119
Chris Lattner2616d8c2009-04-18 20:01:55 +0000120 /// PrevBlockInfo - If this is nested inside another block, this points
121 /// to the outer block.
122 BlockSemaInfo *PrevBlockInfo;
123};
124
Chris Lattner4b009652007-07-25 00:24:17 +0000125/// Sema - This implements semantic analysis and AST building for C.
126class Sema : public Action {
Chris Lattner767678f2009-02-17 00:58:30 +0000127 Sema(const Sema&); // DO NOT IMPLEMENT
128 void operator=(const Sema&); // DO NOT IMPLEMENT
Chris Lattnerf6690152008-06-29 00:28:59 +0000129public:
Chris Lattner6d89a8a2009-01-22 19:21:44 +0000130 const LangOptions &LangOpts;
Chris Lattner4b009652007-07-25 00:24:17 +0000131 Preprocessor &PP;
Chris Lattner4b009652007-07-25 00:24:17 +0000132 ASTContext &Context;
Chris Lattnera8c2d592008-02-06 00:46:58 +0000133 ASTConsumer &Consumer;
Chris Lattnerf9ea6a42008-11-22 08:28:49 +0000134 Diagnostic &Diags;
135 SourceManager &SourceMgr;
Steve Naroffdd2e26c2007-11-12 13:56:41 +0000136
Douglas Gregorc3221aa2009-04-24 21:10:55 +0000137 /// \brief Source of additional semantic information.
138 ExternalSemaSource *ExternalSource;
139
Argiris Kirtzidis95256e62008-06-28 06:07:14 +0000140 /// CurContext - This is the current declaration context of parsing.
Chris Lattnerf3874bc2008-04-06 04:47:34 +0000141 DeclContext *CurContext;
Chris Lattnereee57c02008-04-04 06:12:32 +0000142
Argiris Kirtzidis054a2632008-11-08 17:17:31 +0000143 /// PreDeclaratorDC - Keeps the declaration context before switching to the
144 /// context of a declarator's nested-name-specifier.
145 DeclContext *PreDeclaratorDC;
146
Steve Naroff52a81c02008-09-03 18:15:37 +0000147 /// CurBlock - If inside of a block definition, this contains a pointer to
148 /// the active block object that represents it.
149 BlockSemaInfo *CurBlock;
150
Daniel Dunbar81c7d472008-10-14 05:35:18 +0000151 /// PackContext - Manages the stack for #pragma pack. An alignment
152 /// of 0 indicates default alignment.
Chris Lattnera8699562009-02-17 01:09:29 +0000153 void *PackContext; // Really a "PragmaPackStack*"
Daniel Dunbar81c7d472008-10-14 05:35:18 +0000154
Chris Lattner2616d8c2009-04-18 20:01:55 +0000155 /// FunctionLabelMap - This is a mapping from label identifiers to the
156 /// LabelStmt for it (which acts like the label decl in some ways). Forward
157 /// referenced labels have a LabelStmt created for them with a null location &
158 /// SubStmt.
159 ///
160 /// Note that this should always be accessed through getLabelMap() in order
161 /// to handle blocks properly.
162 llvm::DenseMap<IdentifierInfo*, LabelStmt*> FunctionLabelMap;
Steve Naroffb88d81c2009-03-13 15:38:40 +0000163
Chris Lattneree5a1a22009-04-18 20:10:59 +0000164 /// FunctionSwitchStack - This is the current set of active switch statements
165 /// in the top level function. Clients should always use getSwitchStack() to
166 /// handle the case when they are in a block.
167 llvm::SmallVector<SwitchStmt*, 8> FunctionSwitchStack;
Anders Carlssonf0967d72009-05-17 18:41:29 +0000168
169 /// ExprTemporaries - This is the stack of temporaries that are created by
170 /// the current full expression.
Anders Carlsson5552c802009-05-30 21:05:25 +0000171 llvm::SmallVector<CXXTemporary*, 8> ExprTemporaries;
Anders Carlssonf0967d72009-05-17 18:41:29 +0000172
Chris Lattnerc92920c2009-04-19 05:21:20 +0000173 /// CurFunctionNeedsScopeChecking - This is set to true when a function or
174 /// ObjC method body contains a VLA or an ObjC try block, which introduce
175 /// scopes that need to be checked for goto conditions. If a function does
176 /// not contain this, then it need not have the jump checker run on it.
177 bool CurFunctionNeedsScopeChecking;
178
Nate Begemanaf6ed502008-04-18 23:10:10 +0000179 /// ExtVectorDecls - This is a list all the extended vector types. This allows
180 /// us to associate a raw vector type with one of the ext_vector type names.
Steve Naroff82113e32007-07-29 16:33:31 +0000181 /// This is only necessary for issuing pretty diagnostics.
Nate Begemanaf6ed502008-04-18 23:10:10 +0000182 llvm::SmallVector<TypedefDecl*, 24> ExtVectorDecls;
Chris Lattner2e64c072007-08-10 20:18:51 +0000183
Steve Naroff4b9846d2008-09-28 14:55:53 +0000184 /// ObjCCategoryImpls - Maintain a list of category implementations so
185 /// we can check for duplicates and find local method declarations.
186 llvm::SmallVector<ObjCCategoryImplDecl*, 8> ObjCCategoryImpls;
187
Argiris Kirtzidis38f16712008-07-01 10:37:29 +0000188 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
189 llvm::OwningPtr<CXXFieldCollector> FieldCollector;
190
Anders Carlssone1299b32009-03-22 20:18:17 +0000191 typedef llvm::SmallPtrSet<const CXXRecordDecl*, 8> RecordDeclSetTy;
192
193 /// PureVirtualClassDiagSet - a set of class declarations which we have
194 /// emitted a list of pure virtual functions. Used to prevent emitting the
195 /// same list more than once.
196 llvm::OwningPtr<RecordDeclSetTy> PureVirtualClassDiagSet;
197
Douglas Gregore6b5d1d2009-03-02 00:19:53 +0000198 /// \brief A mapping from external names to the most recent
199 /// locally-scoped external declaration with that name.
200 ///
201 /// This map contains external declarations introduced in local
202 /// scoped, e.g.,
203 ///
204 /// \code
205 /// void f() {
206 /// void foo(int, int);
207 /// }
208 /// \endcode
209 ///
210 /// Here, the name "foo" will be associated with the declaration on
211 /// "foo" within f. This name is not visible outside of
212 /// "f". However, we still find it in two cases:
213 ///
214 /// - If we are declaring another external with the name "foo", we
215 /// can find "foo" as a previous declaration, so that the types
216 /// of this external declaration can be checked for
217 /// compatibility.
218 ///
219 /// - If we would implicitly declare "foo" (e.g., due to a call to
220 /// "foo" in C when no prototype or definition is visible), then
221 /// we find this declaration of "foo" and complain that it is
222 /// not visible.
223 llvm::DenseMap<DeclarationName, NamedDecl *> LocallyScopedExternalDecls;
224
Douglas Gregor9cdb4a12009-04-21 17:11:58 +0000225 /// \brief The set of tentative declarations seen so far in this
226 /// translation unit for which no definition has been seen.
227 ///
228 /// The tentative declarations are indexed by the name of the
229 /// declaration, and only the most recent tentative declaration for
230 /// a given variable will be recorded here.
231 llvm::DenseMap<DeclarationName, VarDecl *> TentativeDefinitions;
232
Chris Lattner2a1e2ed2008-04-11 07:00:53 +0000233 IdentifierResolver IdResolver;
234
Steve Naroff415c1832007-10-10 17:32:04 +0000235 /// Translation Unit Scope - useful to Objective-C actions that need
236 /// to lookup file scope declarations in the "ordinary" C decl namespace.
237 /// For example, user-defined classes, built-in "id" type, etc.
Steve Naroff9637a9b2007-10-09 22:01:59 +0000238 Scope *TUScope;
Sebastian Redlb93b49c2008-11-11 11:37:55 +0000239
240 /// The C++ "std" namespace, where the standard library resides. Cached here
241 /// by GetStdNamespace
242 NamespaceDecl *StdNamespace;
Sebastian Redlb5ee8742008-12-03 20:26:15 +0000243
244 /// A flag to remember whether the implicit forms of operator new and delete
245 /// have been declared.
246 bool GlobalNewDeleteDeclared;
Douglas Gregore0d5c562009-04-14 16:27:31 +0000247
248 /// \brief Whether the code handled by Sema should be considered a
249 /// complete translation unit or not.
250 ///
251 /// When true (which is generally the case), Sema will perform
252 /// end-of-translation-unit semantic tasks (such as creating
253 /// initializers for tentative definitions in C) once parsing has
254 /// completed. This flag will be false when building PCH files,
255 /// since a PCH file is by definition not a complete translation
256 /// unit.
257 bool CompleteTranslationUnit;
258
Douglas Gregor003d7402009-06-14 08:02:22 +0000259 /// \brief The number of SFINAE diagnostics that have been trapped.
260 unsigned NumSFINAEErrors;
261
Douglas Gregorc3221aa2009-04-24 21:10:55 +0000262 typedef llvm::DenseMap<Selector, ObjCMethodList> MethodPool;
263
Steve Naroff8255b042007-10-14 00:58:41 +0000264 /// Instance/Factory Method Pools - allows efficient lookup when typechecking
265 /// messages to "id". We need to maintain a list, since selectors can have
266 /// differing signatures across classes. In Cocoa, this happens to be
267 /// extremely uncommon (only 1% of selectors are "overloaded").
Douglas Gregorc3221aa2009-04-24 21:10:55 +0000268 MethodPool InstanceMethodPool;
269 MethodPool FactoryMethodPool;
Steve Naroffff6c8022009-03-04 15:11:40 +0000270
Douglas Gregorc3221aa2009-04-24 21:10:55 +0000271 MethodPool::iterator ReadMethodPool(Selector Sel, bool isInstance);
272
Steve Naroffff6c8022009-03-04 15:11:40 +0000273 /// Private Helper predicate to check for 'self'.
274 bool isSelfExpr(Expr *RExpr);
Chris Lattner4b009652007-07-25 00:24:17 +0000275public:
Douglas Gregore0d5c562009-04-14 16:27:31 +0000276 Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
277 bool CompleteTranslationUnit = true);
Chris Lattnera8699562009-02-17 01:09:29 +0000278 ~Sema() {
279 if (PackContext) FreePackedContext();
280 }
Chris Lattner4b009652007-07-25 00:24:17 +0000281
Chris Lattner6d89a8a2009-01-22 19:21:44 +0000282 const LangOptions &getLangOptions() const { return LangOpts; }
Chris Lattnerf9ea6a42008-11-22 08:28:49 +0000283 Diagnostic &getDiagnostics() const { return Diags; }
284 SourceManager &getSourceManager() const { return SourceMgr; }
285
Douglas Gregor46970ed2009-03-20 22:48:49 +0000286 /// \brief Helper class that creates diagnostics with optional
287 /// template instantiation stacks.
288 ///
289 /// This class provides a wrapper around the basic DiagnosticBuilder
290 /// class that emits diagnostics. SemaDiagnosticBuilder is
291 /// responsible for emitting the diagnostic (as DiagnosticBuilder
292 /// does) and, if the diagnostic comes from inside a template
293 /// instantiation, printing the template instantiation stack as
294 /// well.
295 class SemaDiagnosticBuilder : public DiagnosticBuilder {
296 Sema &SemaRef;
297 unsigned DiagID;
298
299 public:
300 SemaDiagnosticBuilder(DiagnosticBuilder &DB, Sema &SemaRef, unsigned DiagID)
301 : DiagnosticBuilder(DB), SemaRef(SemaRef), DiagID(DiagID) { }
302
Douglas Gregor95d6c952009-06-14 07:33:30 +0000303 explicit SemaDiagnosticBuilder(Sema &SemaRef)
304 : DiagnosticBuilder(DiagnosticBuilder::Suppress), SemaRef(SemaRef) { }
305
Douglas Gregor46970ed2009-03-20 22:48:49 +0000306 ~SemaDiagnosticBuilder();
307 };
308
309 /// \brief Emit a diagnostic.
310 SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
Douglas Gregor95d6c952009-06-14 07:33:30 +0000311 if (isSFINAEContext() && Diagnostic::isBuiltinSFINAEDiag(DiagID)) {
312 // If we encountered an error during template argument
313 // deduction, and that error is one of the SFINAE errors,
Douglas Gregor003d7402009-06-14 08:02:22 +0000314 // suppress the diagnostic.
Douglas Gregora7841842009-06-15 16:52:15 +0000315 ++NumSFINAEErrors;
316 return SemaDiagnosticBuilder(*this);
Douglas Gregor95d6c952009-06-14 07:33:30 +0000317 }
318
Douglas Gregorfee85d62009-03-10 18:03:33 +0000319 DiagnosticBuilder DB = Diags.Report(FullSourceLoc(Loc, SourceMgr), DiagID);
Douglas Gregor46970ed2009-03-20 22:48:49 +0000320 return SemaDiagnosticBuilder(DB, *this, DiagID);
Chris Lattnerf9ea6a42008-11-22 08:28:49 +0000321 }
Chris Lattner4b009652007-07-25 00:24:17 +0000322
Chris Lattnerb26b7ad2007-08-31 04:53:24 +0000323 virtual void DeleteExpr(ExprTy *E);
324 virtual void DeleteStmt(StmtTy *S);
325
Sebastian Redl91f9b0a2008-12-13 16:23:55 +0000326 OwningExprResult Owned(Expr* E) { return OwningExprResult(*this, E); }
Sebastian Redl8b769972009-01-19 00:08:26 +0000327 OwningExprResult Owned(ExprResult R) {
Douglas Gregor10a18fc2009-01-26 22:44:13 +0000328 if (R.isInvalid())
Steve Naroff27959652009-01-21 22:32:33 +0000329 return ExprError();
Douglas Gregor10a18fc2009-01-26 22:44:13 +0000330 return OwningExprResult(*this, R.get());
Sebastian Redl8b769972009-01-19 00:08:26 +0000331 }
Sebastian Redl91f9b0a2008-12-13 16:23:55 +0000332 OwningStmtResult Owned(Stmt* S) { return OwningStmtResult(*this, S); }
333
Chris Lattnerc1aea812008-08-23 03:19:52 +0000334 virtual void ActOnEndOfTranslationUnit();
Sebastian Redl5457c5e2009-01-19 22:31:54 +0000335
Chris Lattner2616d8c2009-04-18 20:01:55 +0000336 /// getLabelMap() - Return the current label map. If we're in a block, we
337 /// return it.
338 llvm::DenseMap<IdentifierInfo*, LabelStmt*> &getLabelMap() {
339 return CurBlock ? CurBlock->LabelMap : FunctionLabelMap;
340 }
341
Chris Lattneree5a1a22009-04-18 20:10:59 +0000342 /// getSwitchStack - This is returns the switch stack for the current block or
343 /// function.
344 llvm::SmallVector<SwitchStmt*,8> &getSwitchStack() {
345 return CurBlock ? CurBlock->SwitchStack : FunctionSwitchStack;
346 }
347
Chris Lattner4b009652007-07-25 00:24:17 +0000348 //===--------------------------------------------------------------------===//
349 // Type Analysis / Processing: SemaType.cpp.
350 //
Douglas Gregora6897272009-03-23 23:06:20 +0000351 QualType adjustParameterType(QualType T);
Chris Lattner34c61332009-04-25 08:06:05 +0000352 QualType ConvertDeclSpecToType(const DeclSpec &DS, SourceLocation DeclLoc,
353 bool &IsInvalid);
Chris Lattner65a57042008-06-29 00:50:08 +0000354 void ProcessTypeAttributeList(QualType &Result, const AttributeList *AL);
Douglas Gregorf57dcd02009-02-28 00:25:32 +0000355 QualType BuildPointerType(QualType T, unsigned Quals,
356 SourceLocation Loc, DeclarationName Entity);
Sebastian Redlce6fff02009-03-16 23:22:08 +0000357 QualType BuildReferenceType(QualType T, bool LValueRef, unsigned Quals,
Douglas Gregorf57dcd02009-02-28 00:25:32 +0000358 SourceLocation Loc, DeclarationName Entity);
359 QualType BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
360 Expr *ArraySize, unsigned Quals,
361 SourceLocation Loc, DeclarationName Entity);
Douglas Gregor2a2e0402009-06-17 21:51:59 +0000362 QualType BuildExtVectorType(QualType T, ExprArg ArraySize,
363 SourceLocation AttrLoc);
Douglas Gregorc0139ca2009-02-28 01:04:19 +0000364 QualType BuildFunctionType(QualType T,
365 QualType *ParamTypes, unsigned NumParamTypes,
366 bool Variadic, unsigned Quals,
367 SourceLocation Loc, DeclarationName Entity);
Douglas Gregora39e8302009-06-09 22:17:39 +0000368 QualType BuildMemberPointerType(QualType T, QualType Class,
369 unsigned Quals, SourceLocation Loc,
370 DeclarationName Entity);
Anders Carlssondb52d342009-06-12 22:56:54 +0000371 QualType BuildBlockPointerType(QualType T, unsigned Quals,
372 SourceLocation Loc, DeclarationName Entity);
Douglas Gregor71f06032009-05-28 23:31:59 +0000373 QualType GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip = 0,
374 TagDecl **OwnedDecl = 0);
Douglas Gregor6704b312008-11-17 22:58:34 +0000375 DeclarationName GetNameForDeclarator(Declarator &D);
Sebastian Redlaaacda92009-05-29 18:02:33 +0000376 bool CheckSpecifiedExceptionType(QualType T, const SourceRange &Range);
Sebastian Redldfc009f2009-05-29 15:01:05 +0000377 bool CheckDistantExceptionSpec(QualType T);
Douglas Gregor6704b312008-11-17 22:58:34 +0000378
Chris Lattner5261d0c2009-03-28 19:18:32 +0000379 QualType ObjCGetTypeForMethodDefinition(DeclPtrTy D);
Fariborz Jahaniandfb1c372007-11-08 23:49:49 +0000380
Douglas Gregorccc0ccc2008-10-22 14:17:15 +0000381 bool UnwrapSimilarPointerTypes(QualType& T1, QualType& T2);
382
Sebastian Redl66df3ef2008-12-02 14:43:59 +0000383 virtual TypeResult ActOnTypeName(Scope *S, Declarator &D);
Sebastian Redlf831eeb2008-11-08 13:00:26 +0000384
Douglas Gregorc84d8932009-03-09 16:13:40 +0000385 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned diag,
Douglas Gregor46fe06e2009-01-19 19:26:10 +0000386 SourceRange Range1 = SourceRange(),
387 SourceRange Range2 = SourceRange(),
388 QualType PrintType = QualType());
389
Douglas Gregor8c795a12009-03-19 00:39:20 +0000390 QualType getQualifiedNameType(const CXXScopeSpec &SS, QualType T);
391
Chris Lattner4b009652007-07-25 00:24:17 +0000392 //===--------------------------------------------------------------------===//
393 // Symbol table / Decl tracking callbacks: SemaDecl.cpp.
394 //
Chris Lattnerd042d0f2009-03-05 01:25:28 +0000395
396 /// getDeclName - Return a pretty name for the specified decl if possible, or
397 /// an empty string if not. This is used for pretty crash reporting.
Chris Lattner5261d0c2009-03-28 19:18:32 +0000398 virtual std::string getDeclName(DeclPtrTy D);
Chris Lattnerd042d0f2009-03-05 01:25:28 +0000399
Chris Lattnera17991f2009-03-29 16:50:03 +0000400 DeclGroupPtrTy ConvertDeclToDeclGroup(DeclPtrTy Ptr);
401
Douglas Gregora60c62e2009-02-09 15:09:02 +0000402 virtual TypeTy *getTypeName(IdentifierInfo &II, SourceLocation NameLoc,
Douglas Gregor1075a162009-02-04 17:00:24 +0000403 Scope *S, const CXXScopeSpec *SS);
Chris Lattner197b4342009-04-12 21:49:30 +0000404 virtual DeclSpec::TST isTagName(IdentifierInfo &II, Scope *S);
405
Chris Lattnera17991f2009-03-29 16:50:03 +0000406 virtual DeclPtrTy ActOnDeclarator(Scope *S, Declarator &D) {
407 return ActOnDeclarator(S, D, false);
Douglas Gregorc5cbc242008-12-15 23:53:10 +0000408 }
Chris Lattnera17991f2009-03-29 16:50:03 +0000409 DeclPtrTy ActOnDeclarator(Scope *S, Declarator &D, bool IsFunctionDefinition);
Douglas Gregore6b5d1d2009-03-02 00:19:53 +0000410 void RegisterLocallyScopedExternCDecl(NamedDecl *ND, NamedDecl *PrevDecl,
411 Scope *S);
Eli Friedmanf834eaf2009-04-07 19:37:57 +0000412 void DiagnoseFunctionSpecifiers(Declarator& D);
Douglas Gregoraf8ad2b2009-01-20 01:17:11 +0000413 NamedDecl* ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC,
Chris Lattner34c61332009-04-25 08:06:05 +0000414 QualType R, Decl* PrevDecl,
Douglas Gregor083c23e2009-02-16 17:45:42 +0000415 bool &Redeclaration);
Douglas Gregoraf8ad2b2009-01-20 01:17:11 +0000416 NamedDecl* ActOnVariableDeclarator(Scope* S, Declarator& D, DeclContext* DC,
Chris Lattner34c61332009-04-25 08:06:05 +0000417 QualType R, NamedDecl* PrevDecl,
Douglas Gregor083c23e2009-02-16 17:45:42 +0000418 bool &Redeclaration);
Chris Lattner34c61332009-04-25 08:06:05 +0000419 void CheckVariableDeclaration(VarDecl *NewVD, NamedDecl *PrevDecl,
Douglas Gregorafb094a2009-03-25 23:32:15 +0000420 bool &Redeclaration);
Douglas Gregoraf8ad2b2009-01-20 01:17:11 +0000421 NamedDecl* ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
Chris Lattnera17991f2009-03-29 16:50:03 +0000422 QualType R, NamedDecl* PrevDecl,
Douglas Gregoraf682022009-02-24 01:23:02 +0000423 bool IsFunctionDefinition,
Chris Lattner34c61332009-04-25 08:06:05 +0000424 bool &Redeclaration);
425 void CheckFunctionDeclaration(FunctionDecl *NewFD, NamedDecl *&PrevDecl,
Douglas Gregora6897272009-03-23 23:06:20 +0000426 bool &Redeclaration,
427 bool &OverloadableAttrRequired);
Chris Lattner5261d0c2009-03-28 19:18:32 +0000428 virtual DeclPtrTy ActOnParamDeclarator(Scope *S, Declarator &D);
429 virtual void ActOnParamDefaultArgument(DeclPtrTy param,
Chris Lattner3e254fb2008-04-08 04:40:51 +0000430 SourceLocation EqualLoc,
Sebastian Redl76bb8ec2009-03-15 17:47:39 +0000431 ExprArg defarg);
Chris Lattner5261d0c2009-03-28 19:18:32 +0000432 virtual void ActOnParamUnparsedDefaultArgument(DeclPtrTy param,
Anders Carlssona116e6e2009-06-12 16:51:40 +0000433 SourceLocation EqualLoc,
434 SourceLocation ArgLoc);
Chris Lattner5261d0c2009-03-28 19:18:32 +0000435 virtual void ActOnParamDefaultArgumentError(DeclPtrTy param);
Anders Carlssona116e6e2009-06-12 16:51:40 +0000436
437 // Contains the locations of the beginning of unparsed default
438 // argument locations.
439 llvm::DenseMap<ParmVarDecl *,SourceLocation> UnparsedDefaultArgLocs;
440
Anders Carlssonf9f05b82009-05-30 21:37:25 +0000441 virtual void AddInitializerToDecl(DeclPtrTy dcl, FullExprArg init);
Chris Lattner5261d0c2009-03-28 19:18:32 +0000442 void AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit);
443 void ActOnUninitializedDecl(DeclPtrTy dcl);
444 virtual void SetDeclDeleted(DeclPtrTy dcl, SourceLocation DelLoc);
Eli Friedman4d57af22009-05-29 01:49:24 +0000445 virtual DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS,
446 DeclPtrTy *Group,
Chris Lattnera17991f2009-03-29 16:50:03 +0000447 unsigned NumDecls);
Douglas Gregor3faaa812009-04-01 23:51:29 +0000448 virtual void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D,
449 SourceLocation LocAfterDecls);
Chris Lattner5261d0c2009-03-28 19:18:32 +0000450 virtual DeclPtrTy ActOnStartOfFunctionDef(Scope *S, Declarator &D);
451 virtual DeclPtrTy ActOnStartOfFunctionDef(Scope *S, DeclPtrTy D);
452 virtual void ActOnStartOfObjCMethodDef(Scope *S, DeclPtrTy D);
Sebastian Redl5457c5e2009-01-19 22:31:54 +0000453
Chris Lattner5261d0c2009-03-28 19:18:32 +0000454 virtual DeclPtrTy ActOnFinishFunctionBody(DeclPtrTy Decl, StmtArg Body);
Douglas Gregor556d8c72009-05-15 17:59:04 +0000455 DeclPtrTy ActOnFinishFunctionBody(DeclPtrTy Decl, StmtArg Body,
456 bool IsInstantiation);
Chris Lattner76b831a2009-04-19 04:46:21 +0000457 void DiagnoseInvalidJumps(Stmt *Body);
Chris Lattner5261d0c2009-03-28 19:18:32 +0000458 virtual DeclPtrTy ActOnFileScopeAsmDecl(SourceLocation Loc, ExprArg expr);
Anders Carlsson4f7f4412008-02-08 00:33:21 +0000459
Steve Naroff9637a9b2007-10-09 22:01:59 +0000460 /// Scope actions.
461 virtual void ActOnPopScope(SourceLocation Loc, Scope *S);
462 virtual void ActOnTranslationUnitScope(SourceLocation Loc, Scope *S);
Chris Lattner4b009652007-07-25 00:24:17 +0000463
464 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
465 /// no declarator (e.g. "struct foo;") is parsed.
Chris Lattner5261d0c2009-03-28 19:18:32 +0000466 virtual DeclPtrTy ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS);
Chris Lattner4b009652007-07-25 00:24:17 +0000467
Douglas Gregor723d3332009-01-07 00:43:41 +0000468 bool InjectAnonymousStructOrUnionMembers(Scope *S, DeclContext *Owner,
469 RecordDecl *AnonRecord);
Chris Lattner5261d0c2009-03-28 19:18:32 +0000470 virtual DeclPtrTy BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
471 RecordDecl *Record);
Douglas Gregor723d3332009-01-07 00:43:41 +0000472
Douglas Gregor625185c2009-05-14 16:41:31 +0000473 bool isAcceptableTagRedeclaration(const TagDecl *Previous,
474 TagDecl::TagKind NewTag,
475 SourceLocation NewTagLoc,
476 const IdentifierInfo &Name);
Douglas Gregor5f0e4032009-05-03 17:18:57 +0000477
Chris Lattner5261d0c2009-03-28 19:18:32 +0000478 virtual DeclPtrTy ActOnTag(Scope *S, unsigned TagSpec, TagKind TK,
479 SourceLocation KWLoc, const CXXScopeSpec &SS,
480 IdentifierInfo *Name, SourceLocation NameLoc,
Douglas Gregor71f06032009-05-28 23:31:59 +0000481 AttributeList *Attr, AccessSpecifier AS,
482 bool &OwnedDecl);
Ted Kremenek46a837c2008-09-05 17:16:31 +0000483
Chris Lattner5261d0c2009-03-28 19:18:32 +0000484 virtual void ActOnDefs(Scope *S, DeclPtrTy TagD, SourceLocation DeclStart,
Chris Lattnerf7df4d12008-08-23 02:00:52 +0000485 IdentifierInfo *ClassName,
Chris Lattner5261d0c2009-03-28 19:18:32 +0000486 llvm::SmallVectorImpl<DeclPtrTy> &Decls);
487 virtual DeclPtrTy ActOnField(Scope *S, DeclPtrTy TagD,
488 SourceLocation DeclStart,
489 Declarator &D, ExprTy *BitfieldWidth);
Chris Lattner9cffefc2009-03-05 22:45:59 +0000490
491 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
Douglas Gregor2f0ecef2009-03-11 20:50:30 +0000492 Declarator &D, Expr *BitfieldWidth,
493 AccessSpecifier AS);
Chris Lattner9cffefc2009-03-05 22:45:59 +0000494
Douglas Gregor0e518af2009-03-11 18:59:21 +0000495 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
496 RecordDecl *Record, SourceLocation Loc,
497 bool Mutable, Expr *BitfieldWidth,
Douglas Gregor2f0ecef2009-03-11 20:50:30 +0000498 AccessSpecifier AS, NamedDecl *PrevDecl,
Douglas Gregor0e518af2009-03-11 18:59:21 +0000499 Declarator *D = 0);
Fariborz Jahanian751c6172008-04-10 23:32:45 +0000500
Chris Lattner5261d0c2009-03-28 19:18:32 +0000501 virtual DeclPtrTy ActOnIvar(Scope *S, SourceLocation DeclStart,
Fariborz Jahanian074cf972009-06-05 18:16:35 +0000502 DeclPtrTy IntfDecl,
Chris Lattner5261d0c2009-03-28 19:18:32 +0000503 Declarator &D, ExprTy *BitfieldWidth,
504 tok::ObjCKeywordKind visibility);
Fariborz Jahanian751c6172008-04-10 23:32:45 +0000505
Steve Naroffffeaa552007-09-14 23:09:53 +0000506 // This is used for both record definitions and ObjC interface declarations.
Fariborz Jahanian0c5affb2007-09-29 00:54:24 +0000507 virtual void ActOnFields(Scope* S,
Chris Lattner5261d0c2009-03-28 19:18:32 +0000508 SourceLocation RecLoc, DeclPtrTy TagDecl,
509 DeclPtrTy *Fields, unsigned NumFields,
Daniel Dunbarf3944442008-10-03 02:03:53 +0000510 SourceLocation LBrac, SourceLocation RBrac,
511 AttributeList *AttrList);
Douglas Gregordb568cf2009-01-08 20:45:30 +0000512
513 /// ActOnTagStartDefinition - Invoked when we have entered the
514 /// scope of a tag's definition (e.g., for an enumeration, class,
515 /// struct, or union).
Chris Lattner5261d0c2009-03-28 19:18:32 +0000516 virtual void ActOnTagStartDefinition(Scope *S, DeclPtrTy TagDecl);
Douglas Gregordb568cf2009-01-08 20:45:30 +0000517
518 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
519 /// the definition of a tag (enumeration, class, struct, or union).
Chris Lattner5261d0c2009-03-28 19:18:32 +0000520 virtual void ActOnTagFinishDefinition(Scope *S, DeclPtrTy TagDecl);
Douglas Gregordb568cf2009-01-08 20:45:30 +0000521
Douglas Gregor3ae974b2009-03-17 19:05:46 +0000522 EnumConstantDecl *CheckEnumConstant(EnumDecl *Enum,
523 EnumConstantDecl *LastEnumConst,
524 SourceLocation IdLoc,
525 IdentifierInfo *Id,
526 ExprArg val);
527
Chris Lattner5261d0c2009-03-28 19:18:32 +0000528 virtual DeclPtrTy ActOnEnumConstant(Scope *S, DeclPtrTy EnumDecl,
529 DeclPtrTy LastEnumConstant,
530 SourceLocation IdLoc, IdentifierInfo *Id,
531 SourceLocation EqualLoc, ExprTy *Val);
Mike Stump155750e2009-05-16 07:06:02 +0000532 virtual void ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
533 SourceLocation RBraceLoc, DeclPtrTy EnumDecl,
Chris Lattner5261d0c2009-03-28 19:18:32 +0000534 DeclPtrTy *Elements, unsigned NumElements);
Sebastian Redlf831eeb2008-11-08 13:00:26 +0000535
Argiris Kirtzidis054a2632008-11-08 17:17:31 +0000536 DeclContext *getContainingDC(DeclContext *DC);
Argiris Kirtzidis38f16712008-07-01 10:37:29 +0000537
Chris Lattnereee57c02008-04-04 06:12:32 +0000538 /// Set the current declaration context until it gets popped.
Douglas Gregor8acb7272008-12-11 16:49:14 +0000539 void PushDeclContext(Scope *S, DeclContext *DC);
Chris Lattnerf3874bc2008-04-06 04:47:34 +0000540 void PopDeclContext();
Argiris Kirtzidis95256e62008-06-28 06:07:14 +0000541
Chris Lattnere5cb5862008-12-04 23:50:19 +0000542 /// getCurFunctionDecl - If inside of a function body, this returns a pointer
543 /// to the function decl for the function being parsed. If we're currently
544 /// in a 'block', this returns the containing context.
545 FunctionDecl *getCurFunctionDecl();
546
547 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
548 /// the method decl for the method being parsed. If we're currently
549 /// in a 'block', this returns the containing context.
Daniel Dunbar64789f82008-08-11 05:35:13 +0000550 ObjCMethodDecl *getCurMethodDecl();
Chris Lattnereee57c02008-04-04 06:12:32 +0000551
Chris Lattnere5cb5862008-12-04 23:50:19 +0000552 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
553 /// or C function we're in, otherwise return null. If we're currently
554 /// in a 'block', this returns the containing context.
555 NamedDecl *getCurFunctionOrMethodDecl();
556
Argiris Kirtzidis951f25b2008-04-12 00:47:19 +0000557 /// Add this decl to the scope shadowed decl chains.
558 void PushOnScopeChains(NamedDecl *D, Scope *S);
559
Argiris Kirtzidis90842b62008-09-09 21:18:04 +0000560 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
561 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
562 /// true if 'D' belongs to the given declaration context.
563 bool isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S = 0) {
Douglas Gregor8acb7272008-12-11 16:49:14 +0000564 return IdResolver.isDeclInScope(D, Ctx, Context, S);
Argiris Kirtzidis90842b62008-09-09 21:18:04 +0000565 }
566
Eli Friedman9c0e6f92009-02-28 05:41:13 +0000567
Chris Lattner9e982502008-02-21 01:07:18 +0000568 /// Subroutines of ActOnDeclarator().
Chris Lattnera17991f2009-03-29 16:50:03 +0000569 TypedefDecl *ParseTypedefDecl(Scope *S, Declarator &D, QualType T);
Chris Lattner34c61332009-04-25 08:06:05 +0000570 void MergeTypeDefDecl(TypedefDecl *New, Decl *Old);
Douglas Gregor083c23e2009-02-16 17:45:42 +0000571 bool MergeFunctionDecl(FunctionDecl *New, Decl *Old);
Douglas Gregoraf682022009-02-24 01:23:02 +0000572 bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old);
Chris Lattner34c61332009-04-25 08:06:05 +0000573 void MergeVarDecl(VarDecl *New, Decl *Old);
Douglas Gregor083c23e2009-02-16 17:45:42 +0000574 bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old);
Douglas Gregord2baafd2008-10-21 16:13:35 +0000575
576 /// C++ Overloading.
577 bool IsOverload(FunctionDecl *New, Decl* OldD,
578 OverloadedFunctionDecl::function_iterator &MatchedDecl);
Douglas Gregora3b34bb2008-11-03 19:09:14 +0000579 ImplicitConversionSequence
580 TryImplicitConversion(Expr* From, QualType ToType,
Douglas Gregor6214d8a2009-01-14 15:45:31 +0000581 bool SuppressUserConversions = false,
Sebastian Redla55834a2009-04-12 17:16:29 +0000582 bool AllowExplicit = false,
583 bool ForceRValue = false);
Douglas Gregorb72e9da2008-10-31 16:23:19 +0000584 bool IsStandardConversion(Expr *From, QualType ToType,
585 StandardConversionSequence& SCS);
Douglas Gregord2baafd2008-10-21 16:13:35 +0000586 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
587 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
Douglas Gregore819caf2009-02-12 00:15:05 +0000588 bool IsComplexPromotion(QualType FromType, QualType ToType);
Douglas Gregord2baafd2008-10-21 16:13:35 +0000589 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
Douglas Gregor6fd35572008-12-19 17:40:08 +0000590 QualType& ConvertedType, bool &IncompatibleObjC);
Douglas Gregor932778b2008-12-19 19:13:09 +0000591 bool isObjCPointerConversion(QualType FromType, QualType ToType,
592 QualType& ConvertedType, bool &IncompatibleObjC);
Douglas Gregorbb461502008-10-24 04:54:22 +0000593 bool CheckPointerConversion(Expr *From, QualType ToType);
Sebastian Redlba387562009-01-25 19:43:20 +0000594 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
595 QualType &ConvertedType);
596 bool CheckMemberPointerConversion(Expr *From, QualType ToType);
Douglas Gregor6573cfd2008-10-21 23:43:52 +0000597 bool IsQualificationConversion(QualType FromType, QualType ToType);
Douglas Gregorb72e9da2008-10-31 16:23:19 +0000598 bool IsUserDefinedConversion(Expr *From, QualType ToType,
Douglas Gregor6214d8a2009-01-14 15:45:31 +0000599 UserDefinedConversionSequence& User,
Douglas Gregorb206cc42009-01-30 23:27:23 +0000600 bool AllowConversionFunctions,
Sebastian Redla55834a2009-04-12 17:16:29 +0000601 bool AllowExplicit, bool ForceRValue);
Douglas Gregord2baafd2008-10-21 16:13:35 +0000602
603 ImplicitConversionSequence::CompareKind
604 CompareImplicitConversionSequences(const ImplicitConversionSequence& ICS1,
605 const ImplicitConversionSequence& ICS2);
606
607 ImplicitConversionSequence::CompareKind
608 CompareStandardConversionSequences(const StandardConversionSequence& SCS1,
609 const StandardConversionSequence& SCS2);
610
Douglas Gregorccc0ccc2008-10-22 14:17:15 +0000611 ImplicitConversionSequence::CompareKind
612 CompareQualificationConversions(const StandardConversionSequence& SCS1,
613 const StandardConversionSequence& SCS2);
614
Douglas Gregor14046502008-10-23 00:40:37 +0000615 ImplicitConversionSequence::CompareKind
616 CompareDerivedToBaseConversions(const StandardConversionSequence& SCS1,
617 const StandardConversionSequence& SCS2);
618
Douglas Gregora3b34bb2008-11-03 19:09:14 +0000619 ImplicitConversionSequence
620 TryCopyInitialization(Expr* From, QualType ToType,
Sebastian Redla55834a2009-04-12 17:16:29 +0000621 bool SuppressUserConversions = false,
622 bool ForceRValue = false);
Douglas Gregor81c29152008-10-29 00:13:59 +0000623 bool PerformCopyInitialization(Expr *&From, QualType ToType,
Sebastian Redla55834a2009-04-12 17:16:29 +0000624 const char *Flavor, bool Elidable = false);
Douglas Gregor81c29152008-10-29 00:13:59 +0000625
Douglas Gregor5ed15042008-11-18 23:14:02 +0000626 ImplicitConversionSequence
627 TryObjectArgumentInitialization(Expr *From, CXXMethodDecl *Method);
628 bool PerformObjectArgumentInitialization(Expr *&From, CXXMethodDecl *Method);
629
Douglas Gregor6214d8a2009-01-14 15:45:31 +0000630 ImplicitConversionSequence TryContextuallyConvertToBool(Expr *From);
631 bool PerformContextuallyConvertToBool(Expr *&From);
632
Douglas Gregord2baafd2008-10-21 16:13:35 +0000633 /// OverloadingResult - Capture the result of performing overload
634 /// resolution.
635 enum OverloadingResult {
636 OR_Success, ///< Overload resolution succeeded.
637 OR_No_Viable_Function, ///< No viable function found.
Douglas Gregoraa57e862009-02-18 21:56:37 +0000638 OR_Ambiguous, ///< Ambiguous candidates found.
639 OR_Deleted ///< Overload resoltuion refers to a deleted function.
Douglas Gregord2baafd2008-10-21 16:13:35 +0000640 };
641
Douglas Gregor00fe3f62009-03-13 18:40:31 +0000642 typedef llvm::SmallPtrSet<FunctionDecl *, 16> FunctionSet;
643 typedef llvm::SmallPtrSet<NamespaceDecl *, 16> AssociatedNamespaceSet;
644 typedef llvm::SmallPtrSet<CXXRecordDecl *, 16> AssociatedClassSet;
645
Douglas Gregord2baafd2008-10-21 16:13:35 +0000646 void AddOverloadCandidate(FunctionDecl *Function,
647 Expr **Args, unsigned NumArgs,
Douglas Gregora3b34bb2008-11-03 19:09:14 +0000648 OverloadCandidateSet& CandidateSet,
Sebastian Redla55834a2009-04-12 17:16:29 +0000649 bool SuppressUserConversions = false,
650 bool ForceRValue = false);
Douglas Gregor00fe3f62009-03-13 18:40:31 +0000651 void AddFunctionCandidates(const FunctionSet &Functions,
652 Expr **Args, unsigned NumArgs,
653 OverloadCandidateSet& CandidateSet,
654 bool SuppressUserConversions = false);
Douglas Gregor5ed15042008-11-18 23:14:02 +0000655 void AddMethodCandidate(CXXMethodDecl *Method,
656 Expr *Object, Expr **Args, unsigned NumArgs,
657 OverloadCandidateSet& CandidateSet,
Sebastian Redla55834a2009-04-12 17:16:29 +0000658 bool SuppressUserConversions = false,
659 bool ForceRValue = false);
Douglas Gregor60714f92008-11-07 22:36:19 +0000660 void AddConversionCandidate(CXXConversionDecl *Conversion,
661 Expr *From, QualType ToType,
662 OverloadCandidateSet& CandidateSet);
Douglas Gregor67fdb5b2008-11-19 22:57:39 +0000663 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
Douglas Gregor4fa58902009-02-26 23:50:07 +0000664 const FunctionProtoType *Proto,
Douglas Gregor67fdb5b2008-11-19 22:57:39 +0000665 Expr *Object, Expr **Args, unsigned NumArgs,
666 OverloadCandidateSet& CandidateSet);
Douglas Gregor00fe3f62009-03-13 18:40:31 +0000667 void AddOperatorCandidates(OverloadedOperatorKind Op, Scope *S,
Douglas Gregor48a87322009-02-04 16:44:47 +0000668 SourceLocation OpLoc,
Douglas Gregor5ed15042008-11-18 23:14:02 +0000669 Expr **Args, unsigned NumArgs,
Douglas Gregor48a87322009-02-04 16:44:47 +0000670 OverloadCandidateSet& CandidateSet,
671 SourceRange OpRange = SourceRange());
Douglas Gregor00fe3f62009-03-13 18:40:31 +0000672 void AddMemberOperatorCandidates(OverloadedOperatorKind Op,
673 SourceLocation OpLoc,
674 Expr **Args, unsigned NumArgs,
675 OverloadCandidateSet& CandidateSet,
676 SourceRange OpRange = SourceRange());
Douglas Gregor70d26122008-11-12 17:17:38 +0000677 void AddBuiltinCandidate(QualType ResultTy, QualType *ParamTys,
678 Expr **Args, unsigned NumArgs,
Douglas Gregorab141112009-01-13 00:52:54 +0000679 OverloadCandidateSet& CandidateSet,
Douglas Gregor6214d8a2009-01-14 15:45:31 +0000680 bool IsAssignmentOperator = false,
681 unsigned NumContextualBoolArguments = 0);
Douglas Gregor4f6904d2008-11-19 15:42:04 +0000682 void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
683 Expr **Args, unsigned NumArgs,
684 OverloadCandidateSet& CandidateSet);
Douglas Gregoraa1da4a2009-02-04 00:32:51 +0000685 void AddArgumentDependentLookupCandidates(DeclarationName Name,
686 Expr **Args, unsigned NumArgs,
687 OverloadCandidateSet& CandidateSet);
Douglas Gregord2baafd2008-10-21 16:13:35 +0000688 bool isBetterOverloadCandidate(const OverloadCandidate& Cand1,
689 const OverloadCandidate& Cand2);
690 OverloadingResult BestViableFunction(OverloadCandidateSet& CandidateSet,
691 OverloadCandidateSet::iterator& Best);
692 void PrintOverloadCandidates(OverloadCandidateSet& CandidateSet,
693 bool OnlyViable);
694
Douglas Gregor45014fd2008-11-10 20:40:00 +0000695 FunctionDecl *ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType,
696 bool Complain);
697 void FixOverloadedFunctionReference(Expr *E, FunctionDecl *Fn);
698
Douglas Gregor4646f9c2009-02-04 15:01:18 +0000699 FunctionDecl *ResolveOverloadedCallFn(Expr *Fn, NamedDecl *Callee,
700 DeclarationName UnqualifiedName,
Douglas Gregorbf4f0582008-11-26 06:01:48 +0000701 SourceLocation LParenLoc,
702 Expr **Args, unsigned NumArgs,
703 SourceLocation *CommaLocs,
Douglas Gregoraa1da4a2009-02-04 00:32:51 +0000704 SourceLocation RParenLoc,
Douglas Gregor4646f9c2009-02-04 15:01:18 +0000705 bool &ArgumentDependentLookup);
Douglas Gregor00fe3f62009-03-13 18:40:31 +0000706
Douglas Gregorc78182d2009-03-13 23:49:33 +0000707 OwningExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc,
708 unsigned Opc,
709 FunctionSet &Functions,
710 ExprArg input);
711
Douglas Gregor00fe3f62009-03-13 18:40:31 +0000712 OwningExprResult CreateOverloadedBinOp(SourceLocation OpLoc,
713 unsigned Opc,
714 FunctionSet &Functions,
715 Expr *LHS, Expr *RHS);
716
Douglas Gregor3257fb52008-12-22 05:46:06 +0000717 ExprResult
718 BuildCallToMemberFunction(Scope *S, Expr *MemExpr,
719 SourceLocation LParenLoc, Expr **Args,
720 unsigned NumArgs, SourceLocation *CommaLocs,
721 SourceLocation RParenLoc);
Douglas Gregor10f3c502008-11-19 21:05:33 +0000722 ExprResult
Douglas Gregora133e262008-12-06 00:22:45 +0000723 BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc,
Douglas Gregor10f3c502008-11-19 21:05:33 +0000724 Expr **Args, unsigned NumArgs,
725 SourceLocation *CommaLocs,
726 SourceLocation RParenLoc);
Douglas Gregord2baafd2008-10-21 16:13:35 +0000727
Douglas Gregorddfd9d52008-12-23 00:26:44 +0000728 ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc,
Douglas Gregor7f3fec52008-11-20 16:27:02 +0000729 SourceLocation MemberLoc,
730 IdentifierInfo &Member);
Douglas Gregor6214d8a2009-01-14 15:45:31 +0000731
Chris Lattner7898bf62009-01-06 07:27:21 +0000732 /// Helpers for dealing with function parameters.
Chris Lattner3e254fb2008-04-08 04:40:51 +0000733 bool CheckParmsForFunctionDef(FunctionDecl *FD);
Chris Lattner3e254fb2008-04-08 04:40:51 +0000734 void CheckCXXDefaultArguments(FunctionDecl *FD);
Douglas Gregor2b9422f2008-05-07 04:49:29 +0000735 void CheckExtraCXXDefaultArguments(Declarator &D);
Chris Lattner4b009652007-07-25 00:24:17 +0000736
Douglas Gregor5eca99e2009-01-12 18:45:55 +0000737 Scope *getNonFieldDeclScope(Scope *S);
738
Douglas Gregor78d70132009-01-14 22:20:51 +0000739 /// \name Name lookup
740 ///
741 /// These routines provide name lookup that is used during semantic
742 /// analysis to resolve the various kinds of names (identifiers,
743 /// overloaded operator names, constructor names, etc.) into zero or
744 /// more declarations within a particular scope. The major entry
745 /// points are LookupName, which performs unqualified name lookup,
746 /// and LookupQualifiedName, which performs qualified name lookup.
747 ///
748 /// All name lookup is performed based on some specific criteria,
749 /// which specify what names will be visible to name lookup and how
750 /// far name lookup should work. These criteria are important both
751 /// for capturing language semantics (certain lookups will ignore
752 /// certain names, for example) and for performance, since name
753 /// lookup is often a bottleneck in the compilation of C++. Name
Douglas Gregor52ae30c2009-01-30 01:04:22 +0000754 /// lookup criteria is specified via the LookupCriteria enumeration.
Douglas Gregor78d70132009-01-14 22:20:51 +0000755 ///
756 /// The results of name lookup can vary based on the kind of name
757 /// lookup performed, the current language, and the translation
758 /// unit. In C, for example, name lookup will either return nothing
759 /// (no entity found) or a single declaration. In C++, name lookup
760 /// can additionally refer to a set of overloaded functions or
761 /// result in an ambiguity. All of the possible results of name
762 /// lookup are captured by the LookupResult class, which provides
763 /// the ability to distinguish among them.
764 //@{
Douglas Gregor5ff0ee52008-12-30 03:27:21 +0000765
Douglas Gregor52ae30c2009-01-30 01:04:22 +0000766 /// @brief Describes the kind of name lookup to perform.
767 enum LookupNameKind {
768 /// Ordinary name lookup, which finds ordinary names (functions,
769 /// variables, typedefs, etc.) in C and most kinds of names
770 /// (functions, variables, members, types, etc.) in C++.
771 LookupOrdinaryName = 0,
772 /// Tag name lookup, which finds the names of enums, classes,
773 /// structs, and unions.
774 LookupTagName,
775 /// Member name lookup, which finds the names of
776 /// class/struct/union members.
777 LookupMemberName,
Douglas Gregor48a87322009-02-04 16:44:47 +0000778 // Look up of an operator name (e.g., operator+) for use with
779 // operator overloading. This lookup is similar to ordinary name
780 // lookup, but will ignore any declarations that are class
781 // members.
782 LookupOperatorName,
Douglas Gregor52ae30c2009-01-30 01:04:22 +0000783 /// Look up of a name that precedes the '::' scope resolution
784 /// operator in C++. This lookup completely ignores operator,
785 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
786 LookupNestedNameSpecifierName,
787 /// Look up a namespace name within a C++ using directive or
788 /// namespace alias definition, ignoring non-namespace names (C++
789 /// [basic.lookup.udir]p1).
Douglas Gregor1c52c632009-02-24 20:03:32 +0000790 LookupNamespaceName,
Douglas Gregore57c8cc2009-04-23 23:18:26 +0000791 /// Look up an ordinary name that is going to be redeclared as a
792 /// name with linkage. This lookup ignores any declarations that
793 /// are outside of the current scope unless they have linkage. See
794 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
795 LookupRedeclarationWithLinkage,
796 /// Look up the name of an Objective-C protocol.
Douglas Gregorafd5eb32009-04-24 00:11:27 +0000797 LookupObjCProtocolName,
798 /// Look up the name of an Objective-C implementation
799 LookupObjCImplementationName,
800 /// Look up the name of an Objective-C category implementation
801 LookupObjCCategoryImplName
Douglas Gregor78d70132009-01-14 22:20:51 +0000802 };
803
804 /// @brief Represents the results of name lookup.
805 ///
806 /// An instance of the LookupResult class captures the results of a
807 /// single name lookup, which can return no result (nothing found),
808 /// a single declaration, a set of overloaded functions, or an
809 /// ambiguity. Use the getKind() method to determine which of these
810 /// results occurred for a given lookup.
811 ///
812 /// Any non-ambiguous lookup can be converted into a single
Douglas Gregor09be81b2009-02-04 17:27:36 +0000813 /// (possibly NULL) @c NamedDecl* via a conversion function or the
Douglas Gregor78d70132009-01-14 22:20:51 +0000814 /// getAsDecl() method. This conversion permits the common-case
815 /// usage in C and Objective-C where name lookup will always return
816 /// a single declaration.
Douglas Gregord07474b2009-01-17 01:13:24 +0000817 struct LookupResult {
Douglas Gregor78d70132009-01-14 22:20:51 +0000818 /// The kind of entity that is actually stored within the
819 /// LookupResult object.
Douglas Gregord07474b2009-01-17 01:13:24 +0000820 enum {
Douglas Gregor09be81b2009-02-04 17:27:36 +0000821 /// First is a single declaration (a NamedDecl*), which may be NULL.
Douglas Gregor78d70132009-01-14 22:20:51 +0000822 SingleDecl,
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000823
Douglas Gregor7a7be652009-02-03 19:21:40 +0000824 /// First is a single declaration (an OverloadedFunctionDecl*).
825 OverloadedDeclSingleDecl,
826
Douglas Gregor78d70132009-01-14 22:20:51 +0000827 /// [First, Last) is an iterator range represented as opaque
828 /// pointers used to reconstruct IdentifierResolver::iterators.
829 OverloadedDeclFromIdResolver,
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000830
Douglas Gregor78d70132009-01-14 22:20:51 +0000831 /// [First, Last) is an iterator range represented as opaque
832 /// pointers used to reconstruct DeclContext::lookup_iterators.
833 OverloadedDeclFromDeclContext,
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000834
835 /// First is a pointer to a BasePaths structure, which is owned
836 /// by the LookupResult. Last is non-zero to indicate that the
837 /// ambiguity is caused by two names found in base class
838 /// subobjects of different types.
Douglas Gregor7a7be652009-02-03 19:21:40 +0000839 AmbiguousLookupStoresBasePaths,
840
841 /// [First, Last) is an iterator range represented as opaque
842 /// pointers used to reconstruct new'ed Decl*[] array containing
843 /// found ambiguous decls. LookupResult is owner of this array.
844 AmbiguousLookupStoresDecls
Douglas Gregor78d70132009-01-14 22:20:51 +0000845 } StoredKind;
846
847 /// The first lookup result, whose contents depend on the kind of
Douglas Gregor09be81b2009-02-04 17:27:36 +0000848 /// lookup result. This may be a NamedDecl* (if StoredKind ==
849 /// SingleDecl), OverloadedFunctionDecl* (if StoredKind ==
850 /// OverloadedDeclSingleDecl), the opaque pointer from an
Douglas Gregor78d70132009-01-14 22:20:51 +0000851 /// IdentifierResolver::iterator (if StoredKind ==
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000852 /// OverloadedDeclFromIdResolver), a DeclContext::lookup_iterator
853 /// (if StoredKind == OverloadedDeclFromDeclContext), or a
Douglas Gregor7a7be652009-02-03 19:21:40 +0000854 /// BasePaths pointer (if StoredKind == AmbiguousLookupStoresBasePaths).
Douglas Gregor78d70132009-01-14 22:20:51 +0000855 mutable uintptr_t First;
856
857 /// The last lookup result, whose contents depend on the kind of
858 /// lookup result. This may be unused (if StoredKind ==
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000859 /// SingleDecl), it may have the same type as First (for
860 /// overloaded function declarations), or is may be used as a
Douglas Gregor7a7be652009-02-03 19:21:40 +0000861 /// Boolean value (if StoredKind == AmbiguousLookupStoresBasePaths).
Douglas Gregor78d70132009-01-14 22:20:51 +0000862 mutable uintptr_t Last;
863
864 /// Context - The context in which we will build any
865 /// OverloadedFunctionDecl nodes needed by the conversion to
866 /// Decl*.
867 ASTContext *Context;
868
Douglas Gregor78d70132009-01-14 22:20:51 +0000869 /// @brief The kind of entity found by name lookup.
870 enum LookupKind {
871 /// @brief No entity found met the criteria.
872 NotFound = 0,
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000873
Douglas Gregor78d70132009-01-14 22:20:51 +0000874 /// @brief Name lookup found a single declaration that met the
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000875 /// criteria. getAsDecl will return this declaration.
Douglas Gregor78d70132009-01-14 22:20:51 +0000876 Found,
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000877
Douglas Gregor78d70132009-01-14 22:20:51 +0000878 /// @brief Name lookup found a set of overloaded functions that
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000879 /// met the criteria. getAsDecl will turn this set of overloaded
880 /// functions into an OverloadedFunctionDecl.
Douglas Gregor78d70132009-01-14 22:20:51 +0000881 FoundOverloaded,
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000882
883 /// Name lookup results in an ambiguity because multiple
884 /// entities that meet the lookup criteria were found in
885 /// subobjects of different types. For example:
886 /// @code
887 /// struct A { void f(int); }
888 /// struct B { void f(double); }
889 /// struct C : A, B { };
890 /// void test(C c) {
891 /// c.f(0); // error: A::f and B::f come from subobjects of different
892 /// // types. overload resolution is not performed.
893 /// }
894 /// @endcode
895 AmbiguousBaseSubobjectTypes,
896
897 /// Name lookup results in an ambiguity because multiple
898 /// nonstatic entities that meet the lookup criteria were found
899 /// in different subobjects of the same type. For example:
900 /// @code
901 /// struct A { int x; };
902 /// struct B : A { };
903 /// struct C : A { };
904 /// struct D : B, C { };
905 /// int test(D d) {
906 /// return d.x; // error: 'x' is found in two A subobjects (of B and C)
907 /// }
908 /// @endcode
Douglas Gregor7a7be652009-02-03 19:21:40 +0000909 AmbiguousBaseSubobjects,
910
911 /// Name lookup results in an ambiguity because multiple definitions
912 /// of entity that meet the lookup criteria were found in different
913 /// declaration contexts.
914 /// @code
915 /// namespace A {
916 /// int i;
917 /// namespace B { int i; }
918 /// int test() {
919 /// using namespace B;
920 /// return i; // error 'i' is found in namespace A and A::B
921 /// }
922 /// }
923 /// @endcode
924 AmbiguousReference
Douglas Gregor78d70132009-01-14 22:20:51 +0000925 };
926
Douglas Gregor09be81b2009-02-04 17:27:36 +0000927 static LookupResult CreateLookupResult(ASTContext &Context, NamedDecl *D);
Douglas Gregor6beddfe2009-01-15 02:19:31 +0000928
Douglas Gregord07474b2009-01-17 01:13:24 +0000929 static LookupResult CreateLookupResult(ASTContext &Context,
930 IdentifierResolver::iterator F,
931 IdentifierResolver::iterator L);
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000932
Douglas Gregord07474b2009-01-17 01:13:24 +0000933 static LookupResult CreateLookupResult(ASTContext &Context,
934 DeclContext::lookup_iterator F,
935 DeclContext::lookup_iterator L);
Douglas Gregor78d70132009-01-14 22:20:51 +0000936
Douglas Gregord07474b2009-01-17 01:13:24 +0000937 static LookupResult CreateLookupResult(ASTContext &Context, BasePaths *Paths,
938 bool DifferentSubobjectTypes) {
939 LookupResult Result;
Douglas Gregor7a7be652009-02-03 19:21:40 +0000940 Result.StoredKind = AmbiguousLookupStoresBasePaths;
Douglas Gregord07474b2009-01-17 01:13:24 +0000941 Result.First = reinterpret_cast<uintptr_t>(Paths);
942 Result.Last = DifferentSubobjectTypes? 1 : 0;
943 Result.Context = &Context;
944 return Result;
945 }
Douglas Gregor6beddfe2009-01-15 02:19:31 +0000946
Douglas Gregor7a7be652009-02-03 19:21:40 +0000947 template <typename Iterator>
948 static LookupResult CreateLookupResult(ASTContext &Context,
949 Iterator B, std::size_t Len) {
Douglas Gregor09be81b2009-02-04 17:27:36 +0000950 NamedDecl ** Array = new NamedDecl*[Len];
Douglas Gregor7a7be652009-02-03 19:21:40 +0000951 for (std::size_t Idx = 0; Idx < Len; ++Idx, ++B)
952 Array[Idx] = *B;
953 LookupResult Result;
954 Result.StoredKind = AmbiguousLookupStoresDecls;
955 Result.First = reinterpret_cast<uintptr_t>(Array);
956 Result.Last = reinterpret_cast<uintptr_t>(Array + Len);
957 Result.Context = &Context;
958 return Result;
959 }
960
Douglas Gregor78d70132009-01-14 22:20:51 +0000961 LookupKind getKind() const;
962
963 /// @brief Determine whether name look found something.
964 operator bool() const { return getKind() != NotFound; }
965
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000966 /// @brief Determines whether the lookup resulted in an ambiguity.
Douglas Gregor7a7be652009-02-03 19:21:40 +0000967 bool isAmbiguous() const {
968 return StoredKind == AmbiguousLookupStoresBasePaths ||
969 StoredKind == AmbiguousLookupStoresDecls;
970 }
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000971
Douglas Gregor78d70132009-01-14 22:20:51 +0000972 /// @brief Allows conversion of a lookup result into a
973 /// declaration, with the same behavior as getAsDecl.
Douglas Gregor09be81b2009-02-04 17:27:36 +0000974 operator NamedDecl*() const { return getAsDecl(); }
Douglas Gregor78d70132009-01-14 22:20:51 +0000975
Douglas Gregor09be81b2009-02-04 17:27:36 +0000976 NamedDecl* getAsDecl() const;
Douglas Gregor29dfa2f2009-01-15 00:26:24 +0000977
978 BasePaths *getBasePaths() const;
Douglas Gregorbd4b0852009-02-02 21:35:47 +0000979
980 /// \brief Iterate over the results of name lookup.
981 ///
982 /// The @c iterator class provides iteration over the results of a
983 /// non-ambiguous name lookup.
984 class iterator {
985 /// The LookupResult structure we're iterating through.
986 LookupResult *Result;
987
988 /// The current position of this iterator within the sequence of
989 /// results. This value will have the same representation as the
990 /// @c First field in the LookupResult structure.
991 mutable uintptr_t Current;
992
993 public:
Douglas Gregor09be81b2009-02-04 17:27:36 +0000994 typedef NamedDecl * value_type;
995 typedef NamedDecl * reference;
996 typedef NamedDecl * pointer;
Douglas Gregorbd4b0852009-02-02 21:35:47 +0000997 typedef std::ptrdiff_t difference_type;
998 typedef std::forward_iterator_tag iterator_category;
999
1000 iterator() : Result(0), Current(0) { }
1001
1002 iterator(LookupResult *Res, uintptr_t Cur) : Result(Res), Current(Cur) { }
1003
1004 reference operator*() const;
1005
1006 pointer operator->() const { return **this; }
1007
1008 iterator &operator++();
1009
1010 iterator operator++(int) {
1011 iterator tmp(*this);
1012 ++(*this);
1013 return tmp;
1014 }
1015
1016 friend inline bool operator==(iterator const& x, iterator const& y) {
1017 return x.Current == y.Current;
1018 }
1019
1020 friend inline bool operator!=(iterator const& x, iterator const& y) {
1021 return x.Current != y.Current;
1022 }
1023 };
1024 friend class iterator;
1025
1026 iterator begin();
1027 iterator end();
Douglas Gregord7cb0372009-04-01 21:51:26 +00001028
1029 /// \brief Free the memory associated with this lookup.
1030 void Destroy();
Douglas Gregor78d70132009-01-14 22:20:51 +00001031 };
1032
Douglas Gregor7a7be652009-02-03 19:21:40 +00001033private:
1034 typedef llvm::SmallVector<LookupResult, 3> LookupResultsVecTy;
1035
1036 std::pair<bool, LookupResult> CppLookupName(Scope *S, DeclarationName Name,
1037 LookupNameKind NameKind,
1038 bool RedeclarationOnly);
Fariborz Jahanian0119fd22009-04-07 18:28:06 +00001039 ObjCMethodDecl *FindMethodInNestedImplementations(
1040 const ObjCInterfaceDecl *IFace,
1041 const Selector &Sel);
Douglas Gregor7a7be652009-02-03 19:21:40 +00001042
1043public:
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001044 /// Determines whether D is a suitable lookup result according to the
1045 /// lookup criteria.
Douglas Gregor1c52c632009-02-24 20:03:32 +00001046 static bool isAcceptableLookupResult(NamedDecl *D, LookupNameKind NameKind,
Douglas Gregorb96b92d2009-02-05 19:25:20 +00001047 unsigned IDNS) {
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001048 switch (NameKind) {
1049 case Sema::LookupOrdinaryName:
1050 case Sema::LookupTagName:
1051 case Sema::LookupMemberName:
Douglas Gregor1c52c632009-02-24 20:03:32 +00001052 case Sema::LookupRedeclarationWithLinkage: // FIXME: check linkage, scoping
Douglas Gregorafd5eb32009-04-24 00:11:27 +00001053 case Sema::LookupObjCProtocolName:
1054 case Sema::LookupObjCImplementationName:
1055 case Sema::LookupObjCCategoryImplName:
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001056 return D->isInIdentifierNamespace(IDNS);
1057
Douglas Gregor48a87322009-02-04 16:44:47 +00001058 case Sema::LookupOperatorName:
1059 return D->isInIdentifierNamespace(IDNS) &&
1060 !D->getDeclContext()->isRecord();
1061
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001062 case Sema::LookupNestedNameSpecifierName:
1063 return isa<TypedefDecl>(D) || D->isInIdentifierNamespace(Decl::IDNS_Tag);
1064
1065 case Sema::LookupNamespaceName:
Anders Carlsson7c1c5482009-03-28 23:53:49 +00001066 return isa<NamespaceDecl>(D) || isa<NamespaceAliasDecl>(D);
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001067 }
1068
1069 assert(false &&
Douglas Gregorb96b92d2009-02-05 19:25:20 +00001070 "isAcceptableLookupResult always returns before this point");
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001071 return false;
1072 }
Douglas Gregor29dfa2f2009-01-15 00:26:24 +00001073
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001074 LookupResult LookupName(Scope *S, DeclarationName Name,
1075 LookupNameKind NameKind,
Douglas Gregor411889e2009-02-13 23:20:09 +00001076 bool RedeclarationOnly = false,
Eli Friedman92ca4242009-06-06 02:08:44 +00001077 bool AllowBuiltinCreation = false,
Douglas Gregor411889e2009-02-13 23:20:09 +00001078 SourceLocation Loc = SourceLocation());
Douglas Gregor52ae30c2009-01-30 01:04:22 +00001079 LookupResult LookupQualifiedName(DeclContext *LookupCtx, DeclarationName Name,
1080 LookupNameKind NameKind,
1081 bool RedeclarationOnly = false);
1082 LookupResult LookupParsedName(Scope *S, const CXXScopeSpec *SS,
1083 DeclarationName Name,
1084 LookupNameKind NameKind,
Douglas Gregor411889e2009-02-13 23:20:09 +00001085 bool RedeclarationOnly = false,
Eli Friedman92ca4242009-06-06 02:08:44 +00001086 bool AllowBuiltinCreation = false,
Douglas Gregor411889e2009-02-13 23:20:09 +00001087 SourceLocation Loc = SourceLocation());
Douglas Gregor3fc092f2009-03-13 00:33:25 +00001088
Douglas Gregore57c8cc2009-04-23 23:18:26 +00001089 ObjCProtocolDecl *LookupProtocol(IdentifierInfo *II);
Douglas Gregorafd5eb32009-04-24 00:11:27 +00001090 ObjCImplementationDecl *LookupObjCImplementation(IdentifierInfo *II);
1091 ObjCCategoryImplDecl *LookupObjCCategoryImpl(IdentifierInfo *II);
Douglas Gregore57c8cc2009-04-23 23:18:26 +00001092
Douglas Gregor3fc092f2009-03-13 00:33:25 +00001093 void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
1094 QualType T1, QualType T2,
1095 FunctionSet &Functions);
1096
1097 void ArgumentDependentLookup(DeclarationName Name,
1098 Expr **Args, unsigned NumArgs,
1099 FunctionSet &Functions);
1100
Douglas Gregoraa1da4a2009-02-04 00:32:51 +00001101 void FindAssociatedClassesAndNamespaces(Expr **Args, unsigned NumArgs,
1102 AssociatedNamespaceSet &AssociatedNamespaces,
1103 AssociatedClassSet &AssociatedClasses);
1104
Douglas Gregor29dfa2f2009-01-15 00:26:24 +00001105 bool DiagnoseAmbiguousLookup(LookupResult &Result, DeclarationName Name,
1106 SourceLocation NameLoc,
1107 SourceRange LookupRange = SourceRange());
Douglas Gregor78d70132009-01-14 22:20:51 +00001108 //@}
1109
Ted Kremenek42730c52008-01-07 19:49:32 +00001110 ObjCInterfaceDecl *getObjCInterfaceDecl(IdentifierInfo *Id);
Douglas Gregoraf8ad2b2009-01-20 01:17:11 +00001111 NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID,
Douglas Gregor411889e2009-02-13 23:20:09 +00001112 Scope *S, bool ForRedeclaration,
1113 SourceLocation Loc);
Douglas Gregoraf8ad2b2009-01-20 01:17:11 +00001114 NamedDecl *ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II,
1115 Scope *S);
Douglas Gregorb5af7382009-02-14 18:57:46 +00001116 void AddKnownFunctionAttributes(FunctionDecl *FD);
Douglas Gregor78d70132009-01-14 22:20:51 +00001117
1118 // More parsing and symbol table subroutines.
1119
Chris Lattner4b009652007-07-25 00:24:17 +00001120 // Decl attributes - this routine is the top level dispatcher.
Douglas Gregor2a2e0402009-06-17 21:51:59 +00001121 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
1122 void ProcessDeclAttributeList(Scope *S, Decl *D, const AttributeList *AttrList);
Christopher Lamb2a72bb32008-02-04 02:31:56 +00001123
Steve Naroffb4f48512008-02-10 21:38:56 +00001124 void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
1125 bool &IncompleteImpl);
Fariborz Jahanian4e0f6452008-12-05 18:18:52 +00001126 void WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethod,
1127 ObjCMethodDecl *IntfMethod);
Fariborz Jahanian6e83c922009-05-14 23:52:54 +00001128 bool QualifiedIdConformsQualifiedId(QualType LHS, QualType RHS);
Sebastian Redlb93b49c2008-11-11 11:37:55 +00001129
1130 NamespaceDecl *GetStdNamespace();
Fariborz Jahanianf96ee9e2009-01-12 19:55:42 +00001131
1132 bool isPropertyReadonly(ObjCPropertyDecl *PropertyDecl,
Steve Naroffb0bf2c92009-02-26 19:11:32 +00001133 ObjCInterfaceDecl *IDecl);
Steve Naroffb4f48512008-02-10 21:38:56 +00001134
Chris Lattner7898bf62009-01-06 07:27:21 +00001135 /// CheckProtocolMethodDefs - This routine checks unimplemented
Daniel Dunbar1d706e92008-09-04 20:01:15 +00001136 /// methods declared in protocol, and those referenced by it.
1137 /// \param IDecl - Used for checking for methods which may have been
1138 /// inherited.
Steve Naroffb268d2a2008-02-08 22:06:17 +00001139 void CheckProtocolMethodDefs(SourceLocation ImpLoc,
1140 ObjCProtocolDecl *PDecl,
Fariborz Jahaniand3952f32007-10-02 20:06:01 +00001141 bool& IncompleteImpl,
Steve Naroff7711ee32007-10-08 21:05:34 +00001142 const llvm::DenseSet<Selector> &InsMap,
Daniel Dunbar1d706e92008-09-04 20:01:15 +00001143 const llvm::DenseSet<Selector> &ClsMap,
1144 ObjCInterfaceDecl *IDecl);
Fariborz Jahanianf7cf3a62007-09-29 17:14:55 +00001145
Steve Naroff89529b12007-10-02 21:43:37 +00001146 /// CheckImplementationIvars - This routine checks if the instance variables
1147 /// listed in the implelementation match those listed in the interface.
Ted Kremenek42730c52008-01-07 19:49:32 +00001148 void CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
1149 ObjCIvarDecl **Fields, unsigned nIvars,
Steve Naroffb4f48512008-02-10 21:38:56 +00001150 SourceLocation Loc);
Steve Naroff89529b12007-10-02 21:43:37 +00001151
Fariborz Jahanianf7cf3a62007-09-29 17:14:55 +00001152 /// ImplMethodsVsClassMethods - This is main routine to warn if any method
Chris Lattner7cc13bf2009-03-01 00:56:52 +00001153 /// remains unimplemented in the class or category @implementation.
1154 void ImplMethodsVsClassMethods(ObjCImplDecl* IMPDecl,
1155 ObjCContainerDecl* IDecl,
1156 bool IncompleteImpl = false);
Fariborz Jahanianf7cf3a62007-09-29 17:14:55 +00001157
Fariborz Jahanian67907bd2007-10-05 18:00:57 +00001158 /// MatchTwoMethodDeclarations - Checks if two methods' type match and returns
1159 /// true, or false, accordingly.
Ted Kremenek42730c52008-01-07 19:49:32 +00001160 bool MatchTwoMethodDeclarations(const ObjCMethodDecl *Method,
Steve Naroffb91afca2008-10-21 10:37:50 +00001161 const ObjCMethodDecl *PrevMethod,
1162 bool matchBasedOnSizeAndAlignment = false);
Steve Naroffee1de132007-10-10 21:53:07 +00001163
Fariborz Jahanian78eca5d2009-05-01 20:07:12 +00001164 /// MatchAllMethodDeclarations - Check methods declaraed in interface or
1165 /// or protocol against those declared in their implementations.
1166 void MatchAllMethodDeclarations(const llvm::DenseSet<Selector> &InsMap,
1167 const llvm::DenseSet<Selector> &ClsMap,
1168 llvm::DenseSet<Selector> &InsMapSeen,
1169 llvm::DenseSet<Selector> &ClsMapSeen,
1170 ObjCImplDecl* IMPDecl,
1171 ObjCContainerDecl* IDecl,
1172 bool &IncompleteImpl,
1173 bool ImmediateClass);
1174
Steve Naroff8255b042007-10-14 00:58:41 +00001175 /// AddInstanceMethodToGlobalPool - All instance methods in a translation
1176 /// unit are added to a global pool. This allows us to efficiently associate
1177 /// a selector with a method declaraation for purposes of typechecking
1178 /// messages sent to "id" (where the class of the object is unknown).
Ted Kremenek42730c52008-01-07 19:49:32 +00001179 void AddInstanceMethodToGlobalPool(ObjCMethodDecl *Method);
Steve Naroff8255b042007-10-14 00:58:41 +00001180
Steve Naroff68354f32008-09-30 14:38:43 +00001181 /// LookupInstanceMethodInGlobalPool - Returns the method and warns if
1182 /// there are multiple signatures.
1183 ObjCMethodDecl *LookupInstanceMethodInGlobalPool(Selector Sel, SourceRange R);
Douglas Gregorc3221aa2009-04-24 21:10:55 +00001184
1185 /// LookupFactoryMethodInGlobalPool - Returns the method and warns if
1186 /// there are multiple signatures.
1187 ObjCMethodDecl *LookupFactoryMethodInGlobalPool(Selector Sel, SourceRange R);
Steve Naroff68354f32008-09-30 14:38:43 +00001188
Steve Naroff8255b042007-10-14 00:58:41 +00001189 /// AddFactoryMethodToGlobalPool - Same as above, but for factory methods.
Ted Kremenek42730c52008-01-07 19:49:32 +00001190 void AddFactoryMethodToGlobalPool(ObjCMethodDecl *Method);
Chris Lattner4b009652007-07-25 00:24:17 +00001191 //===--------------------------------------------------------------------===//
1192 // Statement Parsing Callbacks: SemaStmt.cpp.
1193public:
Anders Carlsson18ca4772009-05-17 21:11:30 +00001194 virtual OwningStmtResult ActOnExprStmt(FullExprArg Expr);
Sebastian Redl76b9ddb2008-12-21 12:04:03 +00001195
1196 virtual OwningStmtResult ActOnNullStmt(SourceLocation SemiLoc);
1197 virtual OwningStmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R,
1198 MultiStmtArg Elts,
1199 bool isStmtExpr);
Chris Lattnera17991f2009-03-29 16:50:03 +00001200 virtual OwningStmtResult ActOnDeclStmt(DeclGroupPtrTy Decl,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001201 SourceLocation StartLoc,
Sebastian Redl76b9ddb2008-12-21 12:04:03 +00001202 SourceLocation EndLoc);
Sebastian Redl0a23e8f2008-12-28 16:13:43 +00001203 virtual OwningStmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprArg LHSVal,
1204 SourceLocation DotDotDotLoc, ExprArg RHSVal,
Chris Lattnerdaac6942009-03-04 04:23:07 +00001205 SourceLocation ColonLoc);
1206 virtual void ActOnCaseStmtBody(StmtTy *CaseStmt, StmtArg SubStmt);
1207
Sebastian Redl0a23e8f2008-12-28 16:13:43 +00001208 virtual OwningStmtResult ActOnDefaultStmt(SourceLocation DefaultLoc,
1209 SourceLocation ColonLoc,
1210 StmtArg SubStmt, Scope *CurScope);
Sebastian Redl2437ec62009-01-11 00:38:46 +00001211 virtual OwningStmtResult ActOnLabelStmt(SourceLocation IdentLoc,
1212 IdentifierInfo *II,
1213 SourceLocation ColonLoc,
1214 StmtArg SubStmt);
Anders Carlssone4d37892009-05-17 18:26:53 +00001215 virtual OwningStmtResult ActOnIfStmt(SourceLocation IfLoc,
1216 FullExprArg CondVal, StmtArg ThenVal,
1217 SourceLocation ElseLoc, StmtArg ElseVal);
Sebastian Redl2437ec62009-01-11 00:38:46 +00001218 virtual OwningStmtResult ActOnStartOfSwitchStmt(ExprArg Cond);
1219 virtual OwningStmtResult ActOnFinishSwitchStmt(SourceLocation SwitchLoc,
1220 StmtArg Switch, StmtArg Body);
Anders Carlsson3ee2dae2009-05-17 21:22:26 +00001221 virtual OwningStmtResult ActOnWhileStmt(SourceLocation WhileLoc,
1222 FullExprArg Cond, StmtArg Body);
Sebastian Redl19c74d32009-01-16 23:28:06 +00001223 virtual OwningStmtResult ActOnDoStmt(SourceLocation DoLoc, StmtArg Body,
Chris Lattner0485d882009-06-12 23:04:47 +00001224 SourceLocation WhileLoc,
1225 SourceLocation CondLParen, ExprArg Cond,
1226 SourceLocation CondRParen);
Sebastian Redl19c74d32009-01-16 23:28:06 +00001227
1228 virtual OwningStmtResult ActOnForStmt(SourceLocation ForLoc,
1229 SourceLocation LParenLoc,
1230 StmtArg First, ExprArg Second,
1231 ExprArg Third, SourceLocation RParenLoc,
1232 StmtArg Body);
1233 virtual OwningStmtResult ActOnObjCForCollectionStmt(SourceLocation ForColLoc,
1234 SourceLocation LParenLoc,
1235 StmtArg First, ExprArg Second,
1236 SourceLocation RParenLoc, StmtArg Body);
Sebastian Redl539eb572009-01-18 13:19:59 +00001237
1238 virtual OwningStmtResult ActOnGotoStmt(SourceLocation GotoLoc,
1239 SourceLocation LabelLoc,
1240 IdentifierInfo *LabelII);
1241 virtual OwningStmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
1242 SourceLocation StarLoc,
1243 ExprArg DestExp);
1244 virtual OwningStmtResult ActOnContinueStmt(SourceLocation ContinueLoc,
1245 Scope *CurScope);
1246 virtual OwningStmtResult ActOnBreakStmt(SourceLocation GotoLoc,
1247 Scope *CurScope);
1248
1249 virtual OwningStmtResult ActOnReturnStmt(SourceLocation ReturnLoc,
Anders Carlsson1d768742009-05-30 21:42:34 +00001250 FullExprArg RetValExp);
Sebastian Redl539eb572009-01-18 13:19:59 +00001251 OwningStmtResult ActOnBlockReturnStmt(SourceLocation ReturnLoc,
1252 Expr *RetValExp);
1253
Sebastian Redlc6b86332009-01-18 16:53:17 +00001254 virtual OwningStmtResult ActOnAsmStmt(SourceLocation AsmLoc,
1255 bool IsSimple,
1256 bool IsVolatile,
1257 unsigned NumOutputs,
1258 unsigned NumInputs,
1259 std::string *Names,
1260 MultiExprArg Constraints,
1261 MultiExprArg Exprs,
1262 ExprArg AsmString,
1263 MultiExprArg Clobbers,
1264 SourceLocation RParenLoc);
Sebastian Redlb3860a72009-01-18 17:43:11 +00001265
1266 virtual OwningStmtResult ActOnObjCAtCatchStmt(SourceLocation AtLoc,
1267 SourceLocation RParen,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001268 DeclPtrTy Parm, StmtArg Body,
Sebastian Redlb3860a72009-01-18 17:43:11 +00001269 StmtArg CatchList);
1270
1271 virtual OwningStmtResult ActOnObjCAtFinallyStmt(SourceLocation AtLoc,
1272 StmtArg Body);
1273
1274 virtual OwningStmtResult ActOnObjCAtTryStmt(SourceLocation AtLoc,
1275 StmtArg Try,
1276 StmtArg Catch, StmtArg Finally);
1277
1278 virtual OwningStmtResult ActOnObjCAtThrowStmt(SourceLocation AtLoc,
Steve Naroff590fe482009-02-11 20:05:44 +00001279 ExprArg Throw,
1280 Scope *CurScope);
Sebastian Redlb3860a72009-01-18 17:43:11 +00001281 virtual OwningStmtResult ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc,
1282 ExprArg SynchExpr,
1283 StmtArg SynchBody);
Sebastian Redlb12ac332008-12-21 16:41:36 +00001284
Douglas Gregor57420b42009-05-18 20:51:54 +00001285 VarDecl *BuildExceptionDeclaration(Scope *S, QualType ExDeclType,
1286 IdentifierInfo *Name,
1287 SourceLocation Loc,
1288 SourceRange Range);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001289 virtual DeclPtrTy ActOnExceptionDeclarator(Scope *S, Declarator &D);
Douglas Gregor57420b42009-05-18 20:51:54 +00001290
Sebastian Redl743c8162008-12-22 19:15:10 +00001291 virtual OwningStmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001292 DeclPtrTy ExDecl,
Sebastian Redl743c8162008-12-22 19:15:10 +00001293 StmtArg HandlerBlock);
Sebastian Redl237116b2008-12-22 21:35:02 +00001294 virtual OwningStmtResult ActOnCXXTryBlock(SourceLocation TryLoc,
1295 StmtArg TryBlock,
1296 MultiStmtArg Handlers);
Sebastian Redl3b1ef312009-04-27 21:33:24 +00001297 void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock);
Sebastian Redlb12ac332008-12-21 16:41:36 +00001298
Chris Lattner4b009652007-07-25 00:24:17 +00001299 //===--------------------------------------------------------------------===//
1300 // Expression Parsing Callbacks: SemaExpr.cpp.
1301
Douglas Gregoraa57e862009-02-18 21:56:37 +00001302 bool DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc);
Fariborz Jahanian80ccaa92009-05-08 20:20:55 +00001303 bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD,
1304 ObjCMethodDecl *Getter,
1305 SourceLocation Loc);
Fariborz Jahanian180f3412009-05-13 18:09:35 +00001306 void DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
1307 Expr **Args, unsigned NumArgs);
Chris Lattner2cb744b2009-02-15 22:43:40 +00001308
Chris Lattner4b009652007-07-25 00:24:17 +00001309 // Primary Expressions.
Douglas Gregor3bb30002009-02-26 21:00:50 +00001310 virtual SourceRange getExprRange(ExprTy *E) const;
1311
Sebastian Redlcd883f72009-01-18 18:53:16 +00001312 virtual OwningExprResult ActOnIdentifierExpr(Scope *S, SourceLocation Loc,
1313 IdentifierInfo &II,
1314 bool HasTrailingLParen,
Sebastian Redl0c9da212009-02-03 20:19:35 +00001315 const CXXScopeSpec *SS = 0,
1316 bool isAddressOfOperand = false);
Sebastian Redlcd883f72009-01-18 18:53:16 +00001317 virtual OwningExprResult ActOnCXXOperatorFunctionIdExpr(Scope *S,
Douglas Gregor24094772008-11-19 19:09:45 +00001318 SourceLocation OperatorLoc,
1319 OverloadedOperatorKind Op,
1320 bool HasTrailingLParen,
Sebastian Redl0c9da212009-02-03 20:19:35 +00001321 const CXXScopeSpec &SS,
1322 bool isAddressOfOperand);
Sebastian Redlcd883f72009-01-18 18:53:16 +00001323 virtual OwningExprResult ActOnCXXConversionFunctionExpr(Scope *S,
Douglas Gregor24094772008-11-19 19:09:45 +00001324 SourceLocation OperatorLoc,
1325 TypeTy *Ty,
1326 bool HasTrailingLParen,
Sebastian Redl0c9da212009-02-03 20:19:35 +00001327 const CXXScopeSpec &SS,
1328 bool isAddressOfOperand);
Douglas Gregor566782a2009-01-06 05:10:23 +00001329 DeclRefExpr *BuildDeclRefExpr(NamedDecl *D, QualType Ty, SourceLocation Loc,
1330 bool TypeDependent, bool ValueDependent,
1331 const CXXScopeSpec *SS = 0);
Douglas Gregorcc94ab72009-04-15 06:41:24 +00001332 VarDecl *BuildAnonymousStructUnionMemberPath(FieldDecl *Field,
1333 llvm::SmallVectorImpl<FieldDecl *> &Path);
Sebastian Redlcd883f72009-01-18 18:53:16 +00001334 OwningExprResult
Douglas Gregor723d3332009-01-07 00:43:41 +00001335 BuildAnonymousStructUnionMemberReference(SourceLocation Loc,
1336 FieldDecl *Field,
1337 Expr *BaseObjectExpr = 0,
1338 SourceLocation OpLoc = SourceLocation());
Sebastian Redlcd883f72009-01-18 18:53:16 +00001339 OwningExprResult ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc,
1340 DeclarationName Name,
1341 bool HasTrailingLParen,
1342 const CXXScopeSpec *SS,
Sebastian Redl0c9da212009-02-03 20:19:35 +00001343 bool isAddressOfOperand = false);
Douglas Gregoraee3bf82008-11-18 15:03:34 +00001344
Sebastian Redlcd883f72009-01-18 18:53:16 +00001345 virtual OwningExprResult ActOnPredefinedExpr(SourceLocation Loc,
1346 tok::TokenKind Kind);
1347 virtual OwningExprResult ActOnNumericConstant(const Token &);
1348 virtual OwningExprResult ActOnCharacterConstant(const Token &);
1349 virtual OwningExprResult ActOnParenExpr(SourceLocation L, SourceLocation R,
1350 ExprArg Val);
Chris Lattner4b009652007-07-25 00:24:17 +00001351
Steve Naroff87d58b42007-09-16 03:34:24 +00001352 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
Chris Lattner4b009652007-07-25 00:24:17 +00001353 /// fragments (e.g. "foo" "bar" L"baz").
Sebastian Redl8b769972009-01-19 00:08:26 +00001354 virtual OwningExprResult ActOnStringLiteral(const Token *Toks,
1355 unsigned NumToks);
Sebastian Redlcd883f72009-01-18 18:53:16 +00001356
Chris Lattner4b009652007-07-25 00:24:17 +00001357 // Binary/Unary Operators. 'Tok' is the token for the operator.
Douglas Gregorc78182d2009-03-13 23:49:33 +00001358 OwningExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc,
1359 unsigned OpcIn,
1360 ExprArg InputArg);
Sebastian Redl8b769972009-01-19 00:08:26 +00001361 virtual OwningExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc,
1362 tok::TokenKind Op, ExprArg Input);
Sebastian Redl0cb7c872008-11-11 17:56:53 +00001363
Douglas Gregor396f1142009-03-13 21:01:28 +00001364 OwningExprResult CreateSizeOfAlignOfExpr(QualType T, SourceLocation OpLoc,
1365 bool isSizeOf, SourceRange R);
1366 OwningExprResult CreateSizeOfAlignOfExpr(Expr *E, SourceLocation OpLoc,
1367 bool isSizeOf, SourceRange R);
Douglas Gregorc78182d2009-03-13 23:49:33 +00001368 virtual OwningExprResult
1369 ActOnSizeOfAlignOfExpr(SourceLocation OpLoc, bool isSizeof, bool isType,
1370 void *TyOrEx, const SourceRange &ArgRange);
Douglas Gregor396f1142009-03-13 21:01:28 +00001371
Chris Lattner8d9f7962009-01-24 20:17:12 +00001372 bool CheckAlignOfExpr(Expr *E, SourceLocation OpLoc, const SourceRange &R);
Sebastian Redl0cb7c872008-11-11 17:56:53 +00001373 bool CheckSizeOfAlignOfOperand(QualType type, SourceLocation OpLoc,
1374 const SourceRange &R, bool isSizeof);
Sebastian Redl8b769972009-01-19 00:08:26 +00001375
1376 virtual OwningExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
1377 tok::TokenKind Kind,
1378 ExprArg Input);
1379
1380 virtual OwningExprResult ActOnArraySubscriptExpr(Scope *S, ExprArg Base,
1381 SourceLocation LLoc,
1382 ExprArg Idx,
1383 SourceLocation RLoc);
1384 virtual OwningExprResult ActOnMemberReferenceExpr(Scope *S, ExprArg Base,
1385 SourceLocation OpLoc,
1386 tok::TokenKind OpKind,
1387 SourceLocation MemberLoc,
Fariborz Jahanian0cc2ac12009-03-04 22:30:12 +00001388 IdentifierInfo &Member,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001389 DeclPtrTy ImplDecl);
Sebastian Redl8b769972009-01-19 00:08:26 +00001390 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
Douglas Gregor3257fb52008-12-22 05:46:06 +00001391 FunctionDecl *FDecl,
Douglas Gregor4fa58902009-02-26 23:50:07 +00001392 const FunctionProtoType *Proto,
Douglas Gregor3257fb52008-12-22 05:46:06 +00001393 Expr **Args, unsigned NumArgs,
1394 SourceLocation RParenLoc);
Sebastian Redl8b769972009-01-19 00:08:26 +00001395
Steve Naroff87d58b42007-09-16 03:34:24 +00001396 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
Chris Lattner4b009652007-07-25 00:24:17 +00001397 /// This provides the location of the left/right parens and a list of comma
1398 /// locations.
Sebastian Redl8b769972009-01-19 00:08:26 +00001399 virtual OwningExprResult ActOnCallExpr(Scope *S, ExprArg Fn,
1400 SourceLocation LParenLoc,
1401 MultiExprArg Args,
1402 SourceLocation *CommaLocs,
1403 SourceLocation RParenLoc);
1404
Sebastian Redl5457c5e2009-01-19 22:31:54 +00001405 virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
1406 SourceLocation RParenLoc, ExprArg Op);
1407
1408 virtual OwningExprResult ActOnCompoundLiteral(SourceLocation LParenLoc,
1409 TypeTy *Ty,
1410 SourceLocation RParenLoc,
1411 ExprArg Op);
1412
1413 virtual OwningExprResult ActOnInitList(SourceLocation LParenLoc,
1414 MultiExprArg InitList,
Sebastian Redl5457c5e2009-01-19 22:31:54 +00001415 SourceLocation RParenLoc);
1416
Douglas Gregorc5a6bdc2009-01-22 00:58:24 +00001417 virtual OwningExprResult ActOnDesignatedInitializer(Designation &Desig,
1418 SourceLocation Loc,
Douglas Gregor5f34f0e2009-03-28 00:41:23 +00001419 bool GNUSyntax,
Douglas Gregorc5a6bdc2009-01-22 00:58:24 +00001420 OwningExprResult Init);
1421
Sebastian Redl5457c5e2009-01-19 22:31:54 +00001422 virtual OwningExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc,
1423 tok::TokenKind Kind,
1424 ExprArg LHS, ExprArg RHS);
1425 OwningExprResult CreateBuiltinBinOp(SourceLocation TokLoc,
1426 unsigned Opc, Expr *lhs, Expr *rhs);
Douglas Gregord7f915e2008-11-06 23:29:22 +00001427
Steve Naroff87d58b42007-09-16 03:34:24 +00001428 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
Chris Lattner4b009652007-07-25 00:24:17 +00001429 /// in the case of a the GNU conditional expr extension.
Sebastian Redl5457c5e2009-01-19 22:31:54 +00001430 virtual OwningExprResult ActOnConditionalOp(SourceLocation QuestionLoc,
1431 SourceLocation ColonLoc,
1432 ExprArg Cond, ExprArg LHS,
1433 ExprArg RHS);
Chris Lattner4b009652007-07-25 00:24:17 +00001434
Steve Naroff5cbb02f2007-09-16 14:56:35 +00001435 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001436 virtual OwningExprResult ActOnAddrLabel(SourceLocation OpLoc,
1437 SourceLocation LabLoc,
1438 IdentifierInfo *LabelII);
1439
1440 virtual OwningExprResult ActOnStmtExpr(SourceLocation LPLoc, StmtArg SubStmt,
1441 SourceLocation RPLoc); // "({..})"
Chris Lattner0d9bcea2007-08-30 17:45:32 +00001442
1443 /// __builtin_offsetof(type, a.b[123][456].c)
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001444 virtual OwningExprResult ActOnBuiltinOffsetOf(Scope *S,
1445 SourceLocation BuiltinLoc,
1446 SourceLocation TypeLoc,
1447 TypeTy *Arg1,
1448 OffsetOfComponent *CompPtr,
1449 unsigned NumComponents,
1450 SourceLocation RParenLoc);
1451
Steve Naroff63bad2d2007-08-01 22:05:33 +00001452 // __builtin_types_compatible_p(type1, type2)
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001453 virtual OwningExprResult ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc,
1454 TypeTy *arg1, TypeTy *arg2,
1455 SourceLocation RPLoc);
1456
Steve Naroff93c53012007-08-03 21:21:27 +00001457 // __builtin_choose_expr(constExpr, expr1, expr2)
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001458 virtual OwningExprResult ActOnChooseExpr(SourceLocation BuiltinLoc,
1459 ExprArg cond, ExprArg expr1,
1460 ExprArg expr2, SourceLocation RPLoc);
1461
Anders Carlsson36760332007-10-15 20:28:48 +00001462 // __builtin_va_arg(expr, type)
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001463 virtual OwningExprResult ActOnVAArg(SourceLocation BuiltinLoc,
1464 ExprArg expr, TypeTy *type,
1465 SourceLocation RPLoc);
Steve Naroff52a81c02008-09-03 18:15:37 +00001466
Douglas Gregorad4b3792008-11-29 04:51:27 +00001467 // __null
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001468 virtual OwningExprResult ActOnGNUNullExpr(SourceLocation TokenLoc);
Douglas Gregorad4b3792008-11-29 04:51:27 +00001469
Steve Naroff52a81c02008-09-03 18:15:37 +00001470 //===------------------------- "Block" Extension ------------------------===//
1471
1472 /// ActOnBlockStart - This callback is invoked when a block literal is
1473 /// started.
Steve Naroff52059382008-10-10 01:28:17 +00001474 virtual void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001475
Steve Naroff52059382008-10-10 01:28:17 +00001476 /// ActOnBlockArguments - This callback allows processing of block arguments.
1477 /// If there are no arguments, this is still invoked.
Mike Stumpc1fddff2009-02-04 22:31:32 +00001478 virtual void ActOnBlockArguments(Declarator &ParamInfo, Scope *CurScope);
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001479
Steve Naroff52a81c02008-09-03 18:15:37 +00001480 /// ActOnBlockError - If there is an error parsing a block, this callback
1481 /// is invoked to pop the information about the block from the action impl.
1482 virtual void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001483
Steve Naroff52a81c02008-09-03 18:15:37 +00001484 /// ActOnBlockStmtExpr - This is called when the body of a block statement
1485 /// literal was successfully completed. ^(int x){...}
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001486 virtual OwningExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc,
1487 StmtArg Body, Scope *CurScope);
Steve Naroff52a81c02008-09-03 18:15:37 +00001488
Chris Lattner2cb744b2009-02-15 22:43:40 +00001489 //===---------------------------- C++ Features --------------------------===//
1490
Argiris Kirtzidis03e6aaf2008-04-27 13:50:30 +00001491 // Act on C++ namespaces
Chris Lattner5261d0c2009-03-28 19:18:32 +00001492 virtual DeclPtrTy ActOnStartNamespaceDef(Scope *S, SourceLocation IdentLoc,
1493 IdentifierInfo *Ident,
1494 SourceLocation LBrace);
1495 virtual void ActOnFinishNamespaceDef(DeclPtrTy Dcl, SourceLocation RBrace);
Argiris Kirtzidis03e6aaf2008-04-27 13:50:30 +00001496
Chris Lattner5261d0c2009-03-28 19:18:32 +00001497 virtual DeclPtrTy ActOnUsingDirective(Scope *CurScope,
1498 SourceLocation UsingLoc,
1499 SourceLocation NamespcLoc,
1500 const CXXScopeSpec &SS,
1501 SourceLocation IdentLoc,
1502 IdentifierInfo *NamespcName,
1503 AttributeList *AttrList);
Anders Carlsson8cffcd62009-03-28 05:27:17 +00001504
Douglas Gregor7a7be652009-02-03 19:21:40 +00001505 void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir);
1506
Chris Lattner5261d0c2009-03-28 19:18:32 +00001507 virtual DeclPtrTy ActOnNamespaceAliasDef(Scope *CurScope,
Anders Carlsson26de7882009-03-28 22:53:22 +00001508 SourceLocation NamespaceLoc,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001509 SourceLocation AliasLoc,
1510 IdentifierInfo *Alias,
1511 const CXXScopeSpec &SS,
Anders Carlsson26de7882009-03-28 22:53:22 +00001512 SourceLocation IdentLoc,
1513 IdentifierInfo *Ident);
Anders Carlsson8cffcd62009-03-28 05:27:17 +00001514
Argiris Kirtzidis9e55d462008-10-06 17:10:33 +00001515 /// AddCXXDirectInitializerToDecl - This action is called immediately after
1516 /// ActOnDeclarator, when a C++ direct initializer is present.
1517 /// e.g: "int x(1);"
Chris Lattner5261d0c2009-03-28 19:18:32 +00001518 virtual void AddCXXDirectInitializerToDecl(DeclPtrTy Dcl,
Argiris Kirtzidis9e55d462008-10-06 17:10:33 +00001519 SourceLocation LParenLoc,
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001520 MultiExprArg Exprs,
Argiris Kirtzidis9e55d462008-10-06 17:10:33 +00001521 SourceLocation *CommaLocs,
1522 SourceLocation RParenLoc);
1523
Anders Carlsson6a95cd12009-04-24 05:16:06 +00001524 /// InitializeVarWithConstructor - Creates an CXXConstructExpr
1525 /// and sets it as the initializer for the the passed in VarDecl.
Anders Carlsson05e59652009-04-16 23:50:50 +00001526 void InitializeVarWithConstructor(VarDecl *VD,
1527 CXXConstructorDecl *Constructor,
1528 QualType DeclInitType,
1529 Expr **Exprs, unsigned NumExprs);
Anders Carlssona05fa102009-05-30 20:36:53 +00001530
1531 /// MaybeBindToTemporary - If the passed in expression has a record type with
1532 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
1533 /// it simply returns the passed in expression.
1534 OwningExprResult MaybeBindToTemporary(Expr *E);
1535
Anders Carlssona8969cb2009-05-30 22:47:03 +00001536 /// RemoveOutermostTemporaryBinding - Remove and destroy the outermost
1537 /// CXXBindToTemporaryExpr if necessary. This is used when we want to not
1538 /// destroy a temporary when a full expression has been evaluated.
1539 /// For example:
1540 ///
1541 /// const T& t = T(10, T());
1542 ///
1543 /// Here the outermost T needs to be destroyed when t goes out of scope, but
1544 /// the innermost T needs to be destroyed when the expr has been evaluated.
1545 Expr *RemoveOutermostTemporaryBinding(Expr *E);
1546
Douglas Gregor6428e762008-11-05 15:29:30 +00001547 /// InitializationKind - Represents which kind of C++ initialization
1548 /// [dcl.init] a routine is to perform.
1549 enum InitializationKind {
1550 IK_Direct, ///< Direct initialization
1551 IK_Copy, ///< Copy initialization
1552 IK_Default ///< Default initialization
1553 };
1554
Douglas Gregor5870a952008-11-03 20:45:27 +00001555 CXXConstructorDecl *
Douglas Gregor6428e762008-11-05 15:29:30 +00001556 PerformInitializationByConstructor(QualType ClassType,
1557 Expr **Args, unsigned NumArgs,
1558 SourceLocation Loc, SourceRange Range,
Chris Lattner271d4c22008-11-24 05:29:24 +00001559 DeclarationName InitEntity,
Douglas Gregor6428e762008-11-05 15:29:30 +00001560 InitializationKind Kind);
Douglas Gregor5870a952008-11-03 20:45:27 +00001561
Douglas Gregor21a04f32008-10-27 19:41:14 +00001562 /// ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const}_cast's.
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001563 virtual OwningExprResult ActOnCXXNamedCast(SourceLocation OpLoc,
1564 tok::TokenKind Kind,
1565 SourceLocation LAngleBracketLoc,
1566 TypeTy *Ty,
1567 SourceLocation RAngleBracketLoc,
1568 SourceLocation LParenLoc,
1569 ExprArg E,
1570 SourceLocation RParenLoc);
Chris Lattner4b009652007-07-25 00:24:17 +00001571
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001572 /// ActOnCXXTypeid - Parse typeid( something ).
1573 virtual OwningExprResult ActOnCXXTypeid(SourceLocation OpLoc,
1574 SourceLocation LParenLoc, bool isType,
1575 void *TyOrExpr,
1576 SourceLocation RParenLoc);
Sebastian Redlb93b49c2008-11-11 11:37:55 +00001577
Argiris Kirtzidis38f16712008-07-01 10:37:29 +00001578 //// ActOnCXXThis - Parse 'this' pointer.
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001579 virtual OwningExprResult ActOnCXXThis(SourceLocation ThisLoc);
Argiris Kirtzidis38f16712008-07-01 10:37:29 +00001580
Steve Naroff5cbb02f2007-09-16 14:56:35 +00001581 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001582 virtual OwningExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc,
1583 tok::TokenKind Kind);
1584
Sebastian Redl5d0ead72009-05-10 18:38:11 +00001585 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
1586 virtual OwningExprResult ActOnCXXNullPtrLiteral(SourceLocation Loc);
1587
Chris Lattnera7447ba2008-02-26 00:51:44 +00001588 //// ActOnCXXThrow - Parse throw expressions.
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001589 virtual OwningExprResult ActOnCXXThrow(SourceLocation OpLoc,
1590 ExprArg expr);
Sebastian Redl9949a5e2009-04-27 20:27:31 +00001591 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *&E);
Chris Lattnera7447ba2008-02-26 00:51:44 +00001592
Argiris Kirtzidis7a1e7412008-08-22 15:38:55 +00001593 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
1594 /// Can be interpreted either as function-style casting ("int(x)")
1595 /// or class type construction ("ClassType(x,y,z)")
1596 /// or creation of a value-initialized type ("int()").
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001597 virtual OwningExprResult ActOnCXXTypeConstructExpr(SourceRange TypeRange,
1598 TypeTy *TypeRep,
1599 SourceLocation LParenLoc,
1600 MultiExprArg Exprs,
1601 SourceLocation *CommaLocs,
1602 SourceLocation RParenLoc);
Argiris Kirtzidis7a1e7412008-08-22 15:38:55 +00001603
Sebastian Redl19fec9d2008-11-21 19:14:01 +00001604 /// ActOnCXXNew - Parsed a C++ 'new' expression.
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001605 virtual OwningExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
1606 SourceLocation PlacementLParen,
1607 MultiExprArg PlacementArgs,
1608 SourceLocation PlacementRParen,
1609 bool ParenTypeId, Declarator &D,
1610 SourceLocation ConstructorLParen,
1611 MultiExprArg ConstructorArgs,
1612 SourceLocation ConstructorRParen);
Douglas Gregord8c23702009-05-21 00:00:09 +00001613 OwningExprResult BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
1614 SourceLocation PlacementLParen,
1615 MultiExprArg PlacementArgs,
1616 SourceLocation PlacementRParen,
1617 bool ParenTypeId,
1618 QualType AllocType,
1619 SourceLocation TypeLoc,
1620 SourceRange TypeRange,
1621 ExprArg ArraySize,
1622 SourceLocation ConstructorLParen,
1623 MultiExprArg ConstructorArgs,
1624 SourceLocation ConstructorRParen);
1625
1626 bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
1627 SourceRange R);
Sebastian Redl3b7ec4b2009-02-09 18:24:27 +00001628 bool FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
1629 bool UseGlobal, QualType AllocType, bool IsArray,
Sebastian Redlb5ee8742008-12-03 20:26:15 +00001630 Expr **PlaceArgs, unsigned NumPlaceArgs,
1631 FunctionDecl *&OperatorNew,
1632 FunctionDecl *&OperatorDelete);
Sebastian Redl3b7ec4b2009-02-09 18:24:27 +00001633 bool FindAllocationOverload(SourceLocation StartLoc, SourceRange Range,
1634 DeclarationName Name, Expr** Args,
1635 unsigned NumArgs, DeclContext *Ctx,
Sebastian Redlec5f3262008-12-04 22:20:51 +00001636 bool AllowMissing, FunctionDecl *&Operator);
Sebastian Redlb5ee8742008-12-03 20:26:15 +00001637 void DeclareGlobalNewDelete();
1638 void DeclareGlobalAllocationFunction(DeclarationName Name, QualType Return,
1639 QualType Argument);
Sebastian Redl19fec9d2008-11-21 19:14:01 +00001640
1641 /// ActOnCXXDelete - Parsed a C++ 'delete' expression
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001642 virtual OwningExprResult ActOnCXXDelete(SourceLocation StartLoc,
1643 bool UseGlobal, bool ArrayForm,
1644 ExprArg Operand);
Sebastian Redl19fec9d2008-11-21 19:14:01 +00001645
Argiris Kirtzidis810c0f72008-09-10 02:17:11 +00001646 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
1647 /// C++ if/switch/while/for statement.
1648 /// e.g: "if (int x = f()) {...}"
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001649 virtual OwningExprResult ActOnCXXConditionDeclarationExpr(Scope *S,
Argiris Kirtzidis810c0f72008-09-10 02:17:11 +00001650 SourceLocation StartLoc,
1651 Declarator &D,
1652 SourceLocation EqualLoc,
Sebastian Redl76bb8ec2009-03-15 17:47:39 +00001653 ExprArg AssignExprVal);
Argiris Kirtzidis810c0f72008-09-10 02:17:11 +00001654
Sebastian Redl39c0f6f2009-01-05 20:52:13 +00001655 /// ActOnUnaryTypeTrait - Parsed one of the unary type trait support
1656 /// pseudo-functions.
1657 virtual OwningExprResult ActOnUnaryTypeTrait(UnaryTypeTrait OTT,
1658 SourceLocation KWLoc,
1659 SourceLocation LParen,
1660 TypeTy *Ty,
1661 SourceLocation RParen);
1662
Anders Carlsson8f75fbc2009-06-05 15:38:08 +00001663 /// MaybeCreateCXXExprWithTemporaries - If the list of temporaries is
1664 /// non-empty, will create a new CXXExprWithTemporaries expression.
1665 /// Otherwise, just returs the passed in expression.
Anders Carlsson37bb2bd2009-06-16 03:37:31 +00001666 Expr *MaybeCreateCXXExprWithTemporaries(Expr *SubExpr,
1667 bool ShouldDestroyTemporaries);
Anders Carlsson8f75fbc2009-06-05 15:38:08 +00001668
Anders Carlssonf0967d72009-05-17 18:41:29 +00001669 virtual OwningExprResult ActOnFinishFullExpr(ExprArg Expr);
1670
Douglas Gregor6e7c27c2009-03-11 16:48:53 +00001671 bool RequireCompleteDeclContext(const CXXScopeSpec &SS);
Douglas Gregor734b4ba2009-03-19 00:18:19 +00001672
1673 DeclContext *computeDeclContext(const CXXScopeSpec &SS);
Douglas Gregor47bde7c2009-03-19 17:26:29 +00001674 bool isDependentScopeSpecifier(const CXXScopeSpec &SS);
Douglas Gregor3eb20702009-05-11 19:58:34 +00001675 CXXRecordDecl *getCurrentInstantiationOf(NestedNameSpecifier *NNS);
1676 bool isUnknownSpecialization(const CXXScopeSpec &SS);
Douglas Gregor253fc4d2009-03-18 00:36:05 +00001677
Argiris Kirtzidis054a2632008-11-08 17:17:31 +00001678 /// ActOnCXXGlobalScopeSpecifier - Return the object that represents the
1679 /// global scope ('::').
1680 virtual CXXScopeTy *ActOnCXXGlobalScopeSpecifier(Scope *S,
1681 SourceLocation CCLoc);
1682
1683 /// ActOnCXXNestedNameSpecifier - Called during parsing of a
1684 /// nested-name-specifier. e.g. for "foo::bar::" we parsed "foo::" and now
1685 /// we want to resolve "bar::". 'SS' is empty or the previously parsed
1686 /// nested-name part ("foo::"), 'IdLoc' is the source location of 'bar',
1687 /// 'CCLoc' is the location of '::' and 'II' is the identifier for 'bar'.
1688 /// Returns a CXXScopeTy* object representing the C++ scope.
1689 virtual CXXScopeTy *ActOnCXXNestedNameSpecifier(Scope *S,
1690 const CXXScopeSpec &SS,
1691 SourceLocation IdLoc,
1692 SourceLocation CCLoc,
Douglas Gregorb0212bd2008-11-17 20:34:05 +00001693 IdentifierInfo &II);
Argiris Kirtzidis054a2632008-11-08 17:17:31 +00001694
Douglas Gregor0c281a82009-02-25 19:37:18 +00001695 /// ActOnCXXNestedNameSpecifier - Called during parsing of a
1696 /// nested-name-specifier that involves a template-id, e.g.,
1697 /// "foo::bar<int, float>::", and now we need to build a scope
1698 /// specifier. \p SS is empty or the previously parsed nested-name
1699 /// part ("foo::"), \p Type is the already-parsed class template
1700 /// specialization (or other template-id that names a type), \p
1701 /// TypeRange is the source range where the type is located, and \p
1702 /// CCLoc is the location of the trailing '::'.
1703 virtual CXXScopeTy *ActOnCXXNestedNameSpecifier(Scope *S,
1704 const CXXScopeSpec &SS,
1705 TypeTy *Type,
1706 SourceRange TypeRange,
1707 SourceLocation CCLoc);
1708
Argiris Kirtzidis054a2632008-11-08 17:17:31 +00001709 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
1710 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
1711 /// After this method is called, according to [C++ 3.4.3p3], names should be
1712 /// looked up in the declarator-id's scope, until the declarator is parsed and
1713 /// ActOnCXXExitDeclaratorScope is called.
1714 /// The 'SS' should be a non-empty valid CXXScopeSpec.
1715 virtual void ActOnCXXEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
1716
1717 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
1718 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
1719 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
1720 /// Used to indicate that names should revert to being looked up in the
1721 /// defining scope.
Douglas Gregor24effa82008-12-16 00:38:16 +00001722 virtual void ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
Argiris Kirtzidis054a2632008-11-08 17:17:31 +00001723
Argiris Kirtzidis68370592009-06-17 22:50:06 +00001724 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
1725 /// initializer for the declaration 'Dcl'.
1726 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
1727 /// static data member of class X, names should be looked up in the scope of
1728 /// class X.
1729 virtual void ActOnCXXEnterDeclInitializer(Scope *S, DeclPtrTy Dcl);
1730
1731 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
1732 /// initializer for the declaration 'Dcl'.
1733 virtual void ActOnCXXExitDeclInitializer(Scope *S, DeclPtrTy Dcl);
1734
Anders Carlssona66cad42007-08-21 17:43:55 +00001735 // ParseObjCStringLiteral - Parse Objective-C string literals.
Chris Lattnerddd3e632007-12-12 01:04:12 +00001736 virtual ExprResult ParseObjCStringLiteral(SourceLocation *AtLocs,
1737 ExprTy **Strings,
1738 unsigned NumStrings);
Anders Carlsson7e2e9672009-06-07 18:45:35 +00001739
1740 Expr *BuildObjCEncodeExpression(SourceLocation AtLoc,
1741 QualType EncodedType,
1742 SourceLocation RParenLoc);
Anders Carlsson8be1d402007-08-22 15:14:15 +00001743 virtual ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc,
Chris Lattnercfd61c82007-10-16 22:51:17 +00001744 SourceLocation EncodeLoc,
Anders Carlsson8be1d402007-08-22 15:14:15 +00001745 SourceLocation LParenLoc,
1746 TypeTy *Ty,
1747 SourceLocation RParenLoc);
1748
Fariborz Jahanianf807c202007-10-16 20:40:23 +00001749 // ParseObjCSelectorExpression - Build selector expression for @selector
1750 virtual ExprResult ParseObjCSelectorExpression(Selector Sel,
1751 SourceLocation AtLoc,
Fariborz Jahanian957448a2007-10-16 23:21:02 +00001752 SourceLocation SelLoc,
Fariborz Jahanianf807c202007-10-16 20:40:23 +00001753 SourceLocation LParenLoc,
1754 SourceLocation RParenLoc);
1755
Fariborz Jahanianb391e6e2007-10-17 16:58:11 +00001756 // ParseObjCProtocolExpression - Build protocol expression for @protocol
1757 virtual ExprResult ParseObjCProtocolExpression(IdentifierInfo * ProtocolName,
1758 SourceLocation AtLoc,
1759 SourceLocation ProtoLoc,
1760 SourceLocation LParenLoc,
1761 SourceLocation RParenLoc);
Douglas Gregorec93f442008-04-13 21:30:24 +00001762
1763 //===--------------------------------------------------------------------===//
Douglas Gregord8028382009-01-05 19:45:36 +00001764 // C++ Declarations
1765 //
Chris Lattner5261d0c2009-03-28 19:18:32 +00001766 virtual DeclPtrTy ActOnStartLinkageSpecification(Scope *S,
1767 SourceLocation ExternLoc,
1768 SourceLocation LangLoc,
1769 const char *Lang,
1770 unsigned StrSize,
1771 SourceLocation LBraceLoc);
1772 virtual DeclPtrTy ActOnFinishLinkageSpecification(Scope *S,
1773 DeclPtrTy LinkageSpec,
1774 SourceLocation RBraceLoc);
Douglas Gregord8028382009-01-05 19:45:36 +00001775
1776
1777 //===--------------------------------------------------------------------===//
Douglas Gregorec93f442008-04-13 21:30:24 +00001778 // C++ Classes
1779 //
Argiris Kirtzidis311db8c2008-11-08 16:45:02 +00001780 virtual bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
1781 const CXXScopeSpec *SS);
Sebastian Redla55834a2009-04-12 17:16:29 +00001782
Chris Lattner5261d0c2009-03-28 19:18:32 +00001783 virtual DeclPtrTy ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS,
1784 Declarator &D,
1785 ExprTy *BitfieldWidth,
Sebastian Redla55834a2009-04-12 17:16:29 +00001786 ExprTy *Init,
1787 bool Deleted = false);
Argiris Kirtzidis38f16712008-07-01 10:37:29 +00001788
Chris Lattner5261d0c2009-03-28 19:18:32 +00001789 virtual MemInitResult ActOnMemInitializer(DeclPtrTy ConstructorD,
Douglas Gregora65e8dd2008-11-05 04:29:56 +00001790 Scope *S,
1791 IdentifierInfo *MemberOrBase,
1792 SourceLocation IdLoc,
1793 SourceLocation LParenLoc,
1794 ExprTy **Args, unsigned NumArgs,
1795 SourceLocation *CommaLocs,
1796 SourceLocation RParenLoc);
1797
Douglas Gregore640ab62008-11-03 17:51:48 +00001798 void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl);
1799
Chris Lattner5261d0c2009-03-28 19:18:32 +00001800 virtual void ActOnMemInitializers(DeclPtrTy ConstructorDecl,
Anders Carlssonc7f87202009-03-25 02:58:17 +00001801 SourceLocation ColonLoc,
1802 MemInitTy **MemInits, unsigned NumMemInits);
1803
Argiris Kirtzidis38f16712008-07-01 10:37:29 +00001804 virtual void ActOnFinishCXXMemberSpecification(Scope* S, SourceLocation RLoc,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001805 DeclPtrTy TagDecl,
Argiris Kirtzidis38f16712008-07-01 10:37:29 +00001806 SourceLocation LBrac,
1807 SourceLocation RBrac);
1808
Douglas Gregora376cbd2009-05-27 23:11:45 +00001809 virtual void ActOnReenterTemplateScope(Scope *S, DeclPtrTy Template);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001810 virtual void ActOnStartDelayedCXXMethodDeclaration(Scope *S,
1811 DeclPtrTy Method);
1812 virtual void ActOnDelayedCXXMethodParameter(Scope *S, DeclPtrTy Param);
1813 virtual void ActOnFinishDelayedCXXMethodDeclaration(Scope *S,
1814 DeclPtrTy Method);
Douglas Gregor605de8d2008-12-16 21:30:33 +00001815
Chris Lattner5261d0c2009-03-28 19:18:32 +00001816 virtual DeclPtrTy ActOnStaticAssertDeclaration(SourceLocation AssertLoc,
1817 ExprArg AssertExpr,
1818 ExprArg AssertMessageExpr);
Anders Carlssoned691562009-03-14 00:25:26 +00001819
Anders Carlssonb56d8b32009-05-11 22:55:49 +00001820 virtual bool ActOnFriendDecl(Scope *S, SourceLocation FriendLoc,
1821 DeclPtrTy Dcl);
1822
Chris Lattnerc82dcd42009-04-25 08:28:21 +00001823 QualType CheckConstructorDeclarator(Declarator &D, QualType R,
1824 FunctionDecl::StorageClass& SC);
Chris Lattner08da4772009-04-25 08:35:12 +00001825 void CheckConstructor(CXXConstructorDecl *Constructor);
Chris Lattnerc82dcd42009-04-25 08:28:21 +00001826 QualType CheckDestructorDeclarator(Declarator &D,
1827 FunctionDecl::StorageClass& SC);
Chris Lattner08da4772009-04-25 08:35:12 +00001828 void CheckConversionDeclarator(Declarator &D, QualType &R,
Douglas Gregor3ef6c972008-11-07 20:08:42 +00001829 FunctionDecl::StorageClass& SC);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001830 DeclPtrTy ActOnConversionDeclarator(CXXConversionDecl *Conversion);
Douglas Gregorf15ac4b2008-10-31 09:07:45 +00001831
Douglas Gregor14046502008-10-23 00:40:37 +00001832 //===--------------------------------------------------------------------===//
1833 // C++ Derived Classes
1834 //
1835
1836 /// ActOnBaseSpecifier - Parsed a base specifier
Douglas Gregored3a3982009-03-03 04:44:36 +00001837 CXXBaseSpecifier *CheckBaseSpecifier(CXXRecordDecl *Class,
1838 SourceRange SpecifierRange,
1839 bool Virtual, AccessSpecifier Access,
1840 QualType BaseType,
1841 SourceLocation BaseLoc);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001842 virtual BaseResult ActOnBaseSpecifier(DeclPtrTy classdecl,
Douglas Gregor14046502008-10-23 00:40:37 +00001843 SourceRange SpecifierRange,
1844 bool Virtual, AccessSpecifier Access,
Douglas Gregored3a3982009-03-03 04:44:36 +00001845 TypeTy *basetype, SourceLocation
1846 BaseLoc);
Douglas Gregor14046502008-10-23 00:40:37 +00001847
Douglas Gregored3a3982009-03-03 04:44:36 +00001848 bool AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases,
1849 unsigned NumBases);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001850 virtual void ActOnBaseSpecifiers(DeclPtrTy ClassDecl, BaseTy **Bases,
Douglas Gregor14046502008-10-23 00:40:37 +00001851 unsigned NumBases);
1852
1853 bool IsDerivedFrom(QualType Derived, QualType Base);
Douglas Gregorbb461502008-10-24 04:54:22 +00001854 bool IsDerivedFrom(QualType Derived, QualType Base, BasePaths &Paths);
Douglas Gregor29dfa2f2009-01-15 00:26:24 +00001855 bool LookupInBases(CXXRecordDecl *Class, const MemberLookupCriteria& Criteria,
1856 BasePaths &Paths);
Douglas Gregor651d1cc2008-10-24 16:17:19 +00001857 bool CheckDerivedToBaseConversion(QualType Derived, QualType Base,
1858 SourceLocation Loc, SourceRange Range);
Anders Carlsson9ecd3152009-05-13 21:11:42 +00001859 bool CheckDerivedToBaseConversion(QualType Derived, QualType Base,
1860 unsigned InaccessibleBaseID,
1861 unsigned AmbigiousBaseConvID,
1862 SourceLocation Loc, SourceRange Range,
1863 DeclarationName Name);
1864
Douglas Gregorb9ef0552009-01-16 00:38:09 +00001865 std::string getAmbiguousPathsDisplayString(BasePaths &Paths);
Anders Carlssone80e29c2009-05-14 01:09:04 +00001866
1867 /// CheckReturnTypeCovariance - Checks whether two types are covariant,
1868 /// according to C++ [class.virtual]p5.
1869 bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New,
1870 const CXXMethodDecl *Old);
1871
Douglas Gregorec93f442008-04-13 21:30:24 +00001872
Anders Carlsson9aa04122009-03-27 05:05:05 +00001873 //===--------------------------------------------------------------------===//
1874 // C++ Access Control
1875 //
1876
1877 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1878 NamedDecl *PrevMemberDecl,
1879 AccessSpecifier LexicalAS);
1880
1881 bool CheckBaseClassAccess(QualType Derived, QualType Base,
Anders Carlsson9ecd3152009-05-13 21:11:42 +00001882 unsigned InaccessibleBaseID,
1883 BasePaths& Paths, SourceLocation AccessLoc,
1884 DeclarationName Name);
Anders Carlsson9aa04122009-03-27 05:05:05 +00001885
1886
Anders Carlsson412c3402009-03-24 01:19:16 +00001887 enum AbstractDiagSelID {
1888 AbstractNone = -1,
1889 AbstractReturnType,
1890 AbstractParamType,
1891 AbstractVariableType,
1892 AbstractFieldType
1893 };
1894
1895 bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID,
Anders Carlssonde9e7892009-03-24 17:23:42 +00001896 AbstractDiagSelID SelID = AbstractNone,
1897 const CXXRecordDecl *CurrentRD = 0);
Anders Carlssone1299b32009-03-22 20:18:17 +00001898
Douglas Gregore60e5d32008-11-06 22:13:31 +00001899 //===--------------------------------------------------------------------===//
1900 // C++ Overloaded Operators [C++ 13.5]
1901 //
1902
1903 bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl);
1904
Douglas Gregordd861062008-12-05 18:15:24 +00001905 //===--------------------------------------------------------------------===//
1906 // C++ Templates [C++ 14]
1907 //
Douglas Gregoraabb8502009-03-31 00:43:58 +00001908 virtual TemplateNameKind isTemplateName(const IdentifierInfo &II, Scope *S,
Douglas Gregordd13e842009-03-30 22:58:21 +00001909 TemplateTy &Template,
Douglas Gregor8e458f42009-02-09 18:46:07 +00001910 const CXXScopeSpec *SS = 0);
Douglas Gregordd861062008-12-05 18:15:24 +00001911 bool DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001912 TemplateDecl *AdjustDeclIfTemplate(DeclPtrTy &Decl);
Douglas Gregor279272e2009-02-04 19:02:06 +00001913
Anders Carlsson9c85fa02009-06-12 19:58:00 +00001914 virtual DeclPtrTy ActOnTypeParameter(Scope *S, bool Typename, bool Ellipsis,
1915 SourceLocation EllipsisLoc,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001916 SourceLocation KeyLoc,
1917 IdentifierInfo *ParamName,
1918 SourceLocation ParamNameLoc,
1919 unsigned Depth, unsigned Position);
1920 virtual void ActOnTypeParameterDefault(DeclPtrTy TypeParam,
Douglas Gregor9225a7e2009-02-10 19:49:53 +00001921 SourceLocation EqualLoc,
1922 SourceLocation DefaultLoc,
1923 TypeTy *Default);
1924
Douglas Gregored3a3982009-03-03 04:44:36 +00001925 QualType CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001926 virtual DeclPtrTy ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
1927 unsigned Depth,
1928 unsigned Position);
1929 virtual void ActOnNonTypeTemplateParameterDefault(DeclPtrTy TemplateParam,
Douglas Gregor9225a7e2009-02-10 19:49:53 +00001930 SourceLocation EqualLoc,
1931 ExprArg Default);
Chris Lattner5261d0c2009-03-28 19:18:32 +00001932 virtual DeclPtrTy ActOnTemplateTemplateParameter(Scope *S,
1933 SourceLocation TmpLoc,
1934 TemplateParamsTy *Params,
1935 IdentifierInfo *ParamName,
1936 SourceLocation ParamNameLoc,
1937 unsigned Depth,
1938 unsigned Position);
1939 virtual void ActOnTemplateTemplateParameterDefault(DeclPtrTy TemplateParam,
Douglas Gregor9225a7e2009-02-10 19:49:53 +00001940 SourceLocation EqualLoc,
1941 ExprArg Default);
1942
Douglas Gregor52473432008-12-24 02:52:09 +00001943 virtual TemplateParamsTy *
1944 ActOnTemplateParameterList(unsigned Depth,
1945 SourceLocation ExportLoc,
1946 SourceLocation TemplateLoc,
1947 SourceLocation LAngleLoc,
Chris Lattner5261d0c2009-03-28 19:18:32 +00001948 DeclPtrTy *Params, unsigned NumParams,
Douglas Gregor52473432008-12-24 02:52:09 +00001949 SourceLocation RAngleLoc);
Douglas Gregor9225a7e2009-02-10 19:49:53 +00001950 bool CheckTemplateParameterList(TemplateParameterList *NewParams,
1951 TemplateParameterList *OldParams);
1952
Douglas Gregorc5d6fa72009-03-25 00:13:59 +00001953 virtual DeclResult
Douglas Gregord406b032009-02-06 22:42:48 +00001954 ActOnClassTemplate(Scope *S, unsigned TagSpec, TagKind TK,
1955 SourceLocation KWLoc, const CXXScopeSpec &SS,
1956 IdentifierInfo *Name, SourceLocation NameLoc,
1957 AttributeList *Attr,
Anders Carlssoned20fb92009-03-26 00:52:18 +00001958 MultiTemplateParamsArg TemplateParameterLists,
1959 AccessSpecifier AS);
Douglas Gregord406b032009-02-06 22:42:48 +00001960
Douglas Gregordd13e842009-03-30 22:58:21 +00001961 QualType CheckTemplateIdType(TemplateName Template,
1962 SourceLocation TemplateLoc,
1963 SourceLocation LAngleLoc,
1964 const TemplateArgument *TemplateArgs,
1965 unsigned NumTemplateArgs,
1966 SourceLocation RAngleLoc);
Douglas Gregorf9ff4b12009-03-09 23:48:35 +00001967
Douglas Gregora08b6c72009-02-17 23:15:12 +00001968 virtual TypeResult
Douglas Gregordd13e842009-03-30 22:58:21 +00001969 ActOnTemplateIdType(TemplateTy Template, SourceLocation TemplateLoc,
1970 SourceLocation LAngleLoc,
1971 ASTTemplateArgsPtr TemplateArgs,
1972 SourceLocation *TemplateArgLocs,
1973 SourceLocation RAngleLoc);
Douglas Gregora08b6c72009-02-17 23:15:12 +00001974
Douglas Gregoraabb8502009-03-31 00:43:58 +00001975 virtual TemplateTy ActOnDependentTemplateName(SourceLocation TemplateKWLoc,
1976 const IdentifierInfo &Name,
1977 SourceLocation NameLoc,
1978 const CXXScopeSpec &SS);
1979
Douglas Gregor0d93f692009-02-25 22:02:03 +00001980 bool CheckClassTemplateSpecializationScope(ClassTemplateDecl *ClassTemplate,
1981 ClassTemplateSpecializationDecl *PrevDecl,
1982 SourceLocation TemplateNameLoc,
Douglas Gregor90177912009-05-13 18:28:20 +00001983 SourceRange ScopeSpecifierRange,
Douglas Gregor4faa4262009-06-12 22:21:45 +00001984 bool PartialSpecialization,
Douglas Gregor90177912009-05-13 18:28:20 +00001985 bool ExplicitInstantiation);
Douglas Gregor0d93f692009-02-25 22:02:03 +00001986
Douglas Gregor76e79952009-06-12 21:21:02 +00001987 bool CheckClassTemplatePartialSpecializationArgs(
1988 TemplateParameterList *TemplateParams,
Anders Carlsson13fac3f2009-06-13 18:20:51 +00001989 const TemplateArgumentListBuilder &TemplateArgs,
Douglas Gregor42476442009-06-12 22:08:06 +00001990 bool &MirrorsPrimaryTemplate);
Douglas Gregor76e79952009-06-12 21:21:02 +00001991
Douglas Gregorc5d6fa72009-03-25 00:13:59 +00001992 virtual DeclResult
Douglas Gregora08b6c72009-02-17 23:15:12 +00001993 ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagKind TK,
1994 SourceLocation KWLoc,
1995 const CXXScopeSpec &SS,
Douglas Gregordd13e842009-03-30 22:58:21 +00001996 TemplateTy Template,
Douglas Gregora08b6c72009-02-17 23:15:12 +00001997 SourceLocation TemplateNameLoc,
Douglas Gregor8e458f42009-02-09 18:46:07 +00001998 SourceLocation LAngleLoc,
Douglas Gregor6f37b582009-02-09 19:34:22 +00001999 ASTTemplateArgsPtr TemplateArgs,
Douglas Gregor35d81bb2009-02-09 23:23:08 +00002000 SourceLocation *TemplateArgLocs,
Douglas Gregor8e458f42009-02-09 18:46:07 +00002001 SourceLocation RAngleLoc,
Douglas Gregora08b6c72009-02-17 23:15:12 +00002002 AttributeList *Attr,
2003 MultiTemplateParamsArg TemplateParameterLists);
Douglas Gregor8e458f42009-02-09 18:46:07 +00002004
Douglas Gregorfd79ac62009-05-13 00:25:59 +00002005 virtual DeclResult
2006 ActOnExplicitInstantiation(Scope *S, SourceLocation TemplateLoc,
2007 unsigned TagSpec,
2008 SourceLocation KWLoc,
2009 const CXXScopeSpec &SS,
2010 TemplateTy Template,
2011 SourceLocation TemplateNameLoc,
2012 SourceLocation LAngleLoc,
2013 ASTTemplateArgsPtr TemplateArgs,
2014 SourceLocation *TemplateArgLocs,
2015 SourceLocation RAngleLoc,
2016 AttributeList *Attr);
2017
Douglas Gregor96b6df92009-05-14 00:28:11 +00002018 virtual DeclResult
2019 ActOnExplicitInstantiation(Scope *S, SourceLocation TemplateLoc,
2020 unsigned TagSpec,
2021 SourceLocation KWLoc,
2022 const CXXScopeSpec &SS,
2023 IdentifierInfo *Name,
2024 SourceLocation NameLoc,
2025 AttributeList *Attr);
2026
Douglas Gregor35d81bb2009-02-09 23:23:08 +00002027 bool CheckTemplateArgumentList(TemplateDecl *Template,
2028 SourceLocation TemplateLoc,
2029 SourceLocation LAngleLoc,
Douglas Gregorf9ff4b12009-03-09 23:48:35 +00002030 const TemplateArgument *TemplateArgs,
2031 unsigned NumTemplateArgs,
Douglas Gregorad964b32009-02-17 01:05:43 +00002032 SourceLocation RAngleLoc,
Anders Carlssona35faf92009-06-05 03:43:12 +00002033 TemplateArgumentListBuilder &Converted);
Douglas Gregor35d81bb2009-02-09 23:23:08 +00002034
Anders Carlssonfdd33cc2009-06-13 00:33:33 +00002035 bool CheckTemplateTypeArgument(TemplateTypeParmDecl *Param,
2036 const TemplateArgument &Arg,
2037 TemplateArgumentListBuilder &Converted);
2038
Douglas Gregor35d81bb2009-02-09 23:23:08 +00002039 bool CheckTemplateArgument(TemplateTypeParmDecl *Param, QualType Arg,
2040 SourceLocation ArgLoc);
Douglas Gregorad964b32009-02-17 01:05:43 +00002041 bool CheckTemplateArgumentAddressOfObjectOrFunction(Expr *Arg,
2042 NamedDecl *&Entity);
2043 bool CheckTemplateArgumentPointerToMember(Expr *Arg, NamedDecl *&Member);
Douglas Gregored3a3982009-03-03 04:44:36 +00002044 bool CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
2045 QualType InstantiatedParamType, Expr *&Arg,
Douglas Gregor8f378a92009-06-11 18:10:32 +00002046 TemplateArgument &Converted);
Douglas Gregor35d81bb2009-02-09 23:23:08 +00002047 bool CheckTemplateArgument(TemplateTemplateParmDecl *Param, DeclRefExpr *Arg);
Douglas Gregord406b032009-02-06 22:42:48 +00002048 bool TemplateParameterListsAreEqual(TemplateParameterList *New,
2049 TemplateParameterList *Old,
2050 bool Complain,
Douglas Gregore8e367f2009-02-10 00:24:35 +00002051 bool IsTemplateTemplateParm = false,
2052 SourceLocation TemplateArgLoc
2053 = SourceLocation());
Douglas Gregord406b032009-02-06 22:42:48 +00002054
2055 bool CheckTemplateDeclScope(Scope *S,
2056 MultiTemplateParamsArg &TemplateParameterLists);
Douglas Gregor279272e2009-02-04 19:02:06 +00002057
Douglas Gregord3022602009-03-27 23:10:48 +00002058 /// \brief Called when the parser has parsed a C++ typename
2059 /// specifier, e.g., "typename T::type".
2060 ///
2061 /// \param TypenameLoc the location of the 'typename' keyword
2062 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
2063 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
2064 /// \param IdLoc the location of the identifier.
2065 virtual TypeResult
2066 ActOnTypenameType(SourceLocation TypenameLoc, const CXXScopeSpec &SS,
2067 const IdentifierInfo &II, SourceLocation IdLoc);
Douglas Gregor77da5802009-04-01 00:28:59 +00002068
2069 /// \brief Called when the parser has parsed a C++ typename
2070 /// specifier that ends in a template-id, e.g.,
2071 /// "typename MetaFun::template apply<T1, T2>".
2072 ///
2073 /// \param TypenameLoc the location of the 'typename' keyword
2074 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
2075 /// \param TemplateLoc the location of the 'template' keyword, if any.
2076 /// \param Ty the type that the typename specifier refers to.
2077 virtual TypeResult
2078 ActOnTypenameType(SourceLocation TypenameLoc, const CXXScopeSpec &SS,
2079 SourceLocation TemplateLoc, TypeTy *Ty);
2080
Douglas Gregord3022602009-03-27 23:10:48 +00002081 QualType CheckTypenameType(NestedNameSpecifier *NNS,
2082 const IdentifierInfo &II,
2083 SourceRange Range);
Douglas Gregor58944ac2009-05-31 09:31:02 +00002084
Douglas Gregor623e2e02009-06-12 18:26:56 +00002085 /// \brief Describes the result of template argument deduction.
2086 ///
2087 /// The TemplateDeductionResult enumeration describes the result of
2088 /// template argument deduction, as returned from
2089 /// DeduceTemplateArguments(). The separate TemplateDeductionInfo
2090 /// structure provides additional information about the results of
2091 /// template argument deduction, e.g., the deduced template argument
2092 /// list (if successful) or the specific template parameters or
2093 /// deduced arguments that were involved in the failure.
2094 enum TemplateDeductionResult {
2095 /// \brief Template argument deduction was successful.
2096 TDK_Success = 0,
2097 /// \brief Template argument deduction exceeded the maximum template
2098 /// instantiation depth (which has already been diagnosed).
2099 TDK_InstantiationDepth,
2100 /// \brief Template argument deduction did not deduce a value
2101 /// for every template parameter.
2102 TDK_Incomplete,
2103 /// \brief Template argument deduction produced inconsistent
2104 /// deduced values for the given template parameter.
2105 TDK_Inconsistent,
2106 /// \brief Template argument deduction failed due to inconsistent
2107 /// cv-qualifiers on a template parameter type that would
2108 /// otherwise be deduced, e.g., we tried to deduce T in "const T"
2109 /// but were given a non-const "X".
2110 TDK_InconsistentQuals,
2111 /// \brief Substitution of the deduced template argument values
2112 /// resulted in an error.
2113 TDK_SubstitutionFailure,
2114 /// \brief Substitution of the deduced template argument values
2115 /// into a non-deduced context produced a type or value that
2116 /// produces a type that does not match the original template
2117 /// arguments provided.
2118 TDK_NonDeducedMismatch
2119 };
2120
2121 /// \brief Provides information about an attempted template argument
2122 /// deduction, whose success or failure was described by a
2123 /// TemplateDeductionResult value.
2124 class TemplateDeductionInfo {
2125 /// \brief The context in which the template arguments are stored.
2126 ASTContext &Context;
2127
2128 /// \brief The deduced template argument list.
2129 ///
2130 TemplateArgumentList *Deduced;
2131
2132 // do not implement these
2133 TemplateDeductionInfo(const TemplateDeductionInfo&);
2134 TemplateDeductionInfo &operator=(const TemplateDeductionInfo&);
2135
2136 public:
2137 TemplateDeductionInfo(ASTContext &Context) : Context(Context), Deduced(0) { }
2138
2139 ~TemplateDeductionInfo() {
2140 // FIXME: if (Deduced) Deduced->Destroy(Context);
2141 }
2142
2143 /// \brief Take ownership of the deduced template argument list.
2144 TemplateArgumentList *take() {
2145 TemplateArgumentList *Result = Deduced;
2146 Deduced = 0;
2147 return Result;
2148 }
2149
2150 /// \brief Provide a new template argument list that contains the
2151 /// results of template argument deduction.
2152 void reset(TemplateArgumentList *NewDeduced) {
2153 // FIXME: if (Deduced) Deduced->Destroy(Context);
2154 Deduced = NewDeduced;
2155 }
2156
2157 /// \brief The template parameter to which a template argument
2158 /// deduction failure refers.
2159 ///
2160 /// Depending on the result of template argument deduction, this
2161 /// template parameter may have different meanings:
2162 ///
2163 /// TDK_Incomplete: this is the first template parameter whose
2164 /// corresponding template argument was not deduced.
2165 ///
2166 /// TDK_Inconsistent: this is the template parameter for which
2167 /// two different template argument values were deduced.
2168 TemplateParameter Param;
2169
2170 /// \brief The first template argument to which the template
2171 /// argument deduction failure refers.
2172 ///
2173 /// Depending on the result of the template argument deduction,
2174 /// this template argument may have different meanings:
2175 ///
2176 /// TDK_Inconsistent: this argument is the first value deduced
2177 /// for the corresponding template parameter.
2178 ///
2179 /// TDK_SubstitutionFailure: this argument is the template
2180 /// argument we were instantiating when we encountered an error.
2181 ///
2182 /// TDK_NonDeducedMismatch: this is the template argument
2183 /// provided in the source code.
2184 TemplateArgument FirstArg;
2185
2186 /// \brief The second template argument to which the template
2187 /// argument deduction failure refers.
2188 ///
2189 /// FIXME: Finish documenting this.
2190 TemplateArgument SecondArg;
2191 };
2192
2193 TemplateDeductionResult
Douglas Gregorab9f71a2009-06-05 00:53:49 +00002194 DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial,
Douglas Gregor623e2e02009-06-12 18:26:56 +00002195 const TemplateArgumentList &TemplateArgs,
2196 TemplateDeductionInfo &Info);
Douglas Gregorf90c2132009-06-13 00:26:55 +00002197
2198 void MarkDeducedTemplateParameters(const TemplateArgumentList &TemplateArgs,
2199 llvm::SmallVectorImpl<bool> &Deduced);
2200
Douglas Gregor74296542009-02-27 19:31:52 +00002201 //===--------------------------------------------------------------------===//
2202 // C++ Template Instantiation
2203 //
Douglas Gregor375733c2009-03-10 00:06:19 +00002204
Douglas Gregor5f62c5e2009-05-14 23:26:13 +00002205 const TemplateArgumentList &getTemplateInstantiationArgs(NamedDecl *D);
2206
Douglas Gregor375733c2009-03-10 00:06:19 +00002207 /// \brief A template instantiation that is currently in progress.
2208 struct ActiveTemplateInstantiation {
Douglas Gregor56d25a72009-03-10 20:44:00 +00002209 /// \brief The kind of template instantiation we are performing
2210 enum {
2211 /// We are instantiating a template declaration. The entity is
Douglas Gregorb06585a2009-05-15 00:01:03 +00002212 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
Douglas Gregor56d25a72009-03-10 20:44:00 +00002213 TemplateInstantiation,
2214
2215 /// We are instantiating a default argument for a template
2216 /// parameter. The Entity is the template, and
2217 /// TemplateArgs/NumTemplateArguments provides the template
2218 /// arguments as specified.
Douglas Gregorc5e01af2009-06-10 23:47:09 +00002219 /// FIXME: Use a TemplateArgumentList
2220 DefaultTemplateArgumentInstantiation,
2221
2222 /// We are performing template argument deduction for a class
2223 /// template partial specialization. The Entity is the class
2224 /// template partial specialization, and
2225 /// TemplateArgs/NumTemplateArgs provides the deduced template
2226 /// arguments.
2227 /// FIXME: Use a TemplateArgumentList
2228 PartialSpecDeductionInstantiation
Douglas Gregor56d25a72009-03-10 20:44:00 +00002229 } Kind;
2230
Douglas Gregor375733c2009-03-10 00:06:19 +00002231 /// \brief The point of instantiation within the source code.
2232 SourceLocation PointOfInstantiation;
2233
2234 /// \brief The entity that is being instantiated.
Douglas Gregor56d25a72009-03-10 20:44:00 +00002235 uintptr_t Entity;
2236
2237 // \brief If this the instantiation of a default template
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +00002238 // argument, the list of template arguments.
Douglas Gregor56d25a72009-03-10 20:44:00 +00002239 const TemplateArgument *TemplateArgs;
2240
2241 /// \brief The number of template arguments in TemplateArgs.
2242 unsigned NumTemplateArgs;
Douglas Gregor375733c2009-03-10 00:06:19 +00002243
2244 /// \brief The source range that covers the construct that cause
2245 /// the instantiation, e.g., the template-id that causes a class
2246 /// template instantiation.
2247 SourceRange InstantiationRange;
Douglas Gregor56d25a72009-03-10 20:44:00 +00002248
2249 friend bool operator==(const ActiveTemplateInstantiation &X,
2250 const ActiveTemplateInstantiation &Y) {
2251 if (X.Kind != Y.Kind)
2252 return false;
2253
2254 if (X.Entity != Y.Entity)
2255 return false;
2256
2257 switch (X.Kind) {
2258 case TemplateInstantiation:
2259 return true;
2260
2261 case DefaultTemplateArgumentInstantiation:
Douglas Gregorc5e01af2009-06-10 23:47:09 +00002262 case PartialSpecDeductionInstantiation:
Douglas Gregor56d25a72009-03-10 20:44:00 +00002263 return X.TemplateArgs == Y.TemplateArgs;
2264 }
2265
2266 return true;
2267 }
2268
2269 friend bool operator!=(const ActiveTemplateInstantiation &X,
2270 const ActiveTemplateInstantiation &Y) {
2271 return !(X == Y);
2272 }
Douglas Gregor375733c2009-03-10 00:06:19 +00002273 };
2274
2275 /// \brief List of active template instantiations.
2276 ///
2277 /// This vector is treated as a stack. As one template instantiation
2278 /// requires another template instantiation, additional
2279 /// instantiations are pushed onto the stack up to a
2280 /// user-configurable limit LangOptions::InstantiationDepth.
2281 llvm::SmallVector<ActiveTemplateInstantiation, 16>
2282 ActiveTemplateInstantiations;
2283
Douglas Gregord9572a12009-03-10 18:52:44 +00002284 /// \brief The last template from which a template instantiation
2285 /// error or warning was produced.
2286 ///
2287 /// This value is used to suppress printing of redundant template
2288 /// instantiation backtraces when there are multiple errors in the
2289 /// same instantiation. FIXME: Does this belong in Sema? It's tough
2290 /// to implement it anywhere else.
Douglas Gregor56d25a72009-03-10 20:44:00 +00002291 ActiveTemplateInstantiation LastTemplateInstantiationErrorContext;
Douglas Gregord9572a12009-03-10 18:52:44 +00002292
Douglas Gregor375733c2009-03-10 00:06:19 +00002293 /// \brief A stack object to be created when performing template
2294 /// instantiation.
2295 ///
2296 /// Construction of an object of type \c InstantiatingTemplate
2297 /// pushes the current instantiation onto the stack of active
2298 /// instantiations. If the size of this stack exceeds the maximum
2299 /// number of recursive template instantiations, construction
2300 /// produces an error and evaluates true.
2301 ///
2302 /// Destruction of this object will pop the named instantiation off
2303 /// the stack.
2304 struct InstantiatingTemplate {
Douglas Gregorb12249d2009-05-18 17:01:57 +00002305 /// \brief Note that we are instantiating a class template,
2306 /// function template, or a member thereof.
Douglas Gregor375733c2009-03-10 00:06:19 +00002307 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
Douglas Gregorb12249d2009-05-18 17:01:57 +00002308 Decl *Entity,
Douglas Gregor375733c2009-03-10 00:06:19 +00002309 SourceRange InstantiationRange = SourceRange());
Douglas Gregor56d25a72009-03-10 20:44:00 +00002310
2311 /// \brief Note that we are instantiating a default argument in a
2312 /// template-id.
2313 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
2314 TemplateDecl *Template,
2315 const TemplateArgument *TemplateArgs,
2316 unsigned NumTemplateArgs,
2317 SourceRange InstantiationRange = SourceRange());
2318
Douglas Gregorc5e01af2009-06-10 23:47:09 +00002319 /// \brief Note that we are instantiating as part of template
2320 /// argument deduction for a class template partial
2321 /// specialization.
2322 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
2323 ClassTemplatePartialSpecializationDecl *PartialSpec,
2324 const TemplateArgument *TemplateArgs,
2325 unsigned NumTemplateArgs,
2326 SourceRange InstantiationRange = SourceRange());
2327
Douglas Gregorb12249d2009-05-18 17:01:57 +00002328 /// \brief Note that we have finished instantiating this template.
2329 void Clear();
2330
2331 ~InstantiatingTemplate() { Clear(); }
Douglas Gregor375733c2009-03-10 00:06:19 +00002332
2333 /// \brief Determines whether we have exceeded the maximum
2334 /// recursive template instantiations.
2335 operator bool() const { return Invalid; }
2336
2337 private:
2338 Sema &SemaRef;
2339 bool Invalid;
2340
Douglas Gregor56d25a72009-03-10 20:44:00 +00002341 bool CheckInstantiationDepth(SourceLocation PointOfInstantiation,
2342 SourceRange InstantiationRange);
2343
Douglas Gregor375733c2009-03-10 00:06:19 +00002344 InstantiatingTemplate(const InstantiatingTemplate&); // not implemented
2345
2346 InstantiatingTemplate&
2347 operator=(const InstantiatingTemplate&); // not implemented
2348 };
2349
Douglas Gregorfee85d62009-03-10 18:03:33 +00002350 void PrintInstantiationStack();
2351
Douglas Gregor95d6c952009-06-14 07:33:30 +00002352 /// \brief Determines whether we are currently in a context where
2353 /// template argument substitution failures are not considered
2354 /// errors.
2355 ///
2356 /// When this routine returns true, the emission of most diagnostics
2357 /// will be suppressed and there will be no local error recovery.
2358 bool isSFINAEContext() const;
2359
Douglas Gregor003d7402009-06-14 08:02:22 +00002360 /// \brief RAII class used to determine whether SFINAE has
2361 /// trapped any errors that occur during template argument
2362 /// deduction.
2363 class SFINAETrap {
2364 Sema &SemaRef;
2365 unsigned PrevSFINAEErrors;
2366 public:
2367 explicit SFINAETrap(Sema &SemaRef)
2368 : SemaRef(SemaRef), PrevSFINAEErrors(SemaRef.NumSFINAEErrors) { }
2369
2370 ~SFINAETrap() { SemaRef.NumSFINAEErrors = PrevSFINAEErrors; }
2371
2372 /// \brief Determine whether any SFINAE errors have been trapped.
2373 bool hasErrorOccurred() const {
2374 return SemaRef.NumSFINAEErrors > PrevSFINAEErrors;
2375 }
2376 };
2377
Douglas Gregorf036aa72009-05-14 21:44:34 +00002378 /// \brief A stack-allocated class that identifies which local
2379 /// variable declaration instantiations are present in this scope.
2380 ///
2381 /// A new instance of this class type will be created whenever we
2382 /// instantiate a new function declaration, which will have its own
2383 /// set of parameter declarations.
2384 class LocalInstantiationScope {
2385 /// \brief Reference to the semantic analysis that is performing
2386 /// this template instantiation.
2387 Sema &SemaRef;
2388
Douglas Gregorf97986d2009-05-27 05:35:12 +00002389 /// \brief A mapping from local declarations that occur
Douglas Gregorf036aa72009-05-14 21:44:34 +00002390 /// within a template to their instantiations.
2391 ///
2392 /// This mapping is used during instantiation to keep track of,
2393 /// e.g., function parameter and variable declarations. For example,
2394 /// given:
2395 ///
2396 /// \code
2397 /// template<typename T> T add(T x, T y) { return x + y; }
2398 /// \endcode
2399 ///
2400 /// when we instantiate add<int>, we will introduce a mapping from
2401 /// the ParmVarDecl for 'x' that occurs in the template to the
2402 /// instantiated ParmVarDecl for 'x'.
Douglas Gregorf97986d2009-05-27 05:35:12 +00002403 llvm::DenseMap<const Decl *, Decl *> LocalDecls;
Douglas Gregorf036aa72009-05-14 21:44:34 +00002404
2405 /// \brief The outer scope, in which contains local variable
2406 /// definitions from some other instantiation (that is not
2407 /// relevant to this particular scope).
2408 LocalInstantiationScope *Outer;
2409
2410 // This class is non-copyable
2411 LocalInstantiationScope(const LocalInstantiationScope &);
2412 LocalInstantiationScope &operator=(const LocalInstantiationScope &);
2413
2414 public:
2415 LocalInstantiationScope(Sema &SemaRef)
2416 : SemaRef(SemaRef), Outer(SemaRef.CurrentInstantiationScope) {
2417 SemaRef.CurrentInstantiationScope = this;
2418 }
2419
2420 ~LocalInstantiationScope() {
2421 SemaRef.CurrentInstantiationScope = Outer;
2422 }
2423
Douglas Gregorf97986d2009-05-27 05:35:12 +00002424 Decl *getInstantiationOf(const Decl *D) {
2425 Decl *Result = LocalDecls[D];
2426 assert(Result && "declaration was not instantiated in this scope!");
Douglas Gregorf036aa72009-05-14 21:44:34 +00002427 return Result;
2428 }
2429
Douglas Gregorf97986d2009-05-27 05:35:12 +00002430 VarDecl *getInstantiationOf(const VarDecl *Var) {
2431 return cast<VarDecl>(getInstantiationOf(cast<Decl>(Var)));
Douglas Gregorf036aa72009-05-14 21:44:34 +00002432 }
2433
Douglas Gregorf97986d2009-05-27 05:35:12 +00002434 ParmVarDecl *getInstantiationOf(const ParmVarDecl *Var) {
2435 return cast<ParmVarDecl>(getInstantiationOf(cast<Decl>(Var)));
2436 }
2437
2438 void InstantiatedLocal(const Decl *D, Decl *Inst) {
2439 Decl *&Stored = LocalDecls[D];
2440 assert(!Stored && "Already instantiated this local");
2441 Stored = Inst;
Douglas Gregorf036aa72009-05-14 21:44:34 +00002442 }
2443 };
2444
2445 /// \brief The current instantiation scope used to store local
2446 /// variables.
2447 LocalInstantiationScope *CurrentInstantiationScope;
2448
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +00002449 QualType InstantiateType(QualType T, const TemplateArgumentList &TemplateArgs,
Douglas Gregor74296542009-02-27 19:31:52 +00002450 SourceLocation Loc, DeclarationName Entity);
Douglas Gregorab9f71a2009-06-05 00:53:49 +00002451
Douglas Gregorbd300312009-03-12 16:53:44 +00002452 OwningExprResult InstantiateExpr(Expr *E,
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +00002453 const TemplateArgumentList &TemplateArgs);
Douglas Gregorbd300312009-03-12 16:53:44 +00002454
Douglas Gregor5f62c5e2009-05-14 23:26:13 +00002455 OwningStmtResult InstantiateStmt(Stmt *S,
2456 const TemplateArgumentList &TemplateArgs);
Douglas Gregor6d0089b2009-05-20 22:57:03 +00002457 OwningStmtResult InstantiateCompoundStmt(CompoundStmt *S,
2458 const TemplateArgumentList &TemplateArgs,
2459 bool isStmtExpr);
Douglas Gregor5f62c5e2009-05-14 23:26:13 +00002460
Douglas Gregor1b39ef42009-03-17 21:15:40 +00002461 Decl *InstantiateDecl(Decl *D, DeclContext *Owner,
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +00002462 const TemplateArgumentList &TemplateArgs);
Douglas Gregor1b39ef42009-03-17 21:15:40 +00002463
Douglas Gregored3a3982009-03-03 04:44:36 +00002464 bool
Douglas Gregorcc887972009-03-25 21:17:03 +00002465 InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,
2466 CXXRecordDecl *Pattern,
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +00002467 const TemplateArgumentList &TemplateArgs);
Douglas Gregorcc887972009-03-25 21:17:03 +00002468
2469 bool
2470 InstantiateClass(SourceLocation PointOfInstantiation,
2471 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
Douglas Gregorfd79ac62009-05-13 00:25:59 +00002472 const TemplateArgumentList &TemplateArgs,
2473 bool ExplicitInstantiation);
Douglas Gregorcc887972009-03-25 21:17:03 +00002474
Douglas Gregored3a3982009-03-03 04:44:36 +00002475 bool
2476 InstantiateClassTemplateSpecialization(
2477 ClassTemplateSpecializationDecl *ClassTemplateSpec,
2478 bool ExplicitInstantiation);
Douglas Gregor74296542009-02-27 19:31:52 +00002479
Douglas Gregordf9f5d12009-05-13 20:28:22 +00002480 void InstantiateClassMembers(SourceLocation PointOfInstantiation,
2481 CXXRecordDecl *Instantiation,
2482 const TemplateArgumentList &TemplateArgs);
2483
2484 void InstantiateClassTemplateSpecializationMembers(
2485 SourceLocation PointOfInstantiation,
2486 ClassTemplateSpecializationDecl *ClassTemplateSpec);
2487
Douglas Gregor1e589cc2009-03-26 23:50:42 +00002488 NestedNameSpecifier *
2489 InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,
2490 SourceRange Range,
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +00002491 const TemplateArgumentList &TemplateArgs);
Douglas Gregor47bde7c2009-03-19 17:26:29 +00002492
Douglas Gregor15a92852009-03-31 18:38:02 +00002493 TemplateName
2494 InstantiateTemplateName(TemplateName Name, SourceLocation Loc,
Douglas Gregorf9e7d3d2009-05-11 23:53:27 +00002495 const TemplateArgumentList &TemplateArgs);
Douglas Gregorb320b9e2009-06-11 00:06:24 +00002496 TemplateArgument Instantiate(TemplateArgument Arg,
2497 const TemplateArgumentList &TemplateArgs);
Douglas Gregor15a92852009-03-31 18:38:02 +00002498
Douglas Gregorb12249d2009-05-18 17:01:57 +00002499 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
2500 FunctionDecl *Function);
Douglas Gregordf9f5d12009-05-13 20:28:22 +00002501 void InstantiateVariableDefinition(VarDecl *Var);
2502
Douglas Gregor9cbe6cd2009-05-27 17:54:46 +00002503 NamedDecl *InstantiateCurrentDeclRef(NamedDecl *D);
Douglas Gregorf97986d2009-05-27 05:35:12 +00002504
Anders Carlsson7f2e7442009-03-15 18:34:13 +00002505 // Simple function for cloning expressions.
2506 template<typename T>
2507 OwningExprResult Clone(T *E) {
2508 assert(!E->isValueDependent() && !E->isTypeDependent() &&
2509 "expression is value or type dependent!");
2510 return Owned(E->Clone(Context));
2511 }
2512
Steve Naroff81f1bba2007-09-06 21:24:23 +00002513 // Objective-C declarations.
Chris Lattner5261d0c2009-03-28 19:18:32 +00002514 virtual DeclPtrTy ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
2515 IdentifierInfo *ClassName,
2516 SourceLocation ClassLoc,
2517 IdentifierInfo *SuperName,
2518 SourceLocation SuperLoc,
2519 const DeclPtrTy *ProtoRefs,
2520 unsigned NumProtoRefs,
2521 SourceLocation EndProtoLoc,
2522 AttributeList *AttrList);
Fariborz Jahanian05d212a2007-10-11 23:42:27 +00002523
Chris Lattner5261d0c2009-03-28 19:18:32 +00002524 virtual DeclPtrTy ActOnCompatiblityAlias(
Fariborz Jahanian05d212a2007-10-11 23:42:27 +00002525 SourceLocation AtCompatibilityAliasLoc,
2526 IdentifierInfo *AliasName, SourceLocation AliasLocation,
2527 IdentifierInfo *ClassName, SourceLocation ClassLocation);
Steve Narofffe56a632009-03-05 15:22:01 +00002528
2529 void CheckForwardProtocolDeclarationForCircularDependency(
2530 IdentifierInfo *PName,
2531 SourceLocation &PLoc, SourceLocation PrevLoc,
2532 const ObjCList<ObjCProtocolDecl> &PList);
Steve Naroff81f1bba2007-09-06 21:24:23 +00002533
Chris Lattner5261d0c2009-03-28 19:18:32 +00002534 virtual DeclPtrTy ActOnStartProtocolInterface(
Nate Begeman43f307d2008-02-20 22:57:40 +00002535 SourceLocation AtProtoInterfaceLoc,
Fariborz Jahanian63ca8ae2007-09-17 21:07:36 +00002536 IdentifierInfo *ProtocolName, SourceLocation ProtocolLoc,
Chris Lattner5261d0c2009-03-28 19:18:32 +00002537 const DeclPtrTy *ProtoRefNames, unsigned NumProtoRefs,
Daniel Dunbar28680d12008-09-26 04:48:09 +00002538 SourceLocation EndProtoLoc,
2539 AttributeList *AttrList);
Fariborz Jahanian63ca8ae2007-09-17 21:07:36 +00002540
Chris Lattner5261d0c2009-03-28 19:18:32 +00002541 virtual DeclPtrTy ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc,
2542 IdentifierInfo *ClassName,
2543 SourceLocation ClassLoc,
2544 IdentifierInfo *CategoryName,
2545 SourceLocation CategoryLoc,
2546 const DeclPtrTy *ProtoRefs,
2547 unsigned NumProtoRefs,
2548 SourceLocation EndProtoLoc);
Fariborz Jahanianf25220e2007-09-18 20:26:58 +00002549
Chris Lattner5261d0c2009-03-28 19:18:32 +00002550 virtual DeclPtrTy ActOnStartClassImplementation(
Nate Begeman43f307d2008-02-20 22:57:40 +00002551 SourceLocation AtClassImplLoc,
Fariborz Jahanianc091b5d2007-09-25 18:38:09 +00002552 IdentifierInfo *ClassName, SourceLocation ClassLoc,
2553 IdentifierInfo *SuperClassname,
2554 SourceLocation SuperClassLoc);
2555
Chris Lattner5261d0c2009-03-28 19:18:32 +00002556 virtual DeclPtrTy ActOnStartCategoryImplementation(
Fariborz Jahaniana91aa322007-10-02 16:38:50 +00002557 SourceLocation AtCatImplLoc,
2558 IdentifierInfo *ClassName,
2559 SourceLocation ClassLoc,
2560 IdentifierInfo *CatName,
2561 SourceLocation CatLoc);
2562
Chris Lattner5261d0c2009-03-28 19:18:32 +00002563 virtual DeclPtrTy ActOnForwardClassDeclaration(SourceLocation Loc,
Steve Naroffb4dfe362007-10-02 22:39:18 +00002564 IdentifierInfo **IdentList,
2565 unsigned NumElts);
Fariborz Jahanianc716c942007-09-21 15:40:54 +00002566
Chris Lattner5261d0c2009-03-28 19:18:32 +00002567 virtual DeclPtrTy ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc,
Chris Lattnere705e5e2008-07-21 22:17:28 +00002568 const IdentifierLocPair *IdentList,
Fariborz Jahanian8f9b1b22008-12-17 01:07:27 +00002569 unsigned NumElts,
2570 AttributeList *attrList);
Fariborz Jahaniana096e1d2007-10-05 21:01:53 +00002571
Chris Lattner2bdedd62008-07-26 04:03:38 +00002572 virtual void FindProtocolDeclaration(bool WarnOnDeclarations,
Chris Lattnere705e5e2008-07-21 22:17:28 +00002573 const IdentifierLocPair *ProtocolId,
Fariborz Jahanian91193f62007-10-11 00:55:41 +00002574 unsigned NumProtocols,
Chris Lattner5261d0c2009-03-28 19:18:32 +00002575 llvm::SmallVectorImpl<DeclPtrTy> &Protocols);
Fariborz Jahanianed986602008-05-01 00:03:38 +00002576
Daniel Dunbar540ff472008-09-23 21:53:23 +00002577 /// Ensure attributes are consistent with type.
2578 /// \param [in, out] Attributes The attributes to check; they will
2579 /// be modified to be consistent with \arg PropertyTy.
2580 void CheckObjCPropertyAttributes(QualType PropertyTy,
2581 SourceLocation Loc,
2582 unsigned &Attributes);
Steve Naroffab63fd62009-01-08 17:28:14 +00002583 void ProcessPropertyDecl(ObjCPropertyDecl *property, ObjCContainerDecl *DC);
Fariborz Jahanianed986602008-05-01 00:03:38 +00002584 void DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
2585 ObjCPropertyDecl *SuperProperty,
Chris Lattnerd120b9e2008-11-24 03:54:41 +00002586 const IdentifierInfo *Name);
Fariborz Jahanianed986602008-05-01 00:03:38 +00002587 void ComparePropertiesInBaseAndSuper(ObjCInterfaceDecl *IDecl);
Fariborz Jahanian1e89de32008-04-24 19:58:34 +00002588
Fariborz Jahanianacad6d12008-12-06 23:03:39 +00002589 void MergeProtocolPropertiesIntoClass(Decl *CDecl,
Chris Lattner5261d0c2009-03-28 19:18:32 +00002590 DeclPtrTy MergeProtocols);
Fariborz Jahanian33973a22008-05-02 19:17:30 +00002591
Fariborz Jahanianffb68822009-03-02 19:05:07 +00002592 void DiagnoseClassExtensionDupMethods(ObjCCategoryDecl *CAT,
2593 ObjCInterfaceDecl *ID);
2594
Fariborz Jahanianacad6d12008-12-06 23:03:39 +00002595 void MergeOneProtocolPropertiesIntoClass(Decl *CDecl,
Fariborz Jahanian33973a22008-05-02 19:17:30 +00002596 ObjCProtocolDecl *PDecl);
2597
Chris Lattner5261d0c2009-03-28 19:18:32 +00002598 virtual void ActOnAtEnd(SourceLocation AtEndLoc, DeclPtrTy classDecl,
2599 DeclPtrTy *allMethods = 0, unsigned allNum = 0,
2600 DeclPtrTy *allProperties = 0, unsigned pNum = 0,
Chris Lattnera17991f2009-03-29 16:50:03 +00002601 DeclGroupPtrTy *allTUVars = 0, unsigned tuvNum = 0);
Fariborz Jahaniand34caf92007-09-26 18:27:25 +00002602
Chris Lattner5261d0c2009-03-28 19:18:32 +00002603 virtual DeclPtrTy ActOnProperty(Scope *S, SourceLocation AtLoc,
2604 FieldDeclarator &FD, ObjCDeclSpec &ODS,
2605 Selector GetterSel, Selector SetterSel,
2606 DeclPtrTy ClassCategory,
2607 bool *OverridingProperty,
2608 tok::ObjCKeywordKind MethodImplKind);
Fariborz Jahanian4aa72a72008-05-05 18:51:55 +00002609
Chris Lattner5261d0c2009-03-28 19:18:32 +00002610 virtual DeclPtrTy ActOnPropertyImplDecl(SourceLocation AtLoc,
2611 SourceLocation PropertyLoc,
2612 bool ImplKind,DeclPtrTy ClassImplDecl,
2613 IdentifierInfo *PropertyId,
2614 IdentifierInfo *PropertyIvar);
Fariborz Jahanian78f7e312008-04-18 00:19:30 +00002615
Chris Lattner5261d0c2009-03-28 19:18:32 +00002616 virtual DeclPtrTy ActOnMethodDeclaration(
Steve Naroff3774dd92007-10-26 20:53:56 +00002617 SourceLocation BeginLoc, // location of the + or -.
2618 SourceLocation EndLoc, // location of the ; or {.
Fariborz Jahanian8473b222007-11-09 19:52:12 +00002619 tok::TokenKind MethodType,
Chris Lattner5261d0c2009-03-28 19:18:32 +00002620 DeclPtrTy ClassDecl, ObjCDeclSpec &ReturnQT, TypeTy *ReturnType,
Fariborz Jahanian2fd0daa2007-10-31 23:53:01 +00002621 Selector Sel,
Steve Naroff4ed9d662007-09-27 14:38:14 +00002622 // optional arguments. The number of types/arguments is obtained
2623 // from the Sel.getNumArgs().
Chris Lattner612a2f72009-04-11 18:57:04 +00002624 ObjCArgInfo *ArgInfo,
Fariborz Jahanian89d53042009-01-09 00:38:19 +00002625 llvm::SmallVectorImpl<Declarator> &Cdecls,
Steve Naroff29fe7462007-11-15 12:35:21 +00002626 AttributeList *AttrList, tok::ObjCKeywordKind MethodImplKind,
2627 bool isVariadic = false);
Steve Naroff52664182007-10-16 23:12:48 +00002628
Steve Naroff4b129152009-02-26 15:55:06 +00002629 // Helper method for ActOnClassMethod/ActOnInstanceMethod.
2630 // Will search "local" class/category implementations for a method decl.
Fariborz Jahanian271f9062009-03-04 18:15:57 +00002631 // Will also search in class's root looking for instance method.
Steve Naroff4b129152009-02-26 15:55:06 +00002632 // Returns 0 if no method is found.
Steve Naroff9d8dc2b2009-03-08 18:56:13 +00002633 ObjCMethodDecl *LookupPrivateClassMethod(Selector Sel,
2634 ObjCInterfaceDecl *CDecl);
2635 ObjCMethodDecl *LookupPrivateInstanceMethod(Selector Sel,
2636 ObjCInterfaceDecl *ClassDecl);
Steve Naroff4b129152009-02-26 15:55:06 +00002637
Steve Naroff73ec9322009-03-09 21:12:44 +00002638 virtual OwningExprResult ActOnClassPropertyRefExpr(
2639 IdentifierInfo &receiverName,
2640 IdentifierInfo &propertyName,
2641 SourceLocation &receiverNameLoc,
2642 SourceLocation &propertyNameLoc);
2643
Steve Naroff4ed9d662007-09-27 14:38:14 +00002644 // ActOnClassMessage - used for both unary and keyword messages.
2645 // ArgExprs is optional - if it is present, the number of expressions
Steve Naroff9f176d12007-11-15 13:05:42 +00002646 // is obtained from NumArgs.
Steve Naroff4ed9d662007-09-27 14:38:14 +00002647 virtual ExprResult ActOnClassMessage(
Fariborz Jahanian2ce5dc52007-11-12 20:13:27 +00002648 Scope *S,
Anders Carlssonb42900d2009-02-14 18:21:46 +00002649 IdentifierInfo *receivingClassName, Selector Sel, SourceLocation lbrac,
2650 SourceLocation receiverLoc, SourceLocation selectorLoc,SourceLocation rbrac,
Steve Naroff9f176d12007-11-15 13:05:42 +00002651 ExprTy **ArgExprs, unsigned NumArgs);
Steve Naroff4ed9d662007-09-27 14:38:14 +00002652
2653 // ActOnInstanceMessage - used for both unary and keyword messages.
2654 // ArgExprs is optional - if it is present, the number of expressions
Steve Naroff9f176d12007-11-15 13:05:42 +00002655 // is obtained from NumArgs.
Steve Naroff4ed9d662007-09-27 14:38:14 +00002656 virtual ExprResult ActOnInstanceMessage(
Steve Naroff6cb1d362007-09-28 22:22:11 +00002657 ExprTy *receiver, Selector Sel,
Anders Carlssonb42900d2009-02-14 18:21:46 +00002658 SourceLocation lbrac, SourceLocation receiverLoc, SourceLocation rbrac,
Steve Naroff9f176d12007-11-15 13:05:42 +00002659 ExprTy **ArgExprs, unsigned NumArgs);
Daniel Dunbar81c7d472008-10-14 05:35:18 +00002660
2661 /// ActOnPragmaPack - Called on well formed #pragma pack(...).
2662 virtual void ActOnPragmaPack(PragmaPackKind Kind,
2663 IdentifierInfo *Name,
2664 ExprTy *Alignment,
2665 SourceLocation PragmaLoc,
2666 SourceLocation LParenLoc,
2667 SourceLocation RParenLoc);
Chris Lattnera8699562009-02-17 01:09:29 +00002668
Ted Kremenek86a631b2009-03-23 22:28:25 +00002669 /// ActOnPragmaUnused - Called on well-formed '#pragma unused'.
2670 virtual void ActOnPragmaUnused(ExprTy **Exprs, unsigned NumExprs,
2671 SourceLocation PragmaLoc,
2672 SourceLocation LParenLoc,
2673 SourceLocation RParenLoc);
Eli Friedman9758c0b2009-06-05 02:44:36 +00002674
Eli Friedman590b5682009-06-05 06:28:29 +00002675 /// ActOnPragmaWeakID - Called on well formed #pragma weak ident.
Eli Friedman9758c0b2009-06-05 02:44:36 +00002676 virtual void ActOnPragmaWeakID(IdentifierInfo* WeakName,
2677 SourceLocation PragmaLoc,
2678 SourceLocation WeakNameLoc);
2679
Eli Friedman590b5682009-06-05 06:28:29 +00002680 /// ActOnPragmaWeakAlias - Called on well formed #pragma weak ident = ident.
Eli Friedman9758c0b2009-06-05 02:44:36 +00002681 virtual void ActOnPragmaWeakAlias(IdentifierInfo* WeakName,
2682 IdentifierInfo* AliasName,
2683 SourceLocation PragmaLoc,
2684 SourceLocation WeakNameLoc,
2685 SourceLocation AliasNameLoc);
2686
Chris Lattnera8699562009-02-17 01:09:29 +00002687 /// getPragmaPackAlignment() - Return the current alignment as specified by
2688 /// the current #pragma pack directive, or 0 if none is currently active.
2689 unsigned getPragmaPackAlignment() const;
2690
2691 /// FreePackedContext - Deallocate and null out PackContext.
2692 void FreePackedContext();
Daniel Dunbar81c7d472008-10-14 05:35:18 +00002693
Chris Lattnere992d6c2008-01-16 19:17:22 +00002694 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
2695 /// cast. If there is already an implicit cast, merge into the existing one.
Douglas Gregor70d26122008-11-12 17:17:38 +00002696 /// If isLvalue, the result of the cast is an lvalue.
2697 void ImpCastExprToType(Expr *&Expr, QualType Type, bool isLvalue = false);
Chris Lattnere992d6c2008-01-16 19:17:22 +00002698
Chris Lattner4b009652007-07-25 00:24:17 +00002699 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2) and converts
Chris Lattner83bd5eb2007-12-28 05:29:59 +00002700 // functions and arrays to their respective pointers (C99 6.3.2.1).
2701 Expr *UsualUnaryConversions(Expr *&expr);
Eli Friedman86ad5222008-05-27 03:33:27 +00002702
Chris Lattner4b009652007-07-25 00:24:17 +00002703 // DefaultFunctionArrayConversion - converts functions and arrays
2704 // to their respective pointers (C99 6.3.2.1).
2705 void DefaultFunctionArrayConversion(Expr *&expr);
2706
Steve Naroffdb65e052007-08-28 23:30:39 +00002707 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
2708 // do not have a prototype. Integer promotions are performed on each
2709 // argument, and arguments that have type float are promoted to double.
Chris Lattner83bd5eb2007-12-28 05:29:59 +00002710 void DefaultArgumentPromotion(Expr *&Expr);
Anders Carlsson4b8e38c2009-01-16 16:48:51 +00002711
2712 // Used for emitting the right warning by DefaultVariadicArgumentPromotion
2713 enum VariadicCallType {
2714 VariadicFunction,
2715 VariadicBlock,
2716 VariadicMethod
2717 };
2718
2719 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
2720 // will warn if the resulting type is not a POD type.
Chris Lattner81f00ed2009-04-12 08:11:20 +00002721 bool DefaultVariadicArgumentPromotion(Expr *&Expr, VariadicCallType CT);
Steve Naroffdb65e052007-08-28 23:30:39 +00002722
Chris Lattner4b009652007-07-25 00:24:17 +00002723 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
2724 // operands and then handles various conversions that are common to binary
2725 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
2726 // routine returns the first non-arithmetic type found. The client is
2727 // responsible for emitting appropriate error diagnostics.
Steve Naroff8f708362007-08-24 19:07:16 +00002728 QualType UsualArithmeticConversions(Expr *&lExpr, Expr *&rExpr,
2729 bool isCompAssign = false);
Chris Lattnerd951b7b2008-01-04 18:22:42 +00002730
Douglas Gregor70d26122008-11-12 17:17:38 +00002731 /// UsualArithmeticConversionsType - handles the various conversions
2732 /// that are common to binary operators (C99 6.3.1.8, C++ [expr]p9)
2733 /// and returns the result type of that conversion.
2734 QualType UsualArithmeticConversionsType(QualType lhs, QualType rhs);
2735
2736
Chris Lattnerd951b7b2008-01-04 18:22:42 +00002737 /// AssignConvertType - All of the 'assignment' semantic checks return this
2738 /// enum to indicate whether the assignment was allowed. These checks are
2739 /// done for simple assignments, as well as initialization, return from
2740 /// function, argument passing, etc. The query is phrased in terms of a
2741 /// source and destination type.
Chris Lattner005ed752008-01-04 18:04:52 +00002742 enum AssignConvertType {
Chris Lattnerd951b7b2008-01-04 18:22:42 +00002743 /// Compatible - the types are compatible according to the standard.
Chris Lattner4b009652007-07-25 00:24:17 +00002744 Compatible,
Chris Lattnerd951b7b2008-01-04 18:22:42 +00002745
2746 /// PointerToInt - The assignment converts a pointer to an int, which we
2747 /// accept as an extension.
2748 PointerToInt,
2749
2750 /// IntToPointer - The assignment converts an int to a pointer, which we
2751 /// accept as an extension.
2752 IntToPointer,
2753
2754 /// FunctionVoidPointer - The assignment is between a function pointer and
2755 /// void*, which the standard doesn't allow, but we accept as an extension.
Chris Lattner4ca3d772008-01-03 22:56:36 +00002756 FunctionVoidPointer,
Chris Lattnerd951b7b2008-01-04 18:22:42 +00002757
2758 /// IncompatiblePointer - The assignment is between two pointers types that
2759 /// are not compatible, but we accept them as an extension.
Chris Lattner4b009652007-07-25 00:24:17 +00002760 IncompatiblePointer,
Eli Friedman6ca28cb2009-03-22 23:59:44 +00002761
2762 /// IncompatiblePointer - The assignment is between two pointers types which
2763 /// point to integers which have a different sign, but are otherwise identical.
2764 /// This is a subset of the above, but broken out because it's by far the most
2765 /// common case of incompatible pointers.
2766 IncompatiblePointerSign,
2767
Chris Lattnerd951b7b2008-01-04 18:22:42 +00002768 /// CompatiblePointerDiscardsQualifiers - The assignment discards
2769 /// c/v/r qualifiers, which we accept as an extension.
2770 CompatiblePointerDiscardsQualifiers,
Steve Naroff3454b6c2008-09-04 15:10:53 +00002771
Anders Carlsson355ed052009-01-30 23:17:46 +00002772 /// IncompatibleVectors - The assignment is between two vector types that
2773 /// have the same size, which we accept as an extension.
2774 IncompatibleVectors,
2775
Steve Naroff6f373332008-09-04 15:31:07 +00002776 /// IntToBlockPointer - The assignment converts an int to a block
Steve Naroff3454b6c2008-09-04 15:10:53 +00002777 /// pointer. We disallow this.
2778 IntToBlockPointer,
2779
Steve Naroff6f373332008-09-04 15:31:07 +00002780 /// IncompatibleBlockPointer - The assignment is between two block
Steve Naroff3454b6c2008-09-04 15:10:53 +00002781 /// pointers types that are not compatible.
2782 IncompatibleBlockPointer,
2783
Steve Naroff19608432008-10-14 22:18:38 +00002784 /// IncompatibleObjCQualifiedId - The assignment is between a qualified
2785 /// id type and something else (that is incompatible with it). For example,
2786 /// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
2787 IncompatibleObjCQualifiedId,
2788
Chris Lattnerd951b7b2008-01-04 18:22:42 +00002789 /// Incompatible - We reject this conversion outright, it is invalid to
2790 /// represent it in the AST.
2791 Incompatible
Chris Lattner4b009652007-07-25 00:24:17 +00002792 };
Chris Lattner005ed752008-01-04 18:04:52 +00002793
2794 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
2795 /// assignment conversion type specified by ConvTy. This returns true if the
2796 /// conversion was invalid or false if the conversion was accepted.
2797 bool DiagnoseAssignmentResult(AssignConvertType ConvTy,
2798 SourceLocation Loc,
2799 QualType DstType, QualType SrcType,
2800 Expr *SrcExpr, const char *Flavor);
2801
2802 /// CheckAssignmentConstraints - Perform type checking for assignment,
2803 /// argument passing, variable initialization, and function return values.
2804 /// This routine is only used by the following two methods. C99 6.5.16.
2805 AssignConvertType CheckAssignmentConstraints(QualType lhs, QualType rhs);
Chris Lattner4b009652007-07-25 00:24:17 +00002806
Douglas Gregor144b06c2009-04-29 22:16:16 +00002807 // CheckSingleAssignmentConstraints - Currently used by
Steve Naroff5cbb02f2007-09-16 14:56:35 +00002808 // CheckAssignmentOperands, and ActOnReturnStmt. Prior to type checking,
Chris Lattner4b009652007-07-25 00:24:17 +00002809 // this routine performs the default function/array converions.
Chris Lattner005ed752008-01-04 18:04:52 +00002810 AssignConvertType CheckSingleAssignmentConstraints(QualType lhs,
2811 Expr *&rExpr);
Douglas Gregor144b06c2009-04-29 22:16:16 +00002812
2813 // \brief If the lhs type is a transparent union, check whether we
2814 // can initialize the transparent union with the given expression.
2815 AssignConvertType CheckTransparentUnionArgumentConstraints(QualType lhs,
2816 Expr *&rExpr);
Chris Lattner4b009652007-07-25 00:24:17 +00002817
2818 // Helper function for CheckAssignmentConstraints (C99 6.5.16.1p1)
Chris Lattner005ed752008-01-04 18:04:52 +00002819 AssignConvertType CheckPointerTypesForAssignment(QualType lhsType,
2820 QualType rhsType);
Steve Naroff3454b6c2008-09-04 15:10:53 +00002821
2822 // Helper function for CheckAssignmentConstraints involving two
Sebastian Redl42b81a22009-04-19 19:26:31 +00002823 // block pointer types.
Steve Naroff3454b6c2008-09-04 15:10:53 +00002824 AssignConvertType CheckBlockPointerTypesForAssignment(QualType lhsType,
2825 QualType rhsType);
Douglas Gregor1815b3b2008-09-12 00:47:35 +00002826
2827 bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType);
Douglas Gregorbb461502008-10-24 04:54:22 +00002828
Douglas Gregor6fd35572008-12-19 17:40:08 +00002829 bool PerformImplicitConversion(Expr *&From, QualType ToType,
Sebastian Redla55834a2009-04-12 17:16:29 +00002830 const char *Flavor,
2831 bool AllowExplicit = false,
2832 bool Elidable = false);
Douglas Gregor6214d8a2009-01-14 15:45:31 +00002833 bool PerformImplicitConversion(Expr *&From, QualType ToType,
2834 const ImplicitConversionSequence& ICS,
Douglas Gregor6fd35572008-12-19 17:40:08 +00002835 const char *Flavor);
Douglas Gregorbb461502008-10-24 04:54:22 +00002836 bool PerformImplicitConversion(Expr *&From, QualType ToType,
Douglas Gregor6fd35572008-12-19 17:40:08 +00002837 const StandardConversionSequence& SCS,
2838 const char *Flavor);
Sebastian Redl95216a62009-02-07 00:15:38 +00002839
Chris Lattner4b009652007-07-25 00:24:17 +00002840 /// the following "Check" methods will return a valid/converted QualType
2841 /// or a null QualType (indicating an error diagnostic was issued).
Sebastian Redl95216a62009-02-07 00:15:38 +00002842
2843 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002844 QualType InvalidOperands(SourceLocation l, Expr *&lex, Expr *&rex);
Sebastian Redlaa4c3732009-02-07 20:10:22 +00002845 QualType CheckPointerToMemberOperands( // C++ 5.5
Sebastian Redl95216a62009-02-07 00:15:38 +00002846 Expr *&lex, Expr *&rex, SourceLocation OpLoc, bool isIndirect);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002847 QualType CheckMultiplyDivideOperands( // C99 6.5.5
Sebastian Redl95216a62009-02-07 00:15:38 +00002848 Expr *&lex, Expr *&rex, SourceLocation OpLoc, bool isCompAssign = false);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002849 QualType CheckRemainderOperands( // C99 6.5.5
Sebastian Redl95216a62009-02-07 00:15:38 +00002850 Expr *&lex, Expr *&rex, SourceLocation OpLoc, bool isCompAssign = false);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002851 QualType CheckAdditionOperands( // C99 6.5.6
Eli Friedman3cd92882009-03-28 01:22:36 +00002852 Expr *&lex, Expr *&rex, SourceLocation OpLoc, QualType* CompLHSTy = 0);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002853 QualType CheckSubtractionOperands( // C99 6.5.6
Eli Friedman3cd92882009-03-28 01:22:36 +00002854 Expr *&lex, Expr *&rex, SourceLocation OpLoc, QualType* CompLHSTy = 0);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002855 QualType CheckShiftOperands( // C99 6.5.7
Steve Naroff8f708362007-08-24 19:07:16 +00002856 Expr *&lex, Expr *&rex, SourceLocation OpLoc, bool isCompAssign = false);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002857 QualType CheckCompareOperands( // C99 6.5.8/9
Douglas Gregor1f12c352009-04-06 18:45:53 +00002858 Expr *&lex, Expr *&rex, SourceLocation OpLoc, unsigned Opc, bool isRelational);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002859 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
Sebastian Redl95216a62009-02-07 00:15:38 +00002860 Expr *&lex, Expr *&rex, SourceLocation OpLoc, bool isCompAssign = false);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002861 QualType CheckLogicalOperands( // C99 6.5.[13,14]
Chris Lattner4b009652007-07-25 00:24:17 +00002862 Expr *&lex, Expr *&rex, SourceLocation OpLoc);
2863 // CheckAssignmentOperands is used for both simple and compound assignment.
2864 // For simple assignment, pass both expressions and a null converted type.
2865 // For compound assignment, pass both expressions and the converted type.
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002866 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
Steve Naroff0f32f432007-08-24 22:33:52 +00002867 Expr *lex, Expr *&rex, SourceLocation OpLoc, QualType convertedType);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002868 QualType CheckCommaOperands( // C99 6.5.17
Chris Lattner1eafdea2008-11-18 01:30:42 +00002869 Expr *lex, Expr *&rex, SourceLocation OpLoc);
Douglas Gregor5b5b6692009-03-12 22:46:12 +00002870 QualType CheckConditionalOperands( // C99 6.5.15
Chris Lattner4b009652007-07-25 00:24:17 +00002871 Expr *&cond, Expr *&lhs, Expr *&rhs, SourceLocation questionLoc);
Sebastian Redlbd261962009-04-16 17:51:27 +00002872 QualType CXXCheckConditionalOperands( // C++ 5.16
2873 Expr *&cond, Expr *&lhs, Expr *&rhs, SourceLocation questionLoc);
Sebastian Redl42b81a22009-04-19 19:26:31 +00002874 QualType FindCompositePointerType(Expr *&E1, Expr *&E2); // C++ 5.9
Nate Begemanc5f0f652008-07-14 18:02:46 +00002875
2876 /// type checking for vector binary operators.
2877 inline QualType CheckVectorOperands(SourceLocation l, Expr *&lex, Expr *&rex);
2878 inline QualType CheckVectorCompareOperands(Expr *&lex, Expr *&rx,
2879 SourceLocation l, bool isRel);
Chris Lattner4b009652007-07-25 00:24:17 +00002880
Steve Naroff87d58b42007-09-16 03:34:24 +00002881 /// type checking unary operators (subroutines of ActOnUnaryOp).
Chris Lattner4b009652007-07-25 00:24:17 +00002882 /// C99 6.5.3.1, 6.5.3.2, 6.5.3.4
Sebastian Redl0440c8c2008-12-20 09:35:34 +00002883 QualType CheckIncrementDecrementOperand(Expr *op, SourceLocation OpLoc,
2884 bool isInc);
Chris Lattner4b009652007-07-25 00:24:17 +00002885 QualType CheckAddressOfOperand(Expr *op, SourceLocation OpLoc);
2886 QualType CheckIndirectionOperand(Expr *op, SourceLocation OpLoc);
Chris Lattner57e5f7e2009-02-17 08:12:06 +00002887 QualType CheckRealImagOperand(Expr *&Op, SourceLocation OpLoc, bool isReal);
Steve Naroff1b8a46c2007-07-27 22:15:19 +00002888
2889 /// type checking primary expressions.
Nate Begemanaf6ed502008-04-18 23:10:10 +00002890 QualType CheckExtVectorComponent(QualType baseType, SourceLocation OpLoc,
Steve Naroff1b8a46c2007-07-27 22:15:19 +00002891 IdentifierInfo &Comp, SourceLocation CmpLoc);
2892
Steve Naroffe14e5542007-09-02 02:04:30 +00002893 /// type checking declaration initializers (C99 6.7.8)
Anders Carlsson73bb5e62009-05-27 16:10:08 +00002894
Douglas Gregor6428e762008-11-05 15:29:30 +00002895 bool CheckInitializerTypes(Expr *&simpleInit_or_initList, QualType &declType,
Douglas Gregor6214d8a2009-01-14 15:45:31 +00002896 SourceLocation InitLoc,DeclarationName InitEntity,
Anders Carlsson8cc1f0d2009-05-30 20:41:30 +00002897 bool DirectInit);
Douglas Gregor849afc32009-01-29 00:45:39 +00002898 bool CheckInitList(InitListExpr *&InitList, QualType &DeclType);
Steve Narofff0b23542008-01-10 22:15:12 +00002899 bool CheckForConstantInitializer(Expr *e, QualType t);
Steve Naroffcb69fb72007-12-10 22:44:33 +00002900
Douglas Gregor538a4c22009-02-02 17:43:21 +00002901 bool CheckValueInitialization(QualType Type, SourceLocation Loc);
Argiris Kirtzidis95de23a2008-08-16 20:27:34 +00002902
Douglas Gregor81c29152008-10-29 00:13:59 +00002903 // type checking C++ declaration initializers (C++ [dcl.init]).
2904
2905 /// ReferenceCompareResult - Expresses the result of comparing two
2906 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
2907 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
2908 enum ReferenceCompareResult {
2909 /// Ref_Incompatible - The two types are incompatible, so direct
2910 /// reference binding is not possible.
2911 Ref_Incompatible = 0,
2912 /// Ref_Related - The two types are reference-related, which means
2913 /// that their unqualified forms (T1 and T2) are either the same
2914 /// or T1 is a base class of T2.
2915 Ref_Related,
2916 /// Ref_Compatible_With_Added_Qualification - The two types are
2917 /// reference-compatible with added qualification, meaning that
2918 /// they are reference-compatible and the qualifiers on T1 (cv1)
2919 /// are greater than the qualifiers on T2 (cv2).
2920 Ref_Compatible_With_Added_Qualification,
2921 /// Ref_Compatible - The two types are reference-compatible and
2922 /// have equivalent qualifiers (cv1 == cv2).
2923 Ref_Compatible
2924 };
2925
Douglas Gregor2aecd1f2008-10-29 02:00:59 +00002926 ReferenceCompareResult CompareReferenceRelationship(QualType T1, QualType T2,
2927 bool& DerivedToBase);
Douglas Gregor81c29152008-10-29 00:13:59 +00002928
Sebastian Redlbd261962009-04-16 17:51:27 +00002929 bool CheckReferenceInit(Expr *&simpleInit_or_initList, QualType declType,
Douglas Gregora3b34bb2008-11-03 19:09:14 +00002930 ImplicitConversionSequence *ICS = 0,
Douglas Gregor6214d8a2009-01-14 15:45:31 +00002931 bool SuppressUserConversions = false,
Sebastian Redla55834a2009-04-12 17:16:29 +00002932 bool AllowExplicit = false,
2933 bool ForceRValue = false);
Douglas Gregor81c29152008-10-29 00:13:59 +00002934
Argiris Kirtzidis95de23a2008-08-16 20:27:34 +00002935 /// CheckCastTypes - Check type constraints for casting between types.
Daniel Dunbar5ad49de2008-08-20 03:55:42 +00002936 bool CheckCastTypes(SourceRange TyRange, QualType CastTy, Expr *&CastExpr);
Steve Naroff0d4e6ad2008-01-22 00:55:40 +00002937
Anders Carlsson74375622007-11-27 07:16:40 +00002938 // CheckVectorCast - check type constraints for vectors.
2939 // Since vectors are an extension, there are no C standard reference for this.
2940 // We allow casting between vectors and integer datatypes of the same size.
Anders Carlssonf257b4c2007-11-27 05:51:55 +00002941 // returns true if the cast is invalid
2942 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty);
2943
Daniel Dunbar842b5e22008-09-11 00:01:56 +00002944 /// CheckMessageArgumentTypes - Check types in an Obj-C message send.
2945 /// \param Method - May be null.
2946 /// \param [out] ReturnType - The return type of the send.
2947 /// \return true iff there were any incompatible types.
Daniel Dunbar7776e102008-09-11 00:50:25 +00002948 bool CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs, Selector Sel,
Chris Lattner3a8f2942008-11-24 03:33:13 +00002949 ObjCMethodDecl *Method, bool isClassMessage,
Daniel Dunbar842b5e22008-09-11 00:01:56 +00002950 SourceLocation lbrac, SourceLocation rbrac,
2951 QualType &ReturnType);
Argiris Kirtzidis810c0f72008-09-10 02:17:11 +00002952
2953 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
2954 bool CheckCXXBooleanCondition(Expr *&CondExpr);
Steve Naroff52664182007-10-16 23:12:48 +00002955
Chris Lattner3429a812007-08-23 05:46:52 +00002956 /// ConvertIntegerToTypeWarnOnOverflow - Convert the specified APInt to have
2957 /// the specified width and sign. If an overflow occurs, detect it and emit
2958 /// the specified diagnostic.
2959 void ConvertIntegerToTypeWarnOnOverflow(llvm::APSInt &OldVal,
2960 unsigned NewWidth, bool NewSign,
2961 SourceLocation Loc, unsigned DiagID);
2962
Chris Lattnerfe1f4032008-04-07 05:30:13 +00002963 bool ObjCQualifiedIdTypesAreCompatible(QualType LHS, QualType RHS,
2964 bool ForCompare);
2965
Anders Carlsson0a6ab172008-11-04 16:57:32 +00002966 /// Checks that the Objective-C declaration is declared in the global scope.
2967 /// Emits an error and marks the declaration as invalid if it's not declared
2968 /// in the global scope.
2969 bool CheckObjCDeclScope(Decl *D);
2970
Anders Carlsson36760332007-10-15 20:28:48 +00002971 void InitBuiltinVaListType();
Eli Friedman48fb3ee2008-06-03 21:01:11 +00002972
Anders Carlssond5201b92008-11-30 19:50:32 +00002973 /// VerifyIntegerConstantExpression - verifies that an expression is an ICE,
2974 /// and reports the appropriate diagnostics. Returns false on success.
2975 /// Can optionally return the value of the expression.
Anders Carlsson108229a2008-12-06 20:33:04 +00002976 bool VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result = 0);
Anders Carlsson511425a2008-12-01 02:17:22 +00002977
Anders Carlsson108229a2008-12-06 20:33:04 +00002978 /// VerifyBitField - verifies that a bit field expression is an ICE and has
2979 /// the correct width, and that the field type is valid.
2980 /// Returns false on success.
2981 bool VerifyBitField(SourceLocation FieldLoc, IdentifierInfo *FieldName,
2982 QualType FieldTy, const Expr *BitWidth);
Sebastian Redl8b769972009-01-19 00:08:26 +00002983
Chris Lattner2e64c072007-08-10 20:18:51 +00002984 //===--------------------------------------------------------------------===//
2985 // Extra semantic analysis beyond the C type system
Chris Lattner83bd5eb2007-12-28 05:29:59 +00002986private:
Sebastian Redl8b769972009-01-19 00:08:26 +00002987 Action::OwningExprResult CheckFunctionCall(FunctionDecl *FDecl,
2988 CallExpr *TheCall);
Fariborz Jahanianf83c85f2009-05-18 21:05:18 +00002989
2990 Action::OwningExprResult CheckBlockCall(NamedDecl *NDecl, CallExpr *TheCall);
Chris Lattnerf17cb362009-02-18 17:49:48 +00002991 SourceLocation getLocationOfStringLiteralByte(const StringLiteral *SL,
2992 unsigned ByteNo) const;
Chris Lattner81f5be22009-02-18 06:01:06 +00002993 bool CheckObjCString(Expr *Arg);
Chris Lattner83bd5eb2007-12-28 05:29:59 +00002994 bool SemaBuiltinVAStart(CallExpr *TheCall);
2995 bool SemaBuiltinUnorderedCompare(CallExpr *TheCall);
Eli Friedman8c50c622008-05-20 08:23:37 +00002996 bool SemaBuiltinStackAddress(CallExpr *TheCall);
Douglas Gregor602173d2009-05-19 22:10:17 +00002997
2998public:
2999 // Used by C++ template instantiation.
Sebastian Redl8b769972009-01-19 00:08:26 +00003000 Action::OwningExprResult SemaBuiltinShuffleVector(CallExpr *TheCall);
Douglas Gregor602173d2009-05-19 22:10:17 +00003001
3002private:
Daniel Dunbar5b0de852008-07-21 22:59:13 +00003003 bool SemaBuiltinPrefetch(CallExpr *TheCall);
Eli Friedman6277e402009-05-03 04:46:36 +00003004 bool SemaBuiltinObjectSize(CallExpr *TheCall);
3005 bool SemaBuiltinLongjmp(CallExpr *TheCall);
Chris Lattner822adfe2009-05-08 06:58:22 +00003006 bool SemaBuiltinAtomicOverloaded(CallExpr *TheCall);
Ted Kremenek51787c72009-03-20 21:35:28 +00003007 bool SemaCheckStringLiteral(const Expr *E, const CallExpr *TheCall,
3008 bool HasVAListArg, unsigned format_idx,
3009 unsigned firstDataArg);
3010 void CheckPrintfString(const StringLiteral *FExpr, const Expr *OrigFormatExpr,
3011 const CallExpr *TheCall, bool HasVAListArg,
Douglas Gregorb5af7382009-02-14 18:57:46 +00003012 unsigned format_idx, unsigned firstDataArg);
Fariborz Jahanian5440d2f2009-05-21 18:48:51 +00003013 void CheckNonNullArguments(const NonNullAttr *NonNull,
3014 const CallExpr *TheCall);
Ted Kremenek51787c72009-03-20 21:35:28 +00003015 void CheckPrintfArguments(const CallExpr *TheCall, bool HasVAListArg,
Douglas Gregorb5af7382009-02-14 18:57:46 +00003016 unsigned format_idx, unsigned firstDataArg);
Ted Kremenek45925ab2007-08-17 16:46:58 +00003017 void CheckReturnStackAddr(Expr *RetValExp, QualType lhsType,
3018 SourceLocation ReturnLoc);
Ted Kremenek30c66752007-11-25 00:58:00 +00003019 void CheckFloatComparison(SourceLocation loc, Expr* lex, Expr* rex);
Chris Lattner4b009652007-07-25 00:24:17 +00003020};
3021
Mike Stumpae93d652009-02-19 22:01:56 +00003022
Ted Kremenek0c97e042009-02-07 01:47:29 +00003023//===--------------------------------------------------------------------===//
3024// Typed version of Parser::ExprArg (smart pointer for wrapping Expr pointers).
3025template <typename T>
3026class ExprOwningPtr : public Action::ExprArg {
3027public:
Douglas Gregorbd300312009-03-12 16:53:44 +00003028 ExprOwningPtr(Sema *S, T *expr) : Action::ExprArg(*S, expr) {}
Ted Kremenek0c97e042009-02-07 01:47:29 +00003029
3030 void reset(T* p) { Action::ExprArg::operator=(p); }
3031 T* get() const { return static_cast<T*>(Action::ExprArg::get()); }
3032 T* take() { return static_cast<T*>(Action::ExprArg::take()); }
3033 T* release() { return take(); }
3034
3035 T& operator*() const { return *get(); }
3036 T* operator->() const { return get(); }
3037};
Douglas Gregor1f280192009-05-20 22:33:37 +00003038
Chris Lattner4b009652007-07-25 00:24:17 +00003039} // end namespace clang
3040
3041#endif