blob: 251fb5e72b108f345bc46ce24ddedd67342ac65e [file] [log] [blame]
Chris Lattnerac7b83a2008-04-08 05:04:30 +00001//===------ SemaDeclCXX.cpp - Semantic Analysis for C++ Declarations ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements semantic analysis for C++ declarations.
11//
12//===----------------------------------------------------------------------===//
13
14#include "Sema.h"
15#include "clang/Basic/LangOptions.h"
Douglas Gregorec93f442008-04-13 21:30:24 +000016#include "clang/AST/ASTContext.h"
Chris Lattnerac7b83a2008-04-08 05:04:30 +000017#include "clang/AST/Expr.h"
Chris Lattner97316c02008-04-10 02:22:51 +000018#include "clang/AST/StmtVisitor.h"
Chris Lattnerac7b83a2008-04-08 05:04:30 +000019#include "clang/AST/Type.h"
20#include "llvm/ADT/OwningPtr.h"
Chris Lattner97316c02008-04-10 02:22:51 +000021#include "llvm/Support/Compiler.h"
Chris Lattnerac7b83a2008-04-08 05:04:30 +000022
23using namespace clang;
24
Chris Lattner97316c02008-04-10 02:22:51 +000025//===----------------------------------------------------------------------===//
26// CheckDefaultArgumentVisitor
27//===----------------------------------------------------------------------===//
28
Chris Lattnerb1856db2008-04-12 23:52:44 +000029namespace {
30 /// CheckDefaultArgumentVisitor - C++ [dcl.fct.default] Traverses
31 /// the default argument of a parameter to determine whether it
32 /// contains any ill-formed subexpressions. For example, this will
33 /// diagnose the use of local variables or parameters within the
34 /// default argument expression.
35 class VISIBILITY_HIDDEN CheckDefaultArgumentVisitor
36 : public StmtVisitor<CheckDefaultArgumentVisitor, bool>
37 {
38 Expr *DefaultArg;
39 Sema *S;
Chris Lattner97316c02008-04-10 02:22:51 +000040
Chris Lattnerb1856db2008-04-12 23:52:44 +000041 public:
42 CheckDefaultArgumentVisitor(Expr *defarg, Sema *s)
43 : DefaultArg(defarg), S(s) {}
Chris Lattner97316c02008-04-10 02:22:51 +000044
Chris Lattnerb1856db2008-04-12 23:52:44 +000045 bool VisitExpr(Expr *Node);
46 bool VisitDeclRefExpr(DeclRefExpr *DRE);
47 };
Chris Lattner97316c02008-04-10 02:22:51 +000048
Chris Lattnerb1856db2008-04-12 23:52:44 +000049 /// VisitExpr - Visit all of the children of this expression.
50 bool CheckDefaultArgumentVisitor::VisitExpr(Expr *Node) {
51 bool IsInvalid = false;
52 for (Stmt::child_iterator first = Node->child_begin(),
53 last = Node->child_end();
54 first != last; ++first)
55 IsInvalid |= Visit(*first);
Chris Lattner97316c02008-04-10 02:22:51 +000056
Chris Lattnerb1856db2008-04-12 23:52:44 +000057 return IsInvalid;
Chris Lattner97316c02008-04-10 02:22:51 +000058 }
59
Chris Lattnerb1856db2008-04-12 23:52:44 +000060 /// VisitDeclRefExpr - Visit a reference to a declaration, to
61 /// determine whether this declaration can be used in the default
62 /// argument expression.
63 bool CheckDefaultArgumentVisitor::VisitDeclRefExpr(DeclRefExpr *DRE) {
64 ValueDecl *Decl = DRE->getDecl();
65 if (ParmVarDecl *Param = dyn_cast<ParmVarDecl>(Decl)) {
66 // C++ [dcl.fct.default]p9
67 // Default arguments are evaluated each time the function is
68 // called. The order of evaluation of function arguments is
69 // unspecified. Consequently, parameters of a function shall not
70 // be used in default argument expressions, even if they are not
71 // evaluated. Parameters of a function declared before a default
72 // argument expression are in scope and can hide namespace and
73 // class member names.
74 return S->Diag(DRE->getSourceRange().getBegin(),
75 diag::err_param_default_argument_references_param,
76 Param->getName(), DefaultArg->getSourceRange());
Steve Naroff72a6ebc2008-04-15 22:42:06 +000077 } else if (VarDecl *VDecl = dyn_cast<VarDecl>(Decl)) {
Chris Lattnerb1856db2008-04-12 23:52:44 +000078 // C++ [dcl.fct.default]p7
79 // Local variables shall not be used in default argument
80 // expressions.
Steve Naroff72a6ebc2008-04-15 22:42:06 +000081 if (VDecl->isBlockVarDecl())
82 return S->Diag(DRE->getSourceRange().getBegin(),
83 diag::err_param_default_argument_references_local,
84 VDecl->getName(), DefaultArg->getSourceRange());
Chris Lattnerb1856db2008-04-12 23:52:44 +000085 }
Chris Lattner97316c02008-04-10 02:22:51 +000086
Chris Lattnerb1856db2008-04-12 23:52:44 +000087 // FIXME: when Clang has support for member functions, "this"
88 // will also need to be diagnosed.
89
90 return false;
91 }
Chris Lattner97316c02008-04-10 02:22:51 +000092}
93
94/// ActOnParamDefaultArgument - Check whether the default argument
95/// provided for a function parameter is well-formed. If so, attach it
96/// to the parameter declaration.
Chris Lattnerac7b83a2008-04-08 05:04:30 +000097void
98Sema::ActOnParamDefaultArgument(DeclTy *param, SourceLocation EqualLoc,
99 ExprTy *defarg) {
100 ParmVarDecl *Param = (ParmVarDecl *)param;
101 llvm::OwningPtr<Expr> DefaultArg((Expr *)defarg);
102 QualType ParamType = Param->getType();
103
104 // Default arguments are only permitted in C++
105 if (!getLangOptions().CPlusPlus) {
106 Diag(EqualLoc, diag::err_param_default_argument,
107 DefaultArg->getSourceRange());
108 return;
109 }
110
111 // C++ [dcl.fct.default]p5
112 // A default argument expression is implicitly converted (clause
113 // 4) to the parameter type. The default argument expression has
114 // the same semantic constraints as the initializer expression in
115 // a declaration of a variable of the parameter type, using the
116 // copy-initialization semantics (8.5).
117 //
118 // FIXME: CheckSingleAssignmentConstraints has the wrong semantics
119 // for C++ (since we want copy-initialization, not copy-assignment),
120 // but we don't have the right semantics implemented yet. Because of
121 // this, our error message is also very poor.
122 QualType DefaultArgType = DefaultArg->getType();
123 Expr *DefaultArgPtr = DefaultArg.get();
124 AssignConvertType ConvTy = CheckSingleAssignmentConstraints(ParamType,
125 DefaultArgPtr);
126 if (DefaultArgPtr != DefaultArg.get()) {
127 DefaultArg.take();
128 DefaultArg.reset(DefaultArgPtr);
129 }
130 if (DiagnoseAssignmentResult(ConvTy, DefaultArg->getLocStart(),
131 ParamType, DefaultArgType, DefaultArg.get(),
132 "in default argument")) {
133 return;
134 }
135
136 // FIXME: C++ [dcl.fct.default]p3
137 // A default argument expression shall be specified only in the
138 // parameter-declaration-clause of a function declaration or in a
139 // template-parameter (14.1). It shall not be specified for a
140 // parameter pack. If it is specified in a
141 // parameter-declaration-clause, it shall not occur within a
142 // declarator or abstract-declarator of a parameter-declaration.
143
Chris Lattner97316c02008-04-10 02:22:51 +0000144 // Check that the default argument is well-formed
Chris Lattnerb1856db2008-04-12 23:52:44 +0000145 CheckDefaultArgumentVisitor DefaultArgChecker(DefaultArg.get(), this);
Chris Lattner97316c02008-04-10 02:22:51 +0000146 if (DefaultArgChecker.Visit(DefaultArg.get()))
147 return;
148
Chris Lattnerac7b83a2008-04-08 05:04:30 +0000149 // Okay: add the default argument to the parameter
150 Param->setDefaultArg(DefaultArg.take());
151}
152
153// MergeCXXFunctionDecl - Merge two declarations of the same C++
154// function, once we already know that they have the same
155// type. Subroutine of MergeFunctionDecl.
156FunctionDecl *
157Sema::MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old) {
158 // C++ [dcl.fct.default]p4:
159 //
160 // For non-template functions, default arguments can be added in
161 // later declarations of a function in the same
162 // scope. Declarations in different scopes have completely
163 // distinct sets of default arguments. That is, declarations in
164 // inner scopes do not acquire default arguments from
165 // declarations in outer scopes, and vice versa. In a given
166 // function declaration, all parameters subsequent to a
167 // parameter with a default argument shall have default
168 // arguments supplied in this or previous declarations. A
169 // default argument shall not be redefined by a later
170 // declaration (not even to the same value).
171 for (unsigned p = 0, NumParams = Old->getNumParams(); p < NumParams; ++p) {
172 ParmVarDecl *OldParam = Old->getParamDecl(p);
173 ParmVarDecl *NewParam = New->getParamDecl(p);
174
175 if(OldParam->getDefaultArg() && NewParam->getDefaultArg()) {
176 Diag(NewParam->getLocation(),
177 diag::err_param_default_argument_redefinition,
178 NewParam->getDefaultArg()->getSourceRange());
179 Diag(OldParam->getLocation(), diag::err_previous_definition);
180 } else if (OldParam->getDefaultArg()) {
181 // Merge the old default argument into the new parameter
182 NewParam->setDefaultArg(OldParam->getDefaultArg());
183 }
184 }
185
186 return New;
187}
188
189/// CheckCXXDefaultArguments - Verify that the default arguments for a
190/// function declaration are well-formed according to C++
191/// [dcl.fct.default].
192void Sema::CheckCXXDefaultArguments(FunctionDecl *FD) {
193 unsigned NumParams = FD->getNumParams();
194 unsigned p;
195
196 // Find first parameter with a default argument
197 for (p = 0; p < NumParams; ++p) {
198 ParmVarDecl *Param = FD->getParamDecl(p);
199 if (Param->getDefaultArg())
200 break;
201 }
202
203 // C++ [dcl.fct.default]p4:
204 // In a given function declaration, all parameters
205 // subsequent to a parameter with a default argument shall
206 // have default arguments supplied in this or previous
207 // declarations. A default argument shall not be redefined
208 // by a later declaration (not even to the same value).
209 unsigned LastMissingDefaultArg = 0;
210 for(; p < NumParams; ++p) {
211 ParmVarDecl *Param = FD->getParamDecl(p);
212 if (!Param->getDefaultArg()) {
213 if (Param->getIdentifier())
214 Diag(Param->getLocation(),
215 diag::err_param_default_argument_missing_name,
216 Param->getIdentifier()->getName());
217 else
218 Diag(Param->getLocation(),
219 diag::err_param_default_argument_missing);
220
221 LastMissingDefaultArg = p;
222 }
223 }
224
225 if (LastMissingDefaultArg > 0) {
226 // Some default arguments were missing. Clear out all of the
227 // default arguments up to (and including) the last missing
228 // default argument, so that we leave the function parameters
229 // in a semantically valid state.
230 for (p = 0; p <= LastMissingDefaultArg; ++p) {
231 ParmVarDecl *Param = FD->getParamDecl(p);
232 if (Param->getDefaultArg()) {
233 delete Param->getDefaultArg();
234 Param->setDefaultArg(0);
235 }
236 }
237 }
238}
Douglas Gregorec93f442008-04-13 21:30:24 +0000239
240/// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
241/// one entry in the base class list of a class specifier, for
242/// example:
243/// class foo : public bar, virtual private baz {
244/// 'public bar' and 'virtual private baz' are each base-specifiers.
245void Sema::ActOnBaseSpecifier(DeclTy *classdecl, SourceRange SpecifierRange,
246 bool Virtual, AccessSpecifier Access,
247 DeclTy *basetype, SourceLocation BaseLoc) {
248 RecordDecl *Decl = (RecordDecl*)classdecl;
249 QualType BaseType = Context.getTypeDeclType((TypeDecl*)basetype);
250
251 // Base specifiers must be record types.
252 if (!BaseType->isRecordType()) {
253 Diag(BaseLoc, diag::err_base_must_be_class, SpecifierRange);
254 return;
255 }
256
257 // C++ [class.union]p1:
258 // A union shall not be used as a base class.
259 if (BaseType->isUnionType()) {
260 Diag(BaseLoc, diag::err_union_as_base_class, SpecifierRange);
261 return;
262 }
263
264 // C++ [class.union]p1:
265 // A union shall not have base classes.
266 if (Decl->getKind() == Decl::Union) {
267 Diag(Decl->getLocation(), diag::err_base_clause_on_union,
268 SpecifierRange);
269 Decl->setInvalidDecl();
270 return;
271 }
272
273 // C++ [class.derived]p2:
274 // The class-name in a base-specifier shall not be an incompletely
275 // defined class.
276 if (BaseType->isIncompleteType()) {
277 Diag(BaseLoc, diag::err_incomplete_base_class, SpecifierRange);
278 return;
279 }
280
281 // FIXME: C++ [class.mi]p3:
282 // A class shall not be specified as a direct base class of a
283 // derived class more than once.
284
285 // FIXME: Attach base class to the record.
286}