blob: aa0efcdc70e197cd19dc4c3db1a50f895beedc87 [file] [log] [blame]
Cedric Venet3d658642009-02-14 20:20:19 +00001//===--- SemaCXXScopeSpec.cpp - Semantic Analysis for C++ scope specifiers-===//
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 C++ semantic analysis for scope specifiers.
11//
12//===----------------------------------------------------------------------===//
13
John McCall2d887082010-08-25 22:03:47 +000014#include "clang/Sema/SemaInternal.h"
Douglas Gregore737f502010-08-12 20:07:10 +000015#include "clang/Sema/Lookup.h"
Cedric Venet3d658642009-02-14 20:20:19 +000016#include "clang/AST/ASTContext.h"
Douglas Gregor42af25f2009-05-11 19:58:34 +000017#include "clang/AST/DeclTemplate.h"
Douglas Gregorfe85ced2009-08-06 03:17:00 +000018#include "clang/AST/ExprCXX.h"
Douglas Gregore4e5b052009-03-19 00:18:19 +000019#include "clang/AST/NestedNameSpecifier.h"
Anders Carlssonb7906612009-08-26 23:45:07 +000020#include "clang/Basic/PartialDiagnostic.h"
John McCall19510852010-08-20 18:27:03 +000021#include "clang/Sema/DeclSpec.h"
Cedric Venet3d658642009-02-14 20:20:19 +000022#include "llvm/ADT/STLExtras.h"
Douglas Gregor7551c182009-07-22 00:28:09 +000023#include "llvm/Support/raw_ostream.h"
Cedric Venet3d658642009-02-14 20:20:19 +000024using namespace clang;
25
Douglas Gregor43d88632009-11-04 22:49:18 +000026/// \brief Find the current instantiation that associated with the given type.
Douglas Gregord9ea1802011-02-19 19:24:40 +000027static CXXRecordDecl *getCurrentInstantiationOf(QualType T,
28 DeclContext *CurContext) {
Douglas Gregor43d88632009-11-04 22:49:18 +000029 if (T.isNull())
30 return 0;
John McCall31f17ec2010-04-27 00:57:59 +000031
32 const Type *Ty = T->getCanonicalTypeInternal().getTypePtr();
Douglas Gregord9ea1802011-02-19 19:24:40 +000033 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
34 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
35 if (!T->isDependentType())
36 return Record;
37
38 // This may be a member of a class template or class template partial
39 // specialization. If it's part of the current semantic context, then it's
40 // an injected-class-name;
41 for (; !CurContext->isFileContext(); CurContext = CurContext->getParent())
42 if (CurContext->Equals(Record))
43 return Record;
44
45 return 0;
46 } else if (isa<InjectedClassNameType>(Ty))
John McCall31f17ec2010-04-27 00:57:59 +000047 return cast<InjectedClassNameType>(Ty)->getDecl();
48 else
49 return 0;
Douglas Gregor43d88632009-11-04 22:49:18 +000050}
51
Douglas Gregor2dd078a2009-09-02 22:59:36 +000052/// \brief Compute the DeclContext that is associated with the given type.
53///
54/// \param T the type for which we are attempting to find a DeclContext.
55///
Mike Stump1eb44332009-09-09 15:08:12 +000056/// \returns the declaration context represented by the type T,
Douglas Gregor2dd078a2009-09-02 22:59:36 +000057/// or NULL if the declaration context cannot be computed (e.g., because it is
58/// dependent and not the current instantiation).
59DeclContext *Sema::computeDeclContext(QualType T) {
Douglas Gregord9ea1802011-02-19 19:24:40 +000060 if (!T->isDependentType())
61 if (const TagType *Tag = T->getAs<TagType>())
62 return Tag->getDecl();
Mike Stump1eb44332009-09-09 15:08:12 +000063
Douglas Gregord9ea1802011-02-19 19:24:40 +000064 return ::getCurrentInstantiationOf(T, CurContext);
Douglas Gregor2dd078a2009-09-02 22:59:36 +000065}
66
Douglas Gregore4e5b052009-03-19 00:18:19 +000067/// \brief Compute the DeclContext that is associated with the given
68/// scope specifier.
Douglas Gregorf59a56e2009-07-21 23:53:31 +000069///
70/// \param SS the C++ scope specifier as it appears in the source
71///
72/// \param EnteringContext when true, we will be entering the context of
73/// this scope specifier, so we can retrieve the declaration context of a
74/// class template or class template partial specialization even if it is
75/// not the current instantiation.
76///
77/// \returns the declaration context represented by the scope specifier @p SS,
78/// or NULL if the declaration context cannot be computed (e.g., because it is
79/// dependent and not the current instantiation).
80DeclContext *Sema::computeDeclContext(const CXXScopeSpec &SS,
81 bool EnteringContext) {
Douglas Gregore4e5b052009-03-19 00:18:19 +000082 if (!SS.isSet() || SS.isInvalid())
Douglas Gregorca5e77f2009-03-18 00:36:05 +000083 return 0;
Douglas Gregorca5e77f2009-03-18 00:36:05 +000084
Mike Stump1eb44332009-09-09 15:08:12 +000085 NestedNameSpecifier *NNS
Douglas Gregor35073692009-03-26 23:56:24 +000086 = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
Douglas Gregor42af25f2009-05-11 19:58:34 +000087 if (NNS->isDependent()) {
88 // If this nested-name-specifier refers to the current
89 // instantiation, return its DeclContext.
90 if (CXXRecordDecl *Record = getCurrentInstantiationOf(NNS))
91 return Record;
Mike Stump1eb44332009-09-09 15:08:12 +000092
Douglas Gregorf59a56e2009-07-21 23:53:31 +000093 if (EnteringContext) {
John McCall3cb0ebd2010-03-10 03:28:59 +000094 const Type *NNSType = NNS->getAsType();
95 if (!NNSType) {
96 // do nothing, fall out
97 } else if (const TemplateSpecializationType *SpecType
98 = NNSType->getAs<TemplateSpecializationType>()) {
Douglas Gregor495c35d2009-08-25 22:51:20 +000099 // We are entering the context of the nested name specifier, so try to
100 // match the nested name specifier to either a primary class template
101 // or a class template partial specialization.
Mike Stump1eb44332009-09-09 15:08:12 +0000102 if (ClassTemplateDecl *ClassTemplate
Douglas Gregorf59a56e2009-07-21 23:53:31 +0000103 = dyn_cast_or_null<ClassTemplateDecl>(
104 SpecType->getTemplateName().getAsTemplateDecl())) {
Douglas Gregorb88e8882009-07-30 17:40:51 +0000105 QualType ContextType
106 = Context.getCanonicalType(QualType(SpecType, 0));
107
Douglas Gregorf59a56e2009-07-21 23:53:31 +0000108 // If the type of the nested name specifier is the same as the
109 // injected class name of the named class template, we're entering
110 // into that class template definition.
John McCall3cb0ebd2010-03-10 03:28:59 +0000111 QualType Injected
Douglas Gregor24bae922010-07-08 18:37:38 +0000112 = ClassTemplate->getInjectedClassNameSpecialization();
Douglas Gregorb88e8882009-07-30 17:40:51 +0000113 if (Context.hasSameType(Injected, ContextType))
Douglas Gregorf59a56e2009-07-21 23:53:31 +0000114 return ClassTemplate->getTemplatedDecl();
Mike Stump1eb44332009-09-09 15:08:12 +0000115
Douglas Gregorb88e8882009-07-30 17:40:51 +0000116 // If the type of the nested name specifier is the same as the
117 // type of one of the class template's class template partial
118 // specializations, we're entering into the definition of that
119 // class template partial specialization.
120 if (ClassTemplatePartialSpecializationDecl *PartialSpec
121 = ClassTemplate->findPartialSpecialization(ContextType))
122 return PartialSpec;
Douglas Gregorf59a56e2009-07-21 23:53:31 +0000123 }
John McCall3cb0ebd2010-03-10 03:28:59 +0000124 } else if (const RecordType *RecordT = NNSType->getAs<RecordType>()) {
Douglas Gregor495c35d2009-08-25 22:51:20 +0000125 // The nested name specifier refers to a member of a class template.
126 return RecordT->getDecl();
Douglas Gregorf59a56e2009-07-21 23:53:31 +0000127 }
128 }
Mike Stump1eb44332009-09-09 15:08:12 +0000129
Douglas Gregorf59a56e2009-07-21 23:53:31 +0000130 return 0;
Douglas Gregor42af25f2009-05-11 19:58:34 +0000131 }
Douglas Gregorab452ba2009-03-26 23:50:42 +0000132
133 switch (NNS->getKind()) {
134 case NestedNameSpecifier::Identifier:
135 assert(false && "Dependent nested-name-specifier has no DeclContext");
136 break;
137
138 case NestedNameSpecifier::Namespace:
139 return NNS->getAsNamespace();
140
141 case NestedNameSpecifier::TypeSpec:
142 case NestedNameSpecifier::TypeSpecWithTemplate: {
Douglas Gregoredc90502010-02-25 04:46:04 +0000143 const TagType *Tag = NNS->getAsType()->getAs<TagType>();
144 assert(Tag && "Non-tag type in nested-name-specifier");
145 return Tag->getDecl();
146 } break;
Douglas Gregorab452ba2009-03-26 23:50:42 +0000147
148 case NestedNameSpecifier::Global:
149 return Context.getTranslationUnitDecl();
150 }
151
Douglas Gregoredc90502010-02-25 04:46:04 +0000152 // Required to silence a GCC warning.
Douglas Gregorab452ba2009-03-26 23:50:42 +0000153 return 0;
Douglas Gregorca5e77f2009-03-18 00:36:05 +0000154}
155
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000156bool Sema::isDependentScopeSpecifier(const CXXScopeSpec &SS) {
157 if (!SS.isSet() || SS.isInvalid())
158 return false;
159
Mike Stump1eb44332009-09-09 15:08:12 +0000160 NestedNameSpecifier *NNS
Douglas Gregor35073692009-03-26 23:56:24 +0000161 = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
Douglas Gregorab452ba2009-03-26 23:50:42 +0000162 return NNS->isDependent();
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000163}
164
Douglas Gregor42af25f2009-05-11 19:58:34 +0000165// \brief Determine whether this C++ scope specifier refers to an
166// unknown specialization, i.e., a dependent type that is not the
167// current instantiation.
168bool Sema::isUnknownSpecialization(const CXXScopeSpec &SS) {
169 if (!isDependentScopeSpecifier(SS))
170 return false;
171
Mike Stump1eb44332009-09-09 15:08:12 +0000172 NestedNameSpecifier *NNS
Douglas Gregor42af25f2009-05-11 19:58:34 +0000173 = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
174 return getCurrentInstantiationOf(NNS) == 0;
175}
176
177/// \brief If the given nested name specifier refers to the current
178/// instantiation, return the declaration that corresponds to that
179/// current instantiation (C++0x [temp.dep.type]p1).
180///
181/// \param NNS a dependent nested name specifier.
182CXXRecordDecl *Sema::getCurrentInstantiationOf(NestedNameSpecifier *NNS) {
183 assert(getLangOptions().CPlusPlus && "Only callable in C++");
184 assert(NNS->isDependent() && "Only dependent nested-name-specifier allowed");
185
Douglas Gregorf59a56e2009-07-21 23:53:31 +0000186 if (!NNS->getAsType())
187 return 0;
Mike Stump1eb44332009-09-09 15:08:12 +0000188
Douglas Gregor1560def2009-07-31 18:32:42 +0000189 QualType T = QualType(NNS->getAsType(), 0);
Douglas Gregord9ea1802011-02-19 19:24:40 +0000190 return ::getCurrentInstantiationOf(T, CurContext);
Douglas Gregor42af25f2009-05-11 19:58:34 +0000191}
192
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000193/// \brief Require that the context specified by SS be complete.
194///
195/// If SS refers to a type, this routine checks whether the type is
196/// complete enough (or can be made complete enough) for name lookup
197/// into the DeclContext. A type that is not yet completed can be
198/// considered "complete enough" if it is a class/struct/union/enum
199/// that is currently being defined. Or, if we have a type that names
200/// a class template specialization that is not a complete type, we
201/// will attempt to instantiate that class template.
John McCall77bb1aa2010-05-01 00:40:08 +0000202bool Sema::RequireCompleteDeclContext(CXXScopeSpec &SS,
203 DeclContext *DC) {
204 assert(DC != 0 && "given null context");
Mike Stump1eb44332009-09-09 15:08:12 +0000205
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000206 if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
Douglas Gregora4e8c2a2010-02-05 04:39:02 +0000207 // If this is a dependent type, then we consider it complete.
208 if (Tag->isDependentContext())
209 return false;
210
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000211 // If we're currently defining this type, then lookup into the
212 // type is okay: don't complain that it isn't complete yet.
Ted Kremenek6217b802009-07-29 21:53:49 +0000213 const TagType *TagT = Context.getTypeDeclType(Tag)->getAs<TagType>();
John McCall3cb0ebd2010-03-10 03:28:59 +0000214 if (TagT && TagT->isBeingDefined())
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000215 return false;
216
217 // The type must be complete.
Jeffrey Yasskin9ab14542010-04-08 16:38:48 +0000218 if (RequireCompleteType(SS.getRange().getBegin(),
219 Context.getTypeDeclType(Tag),
220 PDiag(diag::err_incomplete_nested_name_spec)
John McCall77bb1aa2010-05-01 00:40:08 +0000221 << SS.getRange())) {
Jeffrey Yasskin9ab14542010-04-08 16:38:48 +0000222 SS.setScopeRep(0); // Mark the ScopeSpec invalid.
223 return true;
224 }
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000225 }
226
227 return false;
228}
Cedric Venet3d658642009-02-14 20:20:19 +0000229
230/// ActOnCXXGlobalScopeSpecifier - Return the object that represents the
231/// global scope ('::').
232Sema::CXXScopeTy *Sema::ActOnCXXGlobalScopeSpecifier(Scope *S,
233 SourceLocation CCLoc) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000234 return NestedNameSpecifier::GlobalSpecifier(Context);
Cedric Venet3d658642009-02-14 20:20:19 +0000235}
236
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000237/// \brief Determines whether the given declaration is an valid acceptable
238/// result for name lookup of a nested-name-specifier.
Douglas Gregoredc90502010-02-25 04:46:04 +0000239bool Sema::isAcceptableNestedNameSpecifier(NamedDecl *SD) {
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000240 if (!SD)
241 return false;
Mike Stump1eb44332009-09-09 15:08:12 +0000242
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000243 // Namespace and namespace aliases are fine.
244 if (isa<NamespaceDecl>(SD) || isa<NamespaceAliasDecl>(SD))
245 return true;
Mike Stump1eb44332009-09-09 15:08:12 +0000246
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000247 if (!isa<TypeDecl>(SD))
248 return false;
Mike Stump1eb44332009-09-09 15:08:12 +0000249
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000250 // Determine whether we have a class (or, in C++0x, an enum) or
251 // a typedef thereof. If so, build the nested-name-specifier.
252 QualType T = Context.getTypeDeclType(cast<TypeDecl>(SD));
253 if (T->isDependentType())
254 return true;
255 else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(SD)) {
256 if (TD->getUnderlyingType()->isRecordType() ||
Mike Stump1eb44332009-09-09 15:08:12 +0000257 (Context.getLangOptions().CPlusPlus0x &&
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000258 TD->getUnderlyingType()->isEnumeralType()))
259 return true;
Mike Stump1eb44332009-09-09 15:08:12 +0000260 } else if (isa<RecordDecl>(SD) ||
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000261 (Context.getLangOptions().CPlusPlus0x && isa<EnumDecl>(SD)))
262 return true;
263
264 return false;
265}
266
Douglas Gregorc68afe22009-09-03 21:38:09 +0000267/// \brief If the given nested-name-specifier begins with a bare identifier
Mike Stump1eb44332009-09-09 15:08:12 +0000268/// (e.g., Base::), perform name lookup for that identifier as a
Douglas Gregorc68afe22009-09-03 21:38:09 +0000269/// nested-name-specifier within the given scope, and return the result of that
270/// name lookup.
271NamedDecl *Sema::FindFirstQualifierInScope(Scope *S, NestedNameSpecifier *NNS) {
272 if (!S || !NNS)
273 return 0;
Mike Stump1eb44332009-09-09 15:08:12 +0000274
Douglas Gregorc68afe22009-09-03 21:38:09 +0000275 while (NNS->getPrefix())
276 NNS = NNS->getPrefix();
Mike Stump1eb44332009-09-09 15:08:12 +0000277
Douglas Gregorc68afe22009-09-03 21:38:09 +0000278 if (NNS->getKind() != NestedNameSpecifier::Identifier)
279 return 0;
Mike Stump1eb44332009-09-09 15:08:12 +0000280
John McCalla24dc2e2009-11-17 02:14:36 +0000281 LookupResult Found(*this, NNS->getAsIdentifier(), SourceLocation(),
282 LookupNestedNameSpecifierName);
283 LookupName(Found, S);
Douglas Gregorc68afe22009-09-03 21:38:09 +0000284 assert(!Found.isAmbiguous() && "Cannot handle ambiguities here yet");
285
John McCall1bcee0a2009-12-02 08:25:40 +0000286 if (!Found.isSingleResult())
287 return 0;
288
289 NamedDecl *Result = Found.getFoundDecl();
Douglas Gregoredc90502010-02-25 04:46:04 +0000290 if (isAcceptableNestedNameSpecifier(Result))
Douglas Gregorc68afe22009-09-03 21:38:09 +0000291 return Result;
Mike Stump1eb44332009-09-09 15:08:12 +0000292
Douglas Gregorc68afe22009-09-03 21:38:09 +0000293 return 0;
294}
295
Jeffrey Yasskin9ab14542010-04-08 16:38:48 +0000296bool Sema::isNonTypeNestedNameSpecifier(Scope *S, CXXScopeSpec &SS,
Douglas Gregor77549082010-02-24 21:29:12 +0000297 SourceLocation IdLoc,
298 IdentifierInfo &II,
John McCallb3d87482010-08-24 05:47:05 +0000299 ParsedType ObjectTypePtr) {
Douglas Gregor77549082010-02-24 21:29:12 +0000300 QualType ObjectType = GetTypeFromParser(ObjectTypePtr);
301 LookupResult Found(*this, &II, IdLoc, LookupNestedNameSpecifierName);
302
303 // Determine where to perform name lookup
304 DeclContext *LookupCtx = 0;
305 bool isDependent = false;
306 if (!ObjectType.isNull()) {
307 // This nested-name-specifier occurs in a member access expression, e.g.,
308 // x->B::f, and we are looking into the type of the object.
309 assert(!SS.isSet() && "ObjectType and scope specifier cannot coexist");
310 LookupCtx = computeDeclContext(ObjectType);
311 isDependent = ObjectType->isDependentType();
312 } else if (SS.isSet()) {
313 // This nested-name-specifier occurs after another nested-name-specifier,
314 // so long into the context associated with the prior nested-name-specifier.
315 LookupCtx = computeDeclContext(SS, false);
316 isDependent = isDependentScopeSpecifier(SS);
317 Found.setContextRange(SS.getRange());
318 }
319
320 if (LookupCtx) {
321 // Perform "qualified" name lookup into the declaration context we
322 // computed, which is either the type of the base of a member access
323 // expression or the declaration context associated with a prior
324 // nested-name-specifier.
325
326 // The declaration context must be complete.
John McCall77bb1aa2010-05-01 00:40:08 +0000327 if (!LookupCtx->isDependentContext() &&
328 RequireCompleteDeclContext(SS, LookupCtx))
Douglas Gregor77549082010-02-24 21:29:12 +0000329 return false;
330
331 LookupQualifiedName(Found, LookupCtx);
332 } else if (isDependent) {
333 return false;
334 } else {
335 LookupName(Found, S);
336 }
337 Found.suppressDiagnostics();
338
339 if (NamedDecl *ND = Found.getAsSingle<NamedDecl>())
340 return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND);
341
342 return false;
343}
344
Douglas Gregorc68afe22009-09-03 21:38:09 +0000345/// \brief Build a new nested-name-specifier for "identifier::", as described
346/// by ActOnCXXNestedNameSpecifier.
347///
348/// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
349/// that it contains an extra parameter \p ScopeLookupResult, which provides
350/// the result of name lookup within the scope of the nested-name-specifier
Douglas Gregora6e51992009-12-30 16:01:52 +0000351/// that was computed at template definition time.
Chris Lattner46646492009-12-07 01:36:53 +0000352///
353/// If ErrorRecoveryLookup is true, then this call is used to improve error
354/// recovery. This means that it should not emit diagnostics, it should
355/// just return null on failure. It also means it should only return a valid
356/// scope if it *knows* that the result is correct. It should not return in a
357/// dependent context, for example.
Douglas Gregorc68afe22009-09-03 21:38:09 +0000358Sema::CXXScopeTy *Sema::BuildCXXNestedNameSpecifier(Scope *S,
Jeffrey Yasskin9ab14542010-04-08 16:38:48 +0000359 CXXScopeSpec &SS,
Cedric Venet3d658642009-02-14 20:20:19 +0000360 SourceLocation IdLoc,
361 SourceLocation CCLoc,
Douglas Gregor495c35d2009-08-25 22:51:20 +0000362 IdentifierInfo &II,
Douglas Gregorc68afe22009-09-03 21:38:09 +0000363 QualType ObjectType,
364 NamedDecl *ScopeLookupResult,
Chris Lattner46646492009-12-07 01:36:53 +0000365 bool EnteringContext,
366 bool ErrorRecoveryLookup) {
Mike Stump1eb44332009-09-09 15:08:12 +0000367 NestedNameSpecifier *Prefix
Douglas Gregor35073692009-03-26 23:56:24 +0000368 = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
Mike Stump1eb44332009-09-09 15:08:12 +0000369
John McCalla24dc2e2009-11-17 02:14:36 +0000370 LookupResult Found(*this, &II, IdLoc, LookupNestedNameSpecifierName);
371
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000372 // Determine where to perform name lookup
373 DeclContext *LookupCtx = 0;
374 bool isDependent = false;
Douglas Gregorc68afe22009-09-03 21:38:09 +0000375 if (!ObjectType.isNull()) {
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000376 // This nested-name-specifier occurs in a member access expression, e.g.,
377 // x->B::f, and we are looking into the type of the object.
378 assert(!SS.isSet() && "ObjectType and scope specifier cannot coexist");
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000379 LookupCtx = computeDeclContext(ObjectType);
380 isDependent = ObjectType->isDependentType();
381 } else if (SS.isSet()) {
382 // This nested-name-specifier occurs after another nested-name-specifier,
383 // so long into the context associated with the prior nested-name-specifier.
384 LookupCtx = computeDeclContext(SS, EnteringContext);
385 isDependent = isDependentScopeSpecifier(SS);
John McCalla24dc2e2009-11-17 02:14:36 +0000386 Found.setContextRange(SS.getRange());
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000387 }
Mike Stump1eb44332009-09-09 15:08:12 +0000388
John McCalla24dc2e2009-11-17 02:14:36 +0000389
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000390 bool ObjectTypeSearchedInScope = false;
391 if (LookupCtx) {
Mike Stump1eb44332009-09-09 15:08:12 +0000392 // Perform "qualified" name lookup into the declaration context we
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000393 // computed, which is either the type of the base of a member access
Mike Stump1eb44332009-09-09 15:08:12 +0000394 // expression or the declaration context associated with a prior
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000395 // nested-name-specifier.
Mike Stump1eb44332009-09-09 15:08:12 +0000396
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000397 // The declaration context must be complete.
John McCall77bb1aa2010-05-01 00:40:08 +0000398 if (!LookupCtx->isDependentContext() &&
399 RequireCompleteDeclContext(SS, LookupCtx))
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000400 return 0;
Mike Stump1eb44332009-09-09 15:08:12 +0000401
John McCalla24dc2e2009-11-17 02:14:36 +0000402 LookupQualifiedName(Found, LookupCtx);
Mike Stump1eb44332009-09-09 15:08:12 +0000403
John McCalla24dc2e2009-11-17 02:14:36 +0000404 if (!ObjectType.isNull() && Found.empty()) {
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000405 // C++ [basic.lookup.classref]p4:
406 // If the id-expression in a class member access is a qualified-id of
Mike Stump1eb44332009-09-09 15:08:12 +0000407 // the form
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000408 //
409 // class-name-or-namespace-name::...
410 //
Mike Stump1eb44332009-09-09 15:08:12 +0000411 // the class-name-or-namespace-name following the . or -> operator is
412 // looked up both in the context of the entire postfix-expression and in
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000413 // the scope of the class of the object expression. If the name is found
Mike Stump1eb44332009-09-09 15:08:12 +0000414 // only in the scope of the class of the object expression, the name
415 // shall refer to a class-name. If the name is found only in the
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000416 // context of the entire postfix-expression, the name shall refer to a
417 // class-name or namespace-name. [...]
418 //
419 // Qualified name lookup into a class will not find a namespace-name,
Mike Stump1eb44332009-09-09 15:08:12 +0000420 // so we do not need to diagnoste that case specifically. However,
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000421 // this qualified name lookup may find nothing. In that case, perform
Mike Stump1eb44332009-09-09 15:08:12 +0000422 // unqualified name lookup in the given scope (if available) or
Douglas Gregorc68afe22009-09-03 21:38:09 +0000423 // reconstruct the result from when name lookup was performed at template
424 // definition time.
425 if (S)
John McCalla24dc2e2009-11-17 02:14:36 +0000426 LookupName(Found, S);
John McCallf36e02d2009-10-09 21:13:30 +0000427 else if (ScopeLookupResult)
428 Found.addDecl(ScopeLookupResult);
Mike Stump1eb44332009-09-09 15:08:12 +0000429
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000430 ObjectTypeSearchedInScope = true;
431 }
Douglas Gregorac7cbd82010-07-28 14:49:07 +0000432 } else if (!isDependent) {
433 // Perform unqualified name lookup in the current scope.
434 LookupName(Found, S);
435 }
436
437 // If we performed lookup into a dependent context and did not find anything,
438 // that's fine: just build a dependent nested-name-specifier.
439 if (Found.empty() && isDependent &&
440 !(LookupCtx && LookupCtx->isRecord() &&
441 (!cast<CXXRecordDecl>(LookupCtx)->hasDefinition() ||
442 !cast<CXXRecordDecl>(LookupCtx)->hasAnyDependentBases()))) {
Chris Lattner46646492009-12-07 01:36:53 +0000443 // Don't speculate if we're just trying to improve error recovery.
444 if (ErrorRecoveryLookup)
445 return 0;
446
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000447 // We were not able to compute the declaration context for a dependent
Mike Stump1eb44332009-09-09 15:08:12 +0000448 // base object type or prior nested-name-specifier, so this
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000449 // nested-name-specifier refers to an unknown specialization. Just build
450 // a dependent nested-name-specifier.
Douglas Gregor2700dcd2009-09-02 23:58:38 +0000451 if (!Prefix)
452 return NestedNameSpecifier::Create(Context, &II);
Mike Stump1eb44332009-09-09 15:08:12 +0000453
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000454 return NestedNameSpecifier::Create(Context, Prefix, &II);
Douglas Gregorac7cbd82010-07-28 14:49:07 +0000455 }
456
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000457 // FIXME: Deal with ambiguities cleanly.
Douglas Gregor175a6562009-12-31 08:26:35 +0000458
459 if (Found.empty() && !ErrorRecoveryLookup) {
460 // We haven't found anything, and we're not recovering from a
461 // different kind of error, so look for typos.
462 DeclarationName Name = Found.getLookupName();
Douglas Gregoraaf87162010-04-14 20:04:41 +0000463 if (CorrectTypo(Found, S, &SS, LookupCtx, EnteringContext,
464 CTC_NoKeywords) &&
Douglas Gregor175a6562009-12-31 08:26:35 +0000465 Found.isSingleResult() &&
Douglas Gregoredc90502010-02-25 04:46:04 +0000466 isAcceptableNestedNameSpecifier(Found.getAsSingle<NamedDecl>())) {
Douglas Gregor175a6562009-12-31 08:26:35 +0000467 if (LookupCtx)
468 Diag(Found.getNameLoc(), diag::err_no_member_suggest)
469 << Name << LookupCtx << Found.getLookupName() << SS.getRange()
Douglas Gregor849b2432010-03-31 17:46:05 +0000470 << FixItHint::CreateReplacement(Found.getNameLoc(),
471 Found.getLookupName().getAsString());
Douglas Gregor175a6562009-12-31 08:26:35 +0000472 else
473 Diag(Found.getNameLoc(), diag::err_undeclared_var_use_suggest)
474 << Name << Found.getLookupName()
Douglas Gregor849b2432010-03-31 17:46:05 +0000475 << FixItHint::CreateReplacement(Found.getNameLoc(),
476 Found.getLookupName().getAsString());
Douglas Gregor67dd1d42010-01-07 00:17:44 +0000477
478 if (NamedDecl *ND = Found.getAsSingle<NamedDecl>())
479 Diag(ND->getLocation(), diag::note_previous_decl)
480 << ND->getDeclName();
Douglas Gregor12eb5d62010-06-29 19:27:42 +0000481 } else {
Douglas Gregor175a6562009-12-31 08:26:35 +0000482 Found.clear();
Douglas Gregor12eb5d62010-06-29 19:27:42 +0000483 Found.setLookupName(&II);
484 }
Douglas Gregor175a6562009-12-31 08:26:35 +0000485 }
486
John McCall1bcee0a2009-12-02 08:25:40 +0000487 NamedDecl *SD = Found.getAsSingle<NamedDecl>();
Douglas Gregoredc90502010-02-25 04:46:04 +0000488 if (isAcceptableNestedNameSpecifier(SD)) {
Douglas Gregorc68afe22009-09-03 21:38:09 +0000489 if (!ObjectType.isNull() && !ObjectTypeSearchedInScope) {
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000490 // C++ [basic.lookup.classref]p4:
Mike Stump1eb44332009-09-09 15:08:12 +0000491 // [...] If the name is found in both contexts, the
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000492 // class-name-or-namespace-name shall refer to the same entity.
493 //
494 // We already found the name in the scope of the object. Now, look
495 // into the current scope (the scope of the postfix-expression) to
Douglas Gregorc68afe22009-09-03 21:38:09 +0000496 // see if we can find the same name there. As above, if there is no
497 // scope, reconstruct the result from the template instantiation itself.
John McCallf36e02d2009-10-09 21:13:30 +0000498 NamedDecl *OuterDecl;
499 if (S) {
Douglas Gregoredc90502010-02-25 04:46:04 +0000500 LookupResult FoundOuter(*this, &II, IdLoc, LookupNestedNameSpecifierName);
John McCalla24dc2e2009-11-17 02:14:36 +0000501 LookupName(FoundOuter, S);
John McCall1bcee0a2009-12-02 08:25:40 +0000502 OuterDecl = FoundOuter.getAsSingle<NamedDecl>();
John McCallf36e02d2009-10-09 21:13:30 +0000503 } else
504 OuterDecl = ScopeLookupResult;
Mike Stump1eb44332009-09-09 15:08:12 +0000505
Douglas Gregoredc90502010-02-25 04:46:04 +0000506 if (isAcceptableNestedNameSpecifier(OuterDecl) &&
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000507 OuterDecl->getCanonicalDecl() != SD->getCanonicalDecl() &&
508 (!isa<TypeDecl>(OuterDecl) || !isa<TypeDecl>(SD) ||
509 !Context.hasSameType(
Douglas Gregorc68afe22009-09-03 21:38:09 +0000510 Context.getTypeDeclType(cast<TypeDecl>(OuterDecl)),
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000511 Context.getTypeDeclType(cast<TypeDecl>(SD))))) {
Chris Lattner46646492009-12-07 01:36:53 +0000512 if (ErrorRecoveryLookup)
513 return 0;
514
Douglas Gregorc68afe22009-09-03 21:38:09 +0000515 Diag(IdLoc, diag::err_nested_name_member_ref_lookup_ambiguous)
516 << &II;
517 Diag(SD->getLocation(), diag::note_ambig_member_ref_object_type)
518 << ObjectType;
519 Diag(OuterDecl->getLocation(), diag::note_ambig_member_ref_scope);
Mike Stump1eb44332009-09-09 15:08:12 +0000520
Chris Lattner46646492009-12-07 01:36:53 +0000521 // Fall through so that we'll pick the name we found in the object
522 // type, since that's probably what the user wanted anyway.
Douglas Gregorc68afe22009-09-03 21:38:09 +0000523 }
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000524 }
Mike Stump1eb44332009-09-09 15:08:12 +0000525
Douglas Gregorab452ba2009-03-26 23:50:42 +0000526 if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(SD))
527 return NestedNameSpecifier::Create(Context, Prefix, Namespace);
Mike Stump1eb44332009-09-09 15:08:12 +0000528
Douglas Gregordacd4342009-08-26 00:04:55 +0000529 // FIXME: It would be nice to maintain the namespace alias name, then
530 // see through that alias when resolving the nested-name-specifier down to
531 // a declaration context.
Anders Carlsson81c85c42009-03-28 23:53:49 +0000532 if (NamespaceAliasDecl *Alias = dyn_cast<NamespaceAliasDecl>(SD))
533 return NestedNameSpecifier::Create(Context, Prefix,
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000534 Alias->getNamespace());
Mike Stump1eb44332009-09-09 15:08:12 +0000535
Douglas Gregor2dd078a2009-09-02 22:59:36 +0000536 QualType T = Context.getTypeDeclType(cast<TypeDecl>(SD));
537 return NestedNameSpecifier::Create(Context, Prefix, false,
538 T.getTypePtr());
539 }
Mike Stump1eb44332009-09-09 15:08:12 +0000540
Chris Lattner46646492009-12-07 01:36:53 +0000541 // Otherwise, we have an error case. If we don't want diagnostics, just
542 // return an error now.
543 if (ErrorRecoveryLookup)
544 return 0;
545
Cedric Venet3d658642009-02-14 20:20:19 +0000546 // If we didn't find anything during our lookup, try again with
547 // ordinary name lookup, which can help us produce better error
548 // messages.
John McCall1bcee0a2009-12-02 08:25:40 +0000549 if (Found.empty()) {
John McCalla24dc2e2009-11-17 02:14:36 +0000550 Found.clear(LookupOrdinaryName);
551 LookupName(Found, S);
John McCallf36e02d2009-10-09 21:13:30 +0000552 }
Mike Stump1eb44332009-09-09 15:08:12 +0000553
Cedric Venet3d658642009-02-14 20:20:19 +0000554 unsigned DiagID;
John McCall1bcee0a2009-12-02 08:25:40 +0000555 if (!Found.empty())
Cedric Venet3d658642009-02-14 20:20:19 +0000556 DiagID = diag::err_expected_class_or_namespace;
Anders Carlssona31d5f72009-08-30 07:09:50 +0000557 else if (SS.isSet()) {
Douglas Gregor3f093272009-10-13 21:16:44 +0000558 Diag(IdLoc, diag::err_no_member) << &II << LookupCtx << SS.getRange();
Anders Carlssona31d5f72009-08-30 07:09:50 +0000559 return 0;
560 } else
Cedric Venet3d658642009-02-14 20:20:19 +0000561 DiagID = diag::err_undeclared_var_use;
Mike Stump1eb44332009-09-09 15:08:12 +0000562
Cedric Venet3d658642009-02-14 20:20:19 +0000563 if (SS.isSet())
564 Diag(IdLoc, DiagID) << &II << SS.getRange();
565 else
566 Diag(IdLoc, DiagID) << &II;
Mike Stump1eb44332009-09-09 15:08:12 +0000567
Cedric Venet3d658642009-02-14 20:20:19 +0000568 return 0;
569}
570
Douglas Gregorc68afe22009-09-03 21:38:09 +0000571/// ActOnCXXNestedNameSpecifier - Called during parsing of a
572/// nested-name-specifier. e.g. for "foo::bar::" we parsed "foo::" and now
573/// we want to resolve "bar::". 'SS' is empty or the previously parsed
574/// nested-name part ("foo::"), 'IdLoc' is the source location of 'bar',
575/// 'CCLoc' is the location of '::' and 'II' is the identifier for 'bar'.
576/// Returns a CXXScopeTy* object representing the C++ scope.
577Sema::CXXScopeTy *Sema::ActOnCXXNestedNameSpecifier(Scope *S,
Jeffrey Yasskin9ab14542010-04-08 16:38:48 +0000578 CXXScopeSpec &SS,
Douglas Gregorc68afe22009-09-03 21:38:09 +0000579 SourceLocation IdLoc,
580 SourceLocation CCLoc,
581 IdentifierInfo &II,
John McCallb3d87482010-08-24 05:47:05 +0000582 ParsedType ObjectTypePtr,
Douglas Gregorc68afe22009-09-03 21:38:09 +0000583 bool EnteringContext) {
Mike Stump1eb44332009-09-09 15:08:12 +0000584 return BuildCXXNestedNameSpecifier(S, SS, IdLoc, CCLoc, II,
John McCallb3d87482010-08-24 05:47:05 +0000585 GetTypeFromParser(ObjectTypePtr),
Chris Lattner46646492009-12-07 01:36:53 +0000586 /*ScopeLookupResult=*/0, EnteringContext,
587 false);
588}
589
590/// IsInvalidUnlessNestedName - This method is used for error recovery
591/// purposes to determine whether the specified identifier is only valid as
592/// a nested name specifier, for example a namespace name. It is
593/// conservatively correct to always return false from this method.
594///
595/// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
Jeffrey Yasskin9ab14542010-04-08 16:38:48 +0000596bool Sema::IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS,
John McCallb3d87482010-08-24 05:47:05 +0000597 IdentifierInfo &II, ParsedType ObjectType,
Chris Lattner46646492009-12-07 01:36:53 +0000598 bool EnteringContext) {
599 return BuildCXXNestedNameSpecifier(S, SS, SourceLocation(), SourceLocation(),
John McCallb3d87482010-08-24 05:47:05 +0000600 II, GetTypeFromParser(ObjectType),
Chris Lattner46646492009-12-07 01:36:53 +0000601 /*ScopeLookupResult=*/0, EnteringContext,
602 true);
Douglas Gregorc68afe22009-09-03 21:38:09 +0000603}
604
Douglas Gregor39a8de12009-02-25 19:37:18 +0000605Sema::CXXScopeTy *Sema::ActOnCXXNestedNameSpecifier(Scope *S,
606 const CXXScopeSpec &SS,
John McCallb3d87482010-08-24 05:47:05 +0000607 ParsedType Ty,
Douglas Gregor39a8de12009-02-25 19:37:18 +0000608 SourceRange TypeRange,
Douglas Gregoredc90502010-02-25 04:46:04 +0000609 SourceLocation CCLoc) {
John McCallb3d87482010-08-24 05:47:05 +0000610 NestedNameSpecifier *Prefix = SS.getScopeRep();
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000611 QualType T = GetTypeFromParser(Ty);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000612 return NestedNameSpecifier::Create(Context, Prefix, /*FIXME:*/false,
Douglas Gregor3f5b61c2009-05-14 00:28:11 +0000613 T.getTypePtr());
Douglas Gregor39a8de12009-02-25 19:37:18 +0000614}
615
John McCalle7e278b2009-12-11 20:04:54 +0000616bool Sema::ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS) {
617 assert(SS.isSet() && "Parser passed invalid CXXScopeSpec.");
618
619 NestedNameSpecifier *Qualifier =
620 static_cast<NestedNameSpecifier*>(SS.getScopeRep());
621
622 // There are only two places a well-formed program may qualify a
623 // declarator: first, when defining a namespace or class member
624 // out-of-line, and second, when naming an explicitly-qualified
625 // friend function. The latter case is governed by
626 // C++03 [basic.lookup.unqual]p10:
627 // In a friend declaration naming a member function, a name used
628 // in the function declarator and not part of a template-argument
629 // in a template-id is first looked up in the scope of the member
630 // function's class. If it is not found, or if the name is part of
631 // a template-argument in a template-id, the look up is as
632 // described for unqualified names in the definition of the class
633 // granting friendship.
634 // i.e. we don't push a scope unless it's a class member.
635
636 switch (Qualifier->getKind()) {
637 case NestedNameSpecifier::Global:
638 case NestedNameSpecifier::Namespace:
639 // These are always namespace scopes. We never want to enter a
640 // namespace scope from anything but a file context.
Sebastian Redl7a126a42010-08-31 00:36:30 +0000641 return CurContext->getRedeclContext()->isFileContext();
John McCalle7e278b2009-12-11 20:04:54 +0000642
643 case NestedNameSpecifier::Identifier:
644 case NestedNameSpecifier::TypeSpec:
645 case NestedNameSpecifier::TypeSpecWithTemplate:
646 // These are never namespace scopes.
647 return true;
648 }
649
650 // Silence bogus warning.
651 return false;
652}
653
Cedric Venet3d658642009-02-14 20:20:19 +0000654/// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
655/// scope or nested-name-specifier) is parsed, part of a declarator-id.
656/// After this method is called, according to [C++ 3.4.3p3], names should be
657/// looked up in the declarator-id's scope, until the declarator is parsed and
658/// ActOnCXXExitDeclaratorScope is called.
659/// The 'SS' should be a non-empty valid CXXScopeSpec.
Jeffrey Yasskin9ab14542010-04-08 16:38:48 +0000660bool Sema::ActOnCXXEnterDeclaratorScope(Scope *S, CXXScopeSpec &SS) {
Cedric Venet3d658642009-02-14 20:20:19 +0000661 assert(SS.isSet() && "Parser passed invalid CXXScopeSpec.");
John McCall7a1dc562009-12-19 10:49:29 +0000662
663 if (SS.isInvalid()) return true;
664
665 DeclContext *DC = computeDeclContext(SS, true);
666 if (!DC) return true;
667
668 // Before we enter a declarator's context, we need to make sure that
669 // it is a complete declaration context.
John McCall77bb1aa2010-05-01 00:40:08 +0000670 if (!DC->isDependentContext() && RequireCompleteDeclContext(SS, DC))
John McCall7a1dc562009-12-19 10:49:29 +0000671 return true;
672
673 EnterDeclaratorContext(S, DC);
John McCall31f17ec2010-04-27 00:57:59 +0000674
675 // Rebuild the nested name specifier for the new scope.
676 if (DC->isDependentContext())
677 RebuildNestedNameSpecifierInCurrentInstantiation(SS);
678
Douglas Gregor7dfd0fb2009-09-24 23:39:01 +0000679 return false;
Cedric Venet3d658642009-02-14 20:20:19 +0000680}
681
682/// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
683/// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
684/// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
685/// Used to indicate that names should revert to being looked up in the
686/// defining scope.
687void Sema::ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS) {
688 assert(SS.isSet() && "Parser passed invalid CXXScopeSpec.");
Douglas Gregordacd4342009-08-26 00:04:55 +0000689 if (SS.isInvalid())
690 return;
John McCall7a1dc562009-12-19 10:49:29 +0000691 assert(!SS.isInvalid() && computeDeclContext(SS, true) &&
692 "exiting declarator scope we never really entered");
693 ExitDeclaratorContext(S);
Cedric Venet3d658642009-02-14 20:20:19 +0000694}