SemaExprMember.cpp revision 3bad5b10cc05fe000340fc6e4efc4d8b9af0a62c
12b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor//===--- SemaExprMember.cpp - Semantic Analysis for Expressions -----------===// 22b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// 32b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// The LLVM Compiler Infrastructure 42b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// 52b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// This file is distributed under the University of Illinois Open Source 62b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// License. See LICENSE.TXT for details. 72b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// 82b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor//===----------------------------------------------------------------------===// 92b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// 102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// This file implements semantic analysis member access expressions. 112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// 122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor//===----------------------------------------------------------------------===// 132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/Sema/SemaInternal.h" 142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/Sema/Lookup.h" 152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/Sema/Scope.h" 162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/AST/DeclCXX.h" 172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/AST/DeclObjC.h" 182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/AST/DeclTemplate.h" 192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/AST/ExprCXX.h" 202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/AST/ExprObjC.h" 212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor#include "clang/Lex/Preprocessor.h" 222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorusing namespace clang; 242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorusing namespace sema; 252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// Determines if the given class is provably not derived from all of 272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// the prospective base classes. 282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic bool IsProvablyNotDerivedFrom(Sema &SemaRef, 292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXRecordDecl *Record, 302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const llvm::SmallPtrSet<CXXRecordDecl*, 4> &Bases) { 312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Bases.count(Record->getCanonicalDecl())) 322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor RecordDecl *RD = Record->getDefinition(); 352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!RD) return false; 362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Record = cast<CXXRecordDecl>(RD); 372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor for (CXXRecordDecl::base_class_iterator I = Record->bases_begin(), 392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor E = Record->bases_end(); I != E; ++I) { 402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CanQualType BaseT = SemaRef.Context.getCanonicalType((*I).getType()); 412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CanQual<RecordType> BaseRT = BaseT->getAs<RecordType>(); 422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!BaseRT) return false; 432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl()); 452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IsProvablyNotDerivedFrom(SemaRef, BaseRecord, Bases)) 462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return true; 502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorenum IMAKind { 532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// The reference is definitely not an instance member access. 542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Static, 552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// The reference may be an implicit instance member access. 572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Mixed, 582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// The reference may be to an instance member, but it is invalid if 602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// so, because the context is not an instance method. 612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Mixed_StaticContext, 622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// The reference may be to an instance member, but it is invalid if 642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// so, because the context is from an unrelated class. 652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Mixed_Unrelated, 662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// The reference is definitely an implicit instance member access. 682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Instance, 692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// The reference may be to an unresolved using declaration. 712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Unresolved, 722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// The reference may be to an unresolved using declaration and the 742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// context is not an instance method. 752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Unresolved_StaticContext, 762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// All possible referrents are instance members and the current 782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// context is not an instance method. 792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Error_StaticContext, 802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// All possible referrents are instance members of an unrelated 822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /// class. 832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IMA_Error_Unrelated 842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor}; 852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// The given lookup names class member(s) and is not being used for 872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// an address-of-member expression. Classify the type of access 882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// according to whether it's possible that this reference names an 892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// instance member. This is best-effort; it is okay to 902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// conservatively answer "yes", in which case some errors will simply 912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// not be caught until template-instantiation. 922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef, 932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Scope *CurScope, 942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const LookupResult &R) { 952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(!R.empty() && (*R.begin())->isCXXClassMember()); 962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclContext *DC = SemaRef.getFunctionLevelDeclContext(); 982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool isStaticContext = 1002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor (!isa<CXXMethodDecl>(DC) || 1012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor cast<CXXMethodDecl>(DC)->isStatic()); 1022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // C++0x [expr.prim]p4: 1042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Otherwise, if a member-declarator declares a non-static data member 1052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // of a class X, the expression this is a prvalue of type "pointer to X" 1062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // within the optional brace-or-equal-initializer. 1072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (CurScope->getFlags() & Scope::ThisScope) 1082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor isStaticContext = false; 1092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (R.isUnresolvableResult()) 1112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return isStaticContext ? IMA_Unresolved_StaticContext : IMA_Unresolved; 1122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Collect all the declaring classes of instance members we find. 1142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool hasNonInstance = false; 1152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool hasField = false; 1162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor llvm::SmallPtrSet<CXXRecordDecl*, 4> Classes; 1172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) { 1182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *D = *I; 1192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (D->isCXXInstanceMember()) { 1212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (dyn_cast<FieldDecl>(D)) 1222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor hasField = true; 1232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXRecordDecl *R = cast<CXXRecordDecl>(D->getDeclContext()); 1252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Classes.insert(R->getCanonicalDecl()); 1262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 1272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else 1282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor hasNonInstance = true; 1292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 1302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If we didn't find any instance members, it can't be an implicit 1322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // member reference. 1332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Classes.empty()) 1342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return IMA_Static; 1352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If the current context is not an instance method, it can't be 1372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // an implicit member reference. 1382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (isStaticContext) { 1392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (hasNonInstance) 1402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return IMA_Mixed_StaticContext; 1412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus0x && hasField) { 1432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // C++0x [expr.prim.general]p10: 1442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // An id-expression that denotes a non-static data member or non-static 1452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // member function of a class can only be used: 1462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // (...) 1472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // - if that id-expression denotes a non-static data member and it 1482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // appears in an unevaluated operand. 1492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const Sema::ExpressionEvaluationContextRecord& record 1502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = SemaRef.ExprEvalContexts.back(); 1512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool isUnevaluatedExpression = (record.Context == Sema::Unevaluated); 1522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (isUnevaluatedExpression) 1532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return IMA_Mixed_StaticContext; 1542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 1552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return IMA_Error_StaticContext; 1572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 1582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXRecordDecl *contextClass; 1602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) 1612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor contextClass = MD->getParent()->getCanonicalDecl(); 1622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else 1632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor contextClass = cast<CXXRecordDecl>(DC); 1642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // [class.mfct.non-static]p3: 1662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // ...is used in the body of a non-static member function of class X, 1672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // if name lookup (3.4.1) resolves the name in the id-expression to a 1682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // non-static non-type member of some class C [...] 1692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // ...if C is not X or a base class of X, the class member access expression 1702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // is ill-formed. 1712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (R.getNamingClass() && 1722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor contextClass != R.getNamingClass()->getCanonicalDecl() && 1732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor contextClass->isProvablyNotDerivedFrom(R.getNamingClass())) 1742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return (hasNonInstance ? IMA_Mixed_Unrelated : IMA_Error_Unrelated); 1752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If we can prove that the current context is unrelated to all the 1772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // declaring classes, it can't be an implicit member reference (in 1782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // which case it's an error if any of those members are selected). 1792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsProvablyNotDerivedFrom(SemaRef, contextClass, Classes)) 1802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return (hasNonInstance ? IMA_Mixed_Unrelated : IMA_Error_Unrelated); 1812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return (hasNonInstance ? IMA_Mixed : IMA_Instance); 1832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 1842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// Diagnose a reference to a field with no object available. 1862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic void DiagnoseInstanceReference(Sema &SemaRef, 1872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, 1882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *rep, 1892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &nameInfo) { 1902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation Loc = nameInfo.getLoc(); 1912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceRange Range(Loc); 1922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SS.isSet()) Range.setBegin(SS.getRange().getBegin()); 1932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (isa<FieldDecl>(rep) || isa<IndirectFieldDecl>(rep)) { 1952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) { 1962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (MD->isStatic()) { 1972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // "invalid use of member 'x' in static member function" 1982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.Diag(Loc, diag::err_invalid_member_use_in_static_method) 1992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << Range << nameInfo.getName(); 2002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return; 2012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 2022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 2032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.Diag(Loc, diag::err_invalid_non_static_member_use) 2052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << nameInfo.getName() << Range; 2062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return; 2072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 2082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.Diag(Loc, diag::err_member_call_without_object) << Range; 2102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 2112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// Builds an expression which might be an implicit member expression. 2132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult 2142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorSema::BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, 2152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupResult &R, 2162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const TemplateArgumentListInfo *TemplateArgs) { 2172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor switch (ClassifyImplicitMemberAccess(*this, CurScope, R)) { 2182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Instance: 2192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildImplicitMemberExpr(SS, R, TemplateArgs, true); 2202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Mixed: 2222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Mixed_Unrelated: 2232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Unresolved: 2242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildImplicitMemberExpr(SS, R, TemplateArgs, false); 2252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Static: 2272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Mixed_StaticContext: 2282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Unresolved_StaticContext: 2292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (TemplateArgs) 2302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildTemplateIdExpr(SS, R, false, *TemplateArgs); 2312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildDeclarationNameExpr(SS, R, false); 2322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Error_StaticContext: 2342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor case IMA_Error_Unrelated: 2352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DiagnoseInstanceReference(*this, SS, R.getRepresentativeDecl(), 2362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R.getLookupNameInfo()); 2372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 2382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 2392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor llvm_unreachable("unexpected instance member access kind"); 2412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 2422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 2432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2446fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines/// Determine whether input char is from rgba component set. 2456fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hinesstatic bool 2466fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen HinesIsRGBA(char c) { 2476fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines switch (c) { 2486fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines case 'r': 2496fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines case 'g': 2506fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines case 'b': 2516fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines case 'a': 2526fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines return true; 2536fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines default: 2546fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines return false; 2556fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines } 2566fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines} 2576fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines 2582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// Check an ext-vector component access expression. 2592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// 2602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// VK should be set in advance to the value kind of the base 2612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// expression. 2622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic QualType 2632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorCheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK, 2642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation OpLoc, const IdentifierInfo *CompName, 2652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation CompLoc) { 2662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: Share logic with ExtVectorElementExpr::containsDuplicateElements, 2672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // see FIXME there. 2682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // 2692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: This logic can be greatly simplified by splitting it along 2702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // halving/not halving and reworking the component checking. 2712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const ExtVectorType *vecType = baseType->getAs<ExtVectorType>(); 2722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // The vector accessor can't exceed the number of elements. 2742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const char *compStr = CompName->getNameStart(); 2752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // This flag determines whether or not the component is one of the four 2772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // special names that indicate a subset of exactly half the elements are 2782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // to be selected. 2792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool HalvingSwizzle = false; 2802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // This flag determines whether or not CompName has an 's' char prefix, 2822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // indicating that it is a string of hex values to be used as vector indices. 2832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool HexSwizzle = *compStr == 's' || *compStr == 'S'; 2842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool HasRepeated = false; 2862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool HasIndex[16] = {}; 2872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor int Idx; 2892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 2902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check that we've found one of the special components, or that the component 2912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // names must come from the same set. 2922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!strcmp(compStr, "hi") || !strcmp(compStr, "lo") || 2932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor !strcmp(compStr, "even") || !strcmp(compStr, "odd")) { 2942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor HalvingSwizzle = true; 2952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else if (!HexSwizzle && 2962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor (Idx = vecType->getPointAccessorIdx(*compStr)) != -1) { 2976fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines bool HasRGBA = IsRGBA(*compStr); 2982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor do { 2996fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines // If we mix/match rgba with xyzw, break to signal that we encountered 3006fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines // an illegal name. 3016fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines if (HasRGBA != IsRGBA(*compStr)) 3026fbdfec363f8c74e0a4fdb23fa3303cbf5b1fb49Stephen Hines break; 3032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (HasIndex[Idx]) HasRepeated = true; 3042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor HasIndex[Idx] = true; 3052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor compStr++; 3062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } while (*compStr && (Idx = vecType->getPointAccessorIdx(*compStr)) != -1); 3072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 3082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (HexSwizzle) compStr++; 3092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor while ((Idx = vecType->getNumericAccessorIdx(*compStr)) != -1) { 3102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (HasIndex[Idx]) HasRepeated = true; 3112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor HasIndex[Idx] = true; 3122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor compStr++; 3132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 3142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 3152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!HalvingSwizzle && *compStr) { 3172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // We didn't get to the end of the string. This means the component names 3182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // didn't come from the same set *or* we encountered an illegal name. 3192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor S.Diag(OpLoc, diag::err_ext_vector_component_name_illegal) 3205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner << StringRef(compStr, 1) << SourceRange(CompLoc); 3212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return QualType(); 3222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 3232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Ensure no component accessor exceeds the width of the vector type it 3252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // operates on. 3262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!HalvingSwizzle) { 3272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor compStr = CompName->getNameStart(); 3282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (HexSwizzle) 3302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor compStr++; 3312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor while (*compStr) { 3332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!vecType->isAccessorWithinNumElements(*compStr++)) { 3342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor S.Diag(OpLoc, diag::err_ext_vector_component_exceeds_length) 3352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << baseType << SourceRange(CompLoc); 3362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return QualType(); 3372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 3382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 3392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 3402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // The component accessor looks fine - now we need to compute the actual type. 3422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // The vector type is implied by the component accessor. For example, 3432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // vec4.b is a float, vec4.xy is a vec2, vec4.rgb is a vec3, etc. 3442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // vec4.s0 is a float, vec4.s23 is a vec3, etc. 3452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // vec4.hi, vec4.lo, vec4.e, and vec4.o all return vec2. 3462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor unsigned CompSize = HalvingSwizzle ? (vecType->getNumElements() + 1) / 2 3472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor : CompName->getLength(); 3482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (HexSwizzle) 3492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CompSize--; 3502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (CompSize == 1) 3522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return vecType->getElementType(); 3532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (HasRepeated) VK = VK_RValue; 3552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType VT = S.Context.getExtVectorType(vecType->getElementType(), CompSize); 3572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Now look up the TypeDefDecl from the vector type. Without this, 3582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // diagostics look bad. We want extended vector types to appear built-in. 359d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor for (Sema::ExtVectorDeclsType::iterator 360d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor I = S.ExtVectorDecls.begin(S.ExternalSource), 361d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor E = S.ExtVectorDecls.end(); 362d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor I != E; ++I) { 363d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor if ((*I)->getUnderlyingType() == VT) 364d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor return S.Context.getTypedefType(*I); 3652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 366d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor 3672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return VT; // should never get here (a typedef type should always be found). 3682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 3692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic Decl *FindGetterSetterNameDeclFromProtocolList(const ObjCProtocolDecl*PDecl, 3712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IdentifierInfo *Member, 3722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const Selector &Sel, 3732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ASTContext &Context) { 3742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Member) 3752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCPropertyDecl *PD = PDecl->FindPropertyDeclaration(Member)) 3762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return PD; 3772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCMethodDecl *OMD = PDecl->getInstanceMethod(Sel)) 3782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return OMD; 3792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor for (ObjCProtocolDecl::protocol_iterator I = PDecl->protocol_begin(), 3812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor E = PDecl->protocol_end(); I != E; ++I) { 3822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Decl *D = FindGetterSetterNameDeclFromProtocolList(*I, Member, Sel, 3832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Context)) 3842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return D; 3852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 3862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return 0; 3872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 3882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 3892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic Decl *FindGetterSetterNameDecl(const ObjCObjectPointerType *QIdTy, 3902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IdentifierInfo *Member, 3912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const Selector &Sel, 3922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ASTContext &Context) { 3932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check protocols on qualified interfaces. 3942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Decl *GDecl = 0; 3952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(), 3962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor E = QIdTy->qual_end(); I != E; ++I) { 3972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Member) 3982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) { 3992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor GDecl = PD; 4002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor break; 4012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 4022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Also must look for a getter or setter name which uses property syntax. 4032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCMethodDecl *OMD = (*I)->getInstanceMethod(Sel)) { 4042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor GDecl = OMD; 4052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor break; 4062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 4072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 4082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!GDecl) { 4092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(), 4102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor E = QIdTy->qual_end(); I != E; ++I) { 4112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Search in the protocol-qualifier list of current protocol. 4122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor GDecl = FindGetterSetterNameDeclFromProtocolList(*I, Member, Sel, 4132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Context); 4142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (GDecl) 4152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return GDecl; 4162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 4172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 4182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return GDecl; 4192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 4202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 4212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult 4222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorSema::ActOnDependentMemberExpr(Expr *BaseExpr, QualType BaseType, 4232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool IsArrow, SourceLocation OpLoc, 4242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, 4252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *FirstQualifierInScope, 4262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &NameInfo, 4272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const TemplateArgumentListInfo *TemplateArgs) { 4282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Even in dependent contexts, try to diagnose base expressions with 4292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // obviously wrong types, e.g.: 4302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // 4312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // T* t; 4322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // t.f; 4332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // 4342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // In Obj-C++, however, the above expression is valid, since it could be 4352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // accessing the 'f' property if T is an Obj-C interface. The extra check 4362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // allows this, while still reporting an error if T is a struct pointer. 4372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IsArrow) { 4382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const PointerType *PT = BaseType->getAs<PointerType>(); 4392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (PT && (!getLangOptions().ObjC1 || 4402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor PT->getPointeeType()->isRecordType())) { 4412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(BaseExpr && "cannot happen with implicit member accesses"); 4422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(NameInfo.getLoc(), diag::err_typecheck_member_reference_struct_union) 4432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << BaseType << BaseExpr->getSourceRange(); 4442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 4452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 4462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 4472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 4482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(BaseType->isDependentType() || 4492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NameInfo.getName().isDependentName() || 4502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor isDependentScopeSpecifier(SS)); 4512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 4522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Get the type being accessed in BaseType. If this is an arrow, the BaseExpr 4532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // must have pointer type, and the accessed type is the pointee. 4542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(CXXDependentScopeMemberExpr::Create(Context, BaseExpr, BaseType, 4552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IsArrow, OpLoc, 4562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS.getWithLocInContext(Context), 4572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor FirstQualifierInScope, 4582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NameInfo, TemplateArgs)); 4592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 4602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 4612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// We know that the given qualified member reference points only to 4622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// declarations which do not belong to the static type of the base 4632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// expression. Diagnose the problem. 4642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic void DiagnoseQualifiedMemberReference(Sema &SemaRef, 4652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Expr *BaseExpr, 4662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType BaseType, 4672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, 4682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *rep, 4692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &nameInfo) { 4702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If this is an implicit member access, use a different set of 4712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // diagnostics. 4722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!BaseExpr) 4732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return DiagnoseInstanceReference(SemaRef, SS, rep, nameInfo); 4742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 4752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.Diag(nameInfo.getLoc(), diag::err_qualified_member_of_unrelated) 4762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << SS.getRange() << rep << BaseType; 4772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 4782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 4792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// Check whether the declarations we found through a nested-name 4802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// specifier in a member expression are actually members of the base 4812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// type. The restriction here is: 4822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// 4832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// C++ [expr.ref]p2: 4842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// ... In these cases, the id-expression shall name a 4852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// member of the class or of one of its base classes. 4862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// 4872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// So it's perfectly legitimate for the nested-name specifier to name 4882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// an unrelated class, and for us to find an overload set including 4892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// decls from classes which are not superclasses, as long as the decl 4902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor// we actually pick through overload resolution is from a superclass. 4912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorbool Sema::CheckQualifiedMemberReference(Expr *BaseExpr, 4922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType BaseType, 4932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, 4942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const LookupResult &R) { 4952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const RecordType *BaseRT = BaseType->getAs<RecordType>(); 4962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!BaseRT) { 4972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // We can't check this yet because the base type is still 4982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // dependent. 4992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(BaseType->isDependentType()); 5002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 5012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 5022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl()); 5032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) { 5052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If this is an implicit member reference and we find a 5062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // non-instance member, it's not an error. 5072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!BaseExpr && !(*I)->isCXXInstanceMember()) 5082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 5092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Note that we use the DC of the decl, not the underlying decl. 5112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclContext *DC = (*I)->getDeclContext(); 5122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor while (DC->isTransparentContext()) 5132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DC = DC->getParent(); 5142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!DC->isRecord()) 5162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor continue; 5172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor llvm::SmallPtrSet<CXXRecordDecl*,4> MemberRecord; 5192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberRecord.insert(cast<CXXRecordDecl>(DC)->getCanonicalDecl()); 5202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IsProvablyNotDerivedFrom(*this, BaseRecord, MemberRecord)) 5222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 5232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 5242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DiagnoseQualifiedMemberReference(*this, BaseExpr, BaseType, SS, 5262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R.getRepresentativeDecl(), 5272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R.getLookupNameInfo()); 5282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return true; 5292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 5302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic bool 5322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorLookupMemberExprInRecord(Sema &SemaRef, LookupResult &R, 5332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceRange BaseRange, const RecordType *RTy, 5342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation OpLoc, CXXScopeSpec &SS, 5352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool HasTemplateArgs) { 5362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor RecordDecl *RDecl = RTy->getDecl(); 5372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SemaRef.RequireCompleteType(OpLoc, QualType(RTy, 0), 5382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.PDiag(diag::err_typecheck_incomplete_tag) 5392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << BaseRange)) 5402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return true; 5412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (HasTemplateArgs) { 5432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // LookupTemplateName doesn't expect these both to exist simultaneously. 5442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType ObjectType = SS.isSet() ? QualType() : QualType(RTy, 0); 5452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool MOUS; 5472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.LookupTemplateName(R, 0, SS, ObjectType, false, MOUS); 5482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 5492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 5502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclContext *DC = RDecl; 5522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SS.isSet()) { 5532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If the member name was a qualified-id, look into the 5542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // nested-name-specifier. 5552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DC = SemaRef.computeDeclContext(SS, false); 5562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SemaRef.RequireCompleteDeclContext(SS, DC)) { 5582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.Diag(SS.getRange().getEnd(), diag::err_typecheck_incomplete_tag) 5592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << SS.getRange() << DC; 5602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return true; 5612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 5622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(DC && "Cannot handle non-computable dependent contexts in lookup"); 5642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!isa<TypeDecl>(DC)) { 5662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.Diag(R.getNameLoc(), diag::err_qualified_member_nonclass) 5672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << DC << SS.getRange(); 5682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return true; 5692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 5702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 5712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // The record definition is complete, now look up the member. 5732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.LookupQualifiedName(R, DC); 5742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!R.empty()) 5762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 5772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 5782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // We didn't find anything with the given name, so try to correct 5792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // for typos. 5802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationName Name = R.getLookupName(); 581d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor TypoCorrection Corrected = SemaRef.CorrectTypo(R.getLookupNameInfo(), 582d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor R.getLookupKind(), NULL, 583d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor &SS, DC, false, 584d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Sema::CTC_MemberLookup); 585d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor NamedDecl *ND = Corrected.getCorrectionDecl(); 586d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor R.clear(); 587d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor if (ND && (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND))) { 588d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedStr( 589d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getAsString(SemaRef.getLangOptions())); 590d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedQuotedStr( 591d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getQuoted(SemaRef.getLangOptions())); 592d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor R.setLookupName(Corrected.getCorrection()); 593d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor R.addDecl(ND); 5942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SemaRef.Diag(R.getNameLoc(), diag::err_no_member_suggest) 595d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << Name << DC << CorrectedQuotedStr << SS.getRange() 596d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FixItHint::CreateReplacement(R.getNameLoc(), CorrectedStr); 597d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor SemaRef.Diag(ND->getLocation(), diag::note_previous_decl) 598d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << ND->getDeclName(); 5992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 6002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 6022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 6032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult 6052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorSema::BuildMemberReferenceExpr(Expr *Base, QualType BaseType, 6062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation OpLoc, bool IsArrow, 6072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXScopeSpec &SS, 6082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *FirstQualifierInScope, 6092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &NameInfo, 6102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const TemplateArgumentListInfo *TemplateArgs) { 6112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (BaseType->isDependentType() || 6122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor (SS.isSet() && isDependentScopeSpecifier(SS))) 6132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ActOnDependentMemberExpr(Base, BaseType, 6142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IsArrow, OpLoc, 6152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS, FirstQualifierInScope, 6162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NameInfo, TemplateArgs); 6172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupResult R(*this, NameInfo, LookupMemberName); 6192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Implicit member accesses. 6212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!Base) { 6222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType RecordTy = BaseType; 6232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsArrow) RecordTy = RecordTy->getAs<PointerType>()->getPointeeType(); 6242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (LookupMemberExprInRecord(*this, R, SourceRange(), 6252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor RecordTy->getAs<RecordType>(), 6262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor OpLoc, SS, TemplateArgs != 0)) 6272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 6282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Explicit member accesses. 6302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 6312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprResult BaseResult = Owned(Base); 6322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprResult Result = 6332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupMemberExpr(R, BaseResult, IsArrow, OpLoc, 6342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS, /*ObjCImpDecl*/ 0, TemplateArgs != 0); 6352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (BaseResult.isInvalid()) 6372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 6382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Base = BaseResult.take(); 6392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Result.isInvalid()) { 6412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Owned(Base); 6422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 6432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 6442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Result.get()) 6462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return move(Result); 6472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // LookupMemberExpr can modify Base, and thus change BaseType 6492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseType = Base->getType(); 6502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 6512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildMemberReferenceExpr(Base, BaseType, 6532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor OpLoc, IsArrow, SS, FirstQualifierInScope, 6542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R, TemplateArgs); 6552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 6562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic ExprResult 6582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorBuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow, 6592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, FieldDecl *Field, 6602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclAccessPair FoundDecl, 6612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &MemberNameInfo); 6622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult 6642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorSema::BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS, 6652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation loc, 6662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IndirectFieldDecl *indirectField, 6672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Expr *baseObjectExpr, 6682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation opLoc) { 6692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // First, build the expression that refers to the base object. 6702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool baseObjectIsPointer = false; 6722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Qualifiers baseQuals; 6732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Case 1: the base of the indirect field is not a field. 6752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor VarDecl *baseVariable = indirectField->getVarDecl(); 6762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXScopeSpec EmptySS; 6772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (baseVariable) { 6782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(baseVariable->getType()->isRecordType()); 6792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // In principle we could have a member access expression that 6812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // accesses an anonymous struct/union that's a static member of 6822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // the base object's class. However, under the current standard, 6832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // static data members cannot be anonymous structs or unions. 6842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Supporting this is as easy as building a MemberExpr here. 6852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(!baseObjectExpr && "anonymous struct/union is static data member?"); 6862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationNameInfo baseNameInfo(DeclarationName(), loc); 6882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprResult result 6902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = BuildDeclarationNameExpr(EmptySS, baseNameInfo, baseVariable); 6912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (result.isInvalid()) return ExprError(); 6922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseObjectExpr = result.take(); 6942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseObjectIsPointer = false; 6952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseQuals = baseObjectExpr->getType().getQualifiers(); 6962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 6972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Case 2: the base of the indirect field is a field and the user 6982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // wrote a member expression. 6992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else if (baseObjectExpr) { 7002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // The caller provided the base object expression. Determine 7012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // whether its a pointer and whether it adds any qualifiers to the 7022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // anonymous struct/union fields we're looking into. 7032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType objectType = baseObjectExpr->getType(); 7042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (const PointerType *ptr = objectType->getAs<PointerType>()) { 7062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseObjectIsPointer = true; 7072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor objectType = ptr->getPointeeType(); 7082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 7092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseObjectIsPointer = false; 7102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 7112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseQuals = objectType.getQualifiers(); 7122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Case 3: the base of the indirect field is a field and we should 7142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // build an implicit member access. 7152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 7162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // We've found a member of an anonymous struct/union that is 7172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // inside a non-anonymous struct/union, so in a well-formed 7182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // program our base object expression is "this". 719341350ee62abd1ad818e1e3d926cd718960e439bDouglas Gregor QualType ThisTy = getCurrentThisType(); 7202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ThisTy.isNull()) { 7212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(loc, diag::err_invalid_member_use_in_static_method) 7222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << indirectField->getDeclName(); 7232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 7242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 7252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Our base object expression is "this". 7272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseObjectExpr 7282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = new (Context) CXXThisExpr(loc, ThisTy, /*isImplicit=*/ true); 7292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseObjectIsPointer = true; 7302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseQuals = ThisTy->castAs<PointerType>()->getPointeeType().getQualifiers(); 7312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 7322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Build the implicit member references to the field of the 7342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // anonymous struct/union. 7352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Expr *result = baseObjectExpr; 7362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IndirectFieldDecl::chain_iterator 7372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor FI = indirectField->chain_begin(), FEnd = indirectField->chain_end(); 7382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Build the first member access in the chain with full information. 7402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!baseVariable) { 7412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor FieldDecl *field = cast<FieldDecl>(*FI); 7422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: use the real found-decl info! 7442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclAccessPair foundDecl = DeclAccessPair::make(field, field->getAccess()); 7452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Make a nameInfo that properly uses the anonymous name. 7472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationNameInfo memberNameInfo(field->getDeclName(), loc); 7482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor result = BuildFieldReferenceExpr(*this, result, baseObjectIsPointer, 7502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor EmptySS, field, foundDecl, 7512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor memberNameInfo).take(); 7522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseObjectIsPointer = false; 7532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: check qualified member access 7552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 7562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // In all cases, we should now skip the first declaration in the chain. 7582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ++FI; 7592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor while (FI != FEnd) { 7612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor FieldDecl *field = cast<FieldDecl>(*FI++); 7622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: these are somewhat meaningless 7642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationNameInfo memberNameInfo(field->getDeclName(), loc); 7652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclAccessPair foundDecl = DeclAccessPair::make(field, field->getAccess()); 7662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor result = BuildFieldReferenceExpr(*this, result, /*isarrow*/ false, 7682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor (FI == FEnd? SS : EmptySS), field, 7692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor foundDecl, memberNameInfo).take(); 7702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 7712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(result); 7732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 7742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// \brief Build a MemberExpr AST node. 7762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic MemberExpr *BuildMemberExpr(ASTContext &C, Expr *Base, bool isArrow, 7772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, ValueDecl *Member, 7782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclAccessPair FoundDecl, 7792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &MemberNameInfo, 7802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType Ty, 7812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprValueKind VK, ExprObjectKind OK, 7822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const TemplateArgumentListInfo *TemplateArgs = 0) { 7833bad5b10cc05fe000340fc6e4efc4d8b9af0a62cRichard Smith assert((!isArrow || Base->isRValue()) && "-> base must be a pointer rvalue"); 7842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return MemberExpr::Create(C, Base, isArrow, SS.getWithLocInContext(C), 7852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Member, FoundDecl, MemberNameInfo, 7862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor TemplateArgs, Ty, VK, OK); 7872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 7882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 7892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult 7902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorSema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, 7912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation OpLoc, bool IsArrow, 7922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, 7932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *FirstQualifierInScope, 7942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupResult &R, 7952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const TemplateArgumentListInfo *TemplateArgs, 7962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool SuppressQualifierCheck) { 7972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType BaseType = BaseExprType; 7982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsArrow) { 7992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(BaseType->isPointerType()); 800e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall BaseType = BaseType->castAs<PointerType>()->getPointeeType(); 8012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 8022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R.setBaseObjectType(BaseType); 8032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &MemberNameInfo = R.getLookupNameInfo(); 8052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationName MemberName = MemberNameInfo.getName(); 8062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation MemberLoc = MemberNameInfo.getLoc(); 8072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (R.isAmbiguous()) 8092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 8102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (R.empty()) { 8122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Rederive where we looked up. 8132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclContext *DC = (SS.isSet() 8142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ? computeDeclContext(SS, false) 8152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor : BaseType->getAs<RecordType>()->getDecl()); 8162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(R.getNameLoc(), diag::err_no_member) 8182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << MemberName << DC 8192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << (BaseExpr ? BaseExpr->getSourceRange() : SourceRange()); 8202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 8212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 8222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Diagnose lookups that find only declarations from a non-base 8242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // type. This is possible for either qualified lookups (which may 8252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // have been qualified with an unrelated type) or implicit member 8262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // expressions (which were found with unqualified lookup and thus 8272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // may have come from an enclosing scope). Note that it's okay for 8282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // lookup to find declarations from a non-base type as long as those 8292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // aren't the ones picked by overload resolution. 8302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if ((SS.isSet() || !BaseExpr || 8312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor (isa<CXXThisExpr>(BaseExpr) && 8322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor cast<CXXThisExpr>(BaseExpr)->isImplicit())) && 8332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor !SuppressQualifierCheck && 8342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CheckQualifiedMemberReference(BaseExpr, BaseType, SS, R)) 8352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 836d12505054130b24f7696440efdbd1aa660feb6f3Fariborz Jahanian 8372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Construct an unresolved result if we in fact got an unresolved 8382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // result. 8392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (R.isOverloadedResult() || R.isUnresolvableResult()) { 8402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Suppress any lookup-related diagnostics; we'll do these when we 8412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // pick a member. 8422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R.suppressDiagnostics(); 8432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor UnresolvedMemberExpr *MemExpr 8452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = UnresolvedMemberExpr::Create(Context, R.isUnresolvableResult(), 8462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseExpr, BaseExprType, 8472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IsArrow, OpLoc, 8482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS.getWithLocInContext(Context), 8492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberNameInfo, 8502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor TemplateArgs, R.begin(), R.end()); 8512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(MemExpr); 8532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 8542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(R.isSingleResult()); 8562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclAccessPair FoundDecl = R.begin().getPair(); 8572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *MemberDecl = R.getFoundDecl(); 8582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: diagnose the presence of template arguments now. 8602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If the decl being referenced had an error, return an error for this 8622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // sub-expr without emitting another error, in order to avoid cascading 8632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // error cases. 8642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (MemberDecl->isInvalidDecl()) 8652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 8662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Handle the implicit-member-access case. 8682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!BaseExpr) { 8692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If this is not an instance member, convert to a non-member access. 8702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!MemberDecl->isCXXInstanceMember()) 8712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildDeclarationNameExpr(SS, R.getLookupNameInfo(), MemberDecl); 8722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation Loc = R.getNameLoc(); 8742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SS.getRange().isValid()) 8752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Loc = SS.getRange().getBegin(); 8762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseExpr = new (Context) CXXThisExpr(Loc, BaseExprType,/*isImplicit=*/true); 8772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 8782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool ShouldCheckUse = true; 8802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MemberDecl)) { 8812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Don't diagnose the use of a virtual member function unless it's 8822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // explicitly qualified. 8832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (MD->isVirtual() && !SS.isSet()) 8842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ShouldCheckUse = false; 8852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 8862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check the use of this member. 8882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ShouldCheckUse && DiagnoseUseOfDecl(MemberDecl, MemberLoc)) { 8892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Owned(BaseExpr); 8902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 8912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 8922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) 8942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildFieldReferenceExpr(*this, BaseExpr, IsArrow, 8952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS, FD, FoundDecl, MemberNameInfo); 8962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 8972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IndirectFieldDecl *FD = dyn_cast<IndirectFieldDecl>(MemberDecl)) 8982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // We may have found a field within an anonymous union or struct 8992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // (C++ [class.union]). 9002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildAnonymousStructUnionMemberReference(SS, MemberLoc, FD, 9012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseExpr, OpLoc); 9022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (VarDecl *Var = dyn_cast<VarDecl>(MemberDecl)) { 9042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MarkDeclarationReferenced(MemberLoc, Var); 9052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS, 9062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Var, FoundDecl, MemberNameInfo, 9072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Var->getType().getNonReferenceType(), 9082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor VK_LValue, OK_Ordinary)); 9092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 9102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (CXXMethodDecl *MemberFn = dyn_cast<CXXMethodDecl>(MemberDecl)) { 9122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprValueKind valueKind; 9132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType type; 9142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (MemberFn->isInstance()) { 9152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor valueKind = VK_RValue; 9162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor type = Context.BoundMemberTy; 9172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 9182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor valueKind = VK_LValue; 9192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor type = MemberFn->getType(); 9202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 9212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MarkDeclarationReferenced(MemberLoc, MemberDecl); 9232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS, 9242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberFn, FoundDecl, MemberNameInfo, 9252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor type, valueKind, OK_Ordinary)); 9262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 9272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(!isa<FunctionDecl>(MemberDecl) && "member function not C++ method?"); 9282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (EnumConstantDecl *Enum = dyn_cast<EnumConstantDecl>(MemberDecl)) { 9302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MarkDeclarationReferenced(MemberLoc, MemberDecl); 9312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(BuildMemberExpr(Context, BaseExpr, IsArrow, SS, 9322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Enum, FoundDecl, MemberNameInfo, 9332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Enum->getType(), VK_RValue, OK_Ordinary)); 9342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 9352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Owned(BaseExpr); 9372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // We found something that we didn't expect. Complain. 9392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (isa<TypeDecl>(MemberDecl)) 9402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberLoc, diag::err_typecheck_member_reference_type) 9412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << MemberName << BaseType << int(IsArrow); 9422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else 9432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberLoc, diag::err_typecheck_member_reference_unknown) 9442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << MemberName << BaseType << int(IsArrow); 9452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberDecl->getLocation(), diag::note_member_declared_here) 9472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << MemberName; 9482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R.suppressDiagnostics(); 9492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 9502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 9512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// Given that normal member access failed on the given expression, 9532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// and given that the expression's type involves builtin-id or 9542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// builtin-Class, decide whether substituting in the redefinition 9552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// types would be profitable. The redefinition type is whatever 9562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// this translation unit tried to typedef to id/Class; we store 9572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// it to the side and then re-use it in places like this. 9582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic bool ShouldTryAgainWithRedefinitionType(Sema &S, ExprResult &base) { 9592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const ObjCObjectPointerType *opty 9602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = base.get()->getType()->getAs<ObjCObjectPointerType>(); 9612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!opty) return false; 9622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const ObjCObjectType *ty = opty->getObjectType(); 9642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType redef; 9662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ty->isObjCId()) { 96701a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor redef = S.Context.getObjCIdRedefinitionType(); 9682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else if (ty->isObjCClass()) { 96901a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor redef = S.Context.getObjCClassRedefinitionType(); 9702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 9712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 9722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 9732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Do the substitution as long as the redefinition type isn't just a 9752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // possibly-qualified pointer to builtin-id or builtin-Class again. 9762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor opty = redef->getAs<ObjCObjectPointerType>(); 9772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (opty && !opty->getObjectType()->getInterface() != 0) 9782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return false; 9792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor base = S.ImpCastExprToType(base.take(), redef, CK_BitCast); 9812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return true; 9822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 9832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 9846dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic bool isRecordType(QualType T) { 9856dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return T->isRecordType(); 9866dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall} 9876dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic bool isPointerToRecordType(QualType T) { 9886dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (const PointerType *PT = T->getAs<PointerType>()) 9896dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return PT->getPointeeType()->isRecordType(); 9906dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return false; 9916dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall} 9926dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 993cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith/// Perform conversions on the LHS of a member access expression. 994cda80f83ec59293222fe8b92617c8e9f41725f76Richard SmithExprResult 995cda80f83ec59293222fe8b92617c8e9f41725f76Richard SmithSema::PerformMemberExprBaseConversion(Expr *Base, bool IsArrow) { 996cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith ExprResult BaseResult = DefaultFunctionArrayConversion(Base); 997cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith 998cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith if (!BaseResult.isInvalid() && IsArrow) 999cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith BaseResult = DefaultLvalueConversion(BaseResult.take()); 1000cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith 1001cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith return BaseResult; 1002cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith} 1003cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith 10042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// Look up the given member of the given non-type-dependent 10052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// expression. This can return in one of two ways: 10062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// * If it returns a sentinel null-but-valid result, the caller will 10072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// assume that lookup was performed and the results written into 10082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// the provided structure. It will take over from there. 10092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// * Otherwise, the returned expression will be produced in place of 10102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// an ordinary member expression. 10112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// 10122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// The ObjCImpDecl bit is a gross hack that will need to be properly 10132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// fixed for ObjC++. 10142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult 10152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorSema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr, 10162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool &IsArrow, SourceLocation OpLoc, 10172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXScopeSpec &SS, 10182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Decl *ObjCImpDecl, bool HasTemplateArgs) { 10192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(BaseExpr.get() && "no base expression"); 10202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Perform default conversions. 1022cda80f83ec59293222fe8b92617c8e9f41725f76Richard Smith BaseExpr = PerformMemberExprBaseConversion(BaseExpr.take(), IsArrow); 10236dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (BaseExpr.isInvalid()) 10246dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return ExprError(); 10252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType BaseType = BaseExpr.get()->getType(); 10272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(!BaseType->isDependentType()); 10282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationName MemberName = R.getLookupName(); 10302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation MemberLoc = R.getNameLoc(); 10312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // For later type-checking purposes, turn arrow accesses into dot 10332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // accesses. The only access type we support that doesn't follow 10342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // the C equivalence "a->b === (*a).b" is ObjC property accesses, 10352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // and those never use arrows, so this is unaffected. 10362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsArrow) { 10372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 10382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseType = Ptr->getPointeeType(); 10392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else if (const ObjCObjectPointerType *Ptr 10402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 10412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseType = Ptr->getPointeeType(); 10422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else if (BaseType->isRecordType()) { 10432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Recover from arrow accesses to records, e.g.: 10442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // struct MyRecord foo; 10452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // foo->bar 10462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // This is actually well-formed in C++ if MyRecord has an 10472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // overloaded operator->, but that should have been dealt with 10482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // by now. 10492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) 10502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange() 10512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << FixItHint::CreateReplacement(OpLoc, "."); 10522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IsArrow = false; 10532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else if (BaseType == Context.BoundMemberTy) { 10542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor goto fail; 10552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 10562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberLoc, diag::err_typecheck_member_reference_arrow) 10572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << BaseType << BaseExpr.get()->getSourceRange(); 10582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 10592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 10602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 10612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Handle field access to simple records. 10632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (const RecordType *RTy = BaseType->getAs<RecordType>()) { 10642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (LookupMemberExprInRecord(*this, R, BaseExpr.get()->getSourceRange(), 10652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor RTy, OpLoc, SS, HasTemplateArgs)) 10662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 10672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Returning valid-but-null is how we indicate to the caller that 10692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // the lookup result was filled in. 10702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned((Expr*) 0); 10712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 10722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Handle ivar access to Objective-C objects. 10742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) { 10755a706dc1b17f875c7fce20f1fbf9ca372be4c331Douglas Gregor if (!SS.isEmpty() && !SS.isInvalid()) { 1076b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor Diag(SS.getRange().getBegin(), diag::err_qualified_objc_access) 1077b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor << 1 << SS.getScopeRep() 1078b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor << FixItHint::CreateRemoval(SS.getRange()); 1079b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor SS.clear(); 1080b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor } 1081b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor 10822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); 10832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 10842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // There are three cases for the base type: 10852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // - builtin id (qualified or unqualified) 10862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // - builtin Class (qualified or unqualified) 10872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // - an interface 10882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCInterfaceDecl *IDecl = OTy->getInterface(); 10892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IDecl) { 10902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (getLangOptions().ObjCAutoRefCount && 10912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor (OTy->isObjCId() || OTy->isObjCClass())) 10922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor goto fail; 10932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // There's an implicit 'isa' ivar on all objects. 10942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // But we only actually find it this way on objects of type 'id', 10952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // apparently. 10962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (OTy->isObjCId() && Member->isStr("isa")) 10972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(new (Context) ObjCIsaExpr(BaseExpr.take(), IsArrow, MemberLoc, 10982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Context.getObjCClassType())); 10992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr)) 11012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS, 11022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCImpDecl, HasTemplateArgs); 11032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor goto fail; 11042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 11052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCInterfaceDecl *ClassDeclared; 11072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCIvarDecl *IV = IDecl->lookupInstanceVariable(Member, ClassDeclared); 11082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IV) { 11102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Attempt to correct for typos in ivar names. 11112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupResult Res(*this, R.getLookupName(), R.getNameLoc(), 11122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupMemberName); 1113d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor TypoCorrection Corrected = CorrectTypo( 1114d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor R.getLookupNameInfo(), LookupMemberName, NULL, NULL, IDecl, false, 1115d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor IsArrow ? CTC_ObjCIvarLookup : CTC_ObjCPropertyLookup); 1116d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor if ((IV = Corrected.getCorrectionDeclAs<ObjCIvarDecl>())) { 11172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(R.getNameLoc(), 11182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor diag::err_typecheck_member_reference_ivar_suggest) 11192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << IDecl->getDeclName() << MemberName << IV->getDeclName() 11202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << FixItHint::CreateReplacement(R.getNameLoc(), 11212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IV->getNameAsString()); 11222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(IV->getLocation(), diag::note_previous_decl) 11232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << IV->getDeclName(); 11242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 11256326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian if (IsArrow && IDecl->FindPropertyDeclaration(Member)) { 11266326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian Diag(MemberLoc, 11276326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian diag::err_property_found_suggest) 11286326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian << Member << BaseExpr.get()->getType() 11296326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian << FixItHint::CreateReplacement(OpLoc, "."); 11306326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian return ExprError(); 11316326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian } 11322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Res.clear(); 11332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Res.setLookupName(Member); 11342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberLoc, diag::err_typecheck_member_reference_ivar) 11362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << IDecl->getDeclName() << MemberName 11372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << BaseExpr.get()->getSourceRange(); 11382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 11392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 11402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 11412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If the decl being referenced had an error, return an error for this 11432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // sub-expr without emitting another error, in order to avoid cascading 11442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // error cases. 11452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IV->isInvalidDecl()) 11462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 11472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check whether we can reference this field. 11492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (DiagnoseUseOfDecl(IV, MemberLoc)) 11502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 11512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IV->getAccessControl() != ObjCIvarDecl::Public && 11522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IV->getAccessControl() != ObjCIvarDecl::Package) { 11532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCInterfaceDecl *ClassOfMethodDecl = 0; 11542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCMethodDecl *MD = getCurMethodDecl()) 11552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ClassOfMethodDecl = MD->getClassInterface(); 11562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else if (ObjCImpDecl && getCurFunctionDecl()) { 11572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Case of a c-function declared inside an objc implementation. 11582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: For a c-style function nested inside an objc implementation 11592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // class, there is no implementation context available, so we pass 11602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // down the context as argument to this routine. Ideally, this context 11612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // need be passed down in the AST node and somehow calculated from the 11622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // AST for a function decl. 11632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCImplementationDecl *IMPD = 11642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor dyn_cast<ObjCImplementationDecl>(ObjCImpDecl)) 11652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ClassOfMethodDecl = IMPD->getClassInterface(); 11662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else if (ObjCCategoryImplDecl* CatImplClass = 11672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor dyn_cast<ObjCCategoryImplDecl>(ObjCImpDecl)) 11682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ClassOfMethodDecl = CatImplClass->getClassInterface(); 11692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 11702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IV->getAccessControl() == ObjCIvarDecl::Private) { 11722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ClassDeclared != IDecl || 11732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ClassOfMethodDecl != ClassDeclared) 11742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberLoc, diag::error_private_ivar_access) 11752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << IV->getDeclName(); 11762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else if (!IDecl->isSuperClassOf(ClassOfMethodDecl)) 11772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // @protected 11782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberLoc, diag::error_protected_ivar_access) 11792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << IV->getDeclName(); 11802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 11812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (getLangOptions().ObjCAutoRefCount) { 11822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Expr *BaseExp = BaseExpr.get()->IgnoreParenImpCasts(); 11832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (UnaryOperator *UO = dyn_cast<UnaryOperator>(BaseExp)) 11842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (UO->getOpcode() == UO_Deref) 11852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseExp = UO->getSubExpr()->IgnoreParenCasts(); 11862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (DeclRefExpr *DE = dyn_cast<DeclRefExpr>(BaseExp)) 11882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (DE->getType().getObjCLifetime() == Qualifiers::OCL_Weak) 11892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(DE->getLocation(), diag::error_arc_weak_ivar_access); 11902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 11912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(new (Context) ObjCIvarRefExpr(IV, IV->getType(), 11932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberLoc, BaseExpr.take(), 11942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IsArrow)); 11952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 11962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 11972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Objective-C property access. 11982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const ObjCObjectPointerType *OPT; 11992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IsArrow && (OPT = BaseType->getAs<ObjCObjectPointerType>())) { 12005a706dc1b17f875c7fce20f1fbf9ca372be4c331Douglas Gregor if (!SS.isEmpty() && !SS.isInvalid()) { 1201b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor Diag(SS.getRange().getBegin(), diag::err_qualified_objc_access) 1202b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor << 0 << SS.getScopeRep() 1203b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor << FixItHint::CreateRemoval(SS.getRange()); 1204b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor SS.clear(); 1205b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor } 1206b5ae92f2f52df88ae14504d3a3f2bddb479829b6Douglas Gregor 12072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // This actually uses the base as an r-value. 12082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseExpr = DefaultLvalueConversion(BaseExpr.take()); 12092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (BaseExpr.isInvalid()) 12102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 12112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(Context.hasSameUnqualifiedType(BaseType, BaseExpr.get()->getType())); 12132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); 12152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const ObjCObjectType *OT = OPT->getObjectType(); 12172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // id, with and without qualifiers. 12192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (OT->isObjCId()) { 12202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check protocols on qualified interfaces. 12212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 12222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Decl *PMDecl = FindGetterSetterNameDecl(OPT, Member, Sel, Context)) { 12232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(PMDecl)) { 12242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check the use of this declaration 12252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (DiagnoseUseOfDecl(PD, MemberLoc)) 12262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 12272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1228e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall return Owned(new (Context) ObjCPropertyRefExpr(PD, 1229e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall Context.PseudoObjectTy, 12302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor VK_LValue, 12312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor OK_ObjCProperty, 12322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberLoc, 12332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseExpr.take())); 12342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 12352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(PMDecl)) { 12372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check the use of this method. 12382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (DiagnoseUseOfDecl(OMD, MemberLoc)) 12392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 12402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Selector SetterSel = 12412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SelectorTable::constructSetterName(PP.getIdentifierTable(), 12422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor PP.getSelectorTable(), Member); 12432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCMethodDecl *SMD = 0; 12442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Decl *SDecl = FindGetterSetterNameDecl(OPT, /*Property id*/0, 12452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SetterSel, Context)) 12462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SMD = dyn_cast<ObjCMethodDecl>(SDecl); 12472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 1248e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall return Owned(new (Context) ObjCPropertyRefExpr(OMD, SMD, 1249e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall Context.PseudoObjectTy, 1250e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall VK_LValue, OK_ObjCProperty, 12512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberLoc, BaseExpr.take())); 12522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 12532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 12542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Use of id.member can only be for a property reference. Do not 12552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // use the 'id' redefinition in this case. 12562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsArrow && ShouldTryAgainWithRedefinitionType(*this, BaseExpr)) 12572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS, 12582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCImpDecl, HasTemplateArgs); 12592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(Diag(MemberLoc, diag::err_property_not_found) 12612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << MemberName << BaseType); 12622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 12632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // 'Class', unqualified only. 12652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (OT->isObjCClass()) { 12662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Only works in a method declaration (??!). 12672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCMethodDecl *MD = getCurMethodDecl(); 12682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!MD) { 12692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr)) 12702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS, 12712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCImpDecl, HasTemplateArgs); 12722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor goto fail; 12742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 12752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 12762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Also must look for a getter name which uses property syntax. 12772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 12782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCInterfaceDecl *IFace = MD->getClassInterface(); 12792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCMethodDecl *Getter; 12802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if ((Getter = IFace->lookupClassMethod(Sel))) { 12812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Check the use of this method. 12822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (DiagnoseUseOfDecl(Getter, MemberLoc)) 12832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 12842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else 12852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Getter = IFace->lookupPrivateMethod(Sel, false); 12862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If we found a getter then this may be a valid dot-reference, we 12872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // will look for the matching setter, in case it is needed. 12882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Selector SetterSel = 12892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SelectorTable::constructSetterName(PP.getIdentifierTable(), 12902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor PP.getSelectorTable(), Member); 12912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); 12922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!Setter) { 12932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If this reference is in an @implementation, also check for 'private' 12942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // methods. 12952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Setter = IFace->lookupPrivateMethod(SetterSel, false); 12962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 12972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Look through local category implementations associated with the class. 12982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!Setter) 12992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Setter = IFace->getCategoryClassMethod(SetterSel); 13002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc)) 13022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 13032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Getter || Setter) { 13052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter, 1306e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall Context.PseudoObjectTy, 1307e859fbf5938fc0f8ca5aa115c35c66732174f513John McCall VK_LValue, OK_ObjCProperty, 13082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberLoc, BaseExpr.take())); 13092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr)) 13122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS, 13132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCImpDecl, HasTemplateArgs); 13142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(Diag(MemberLoc, diag::err_property_not_found) 13162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << MemberName << BaseType); 13172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Normal property access. 13206326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian return HandleExprPropertyRefExpr(OPT, BaseExpr.get(), OpLoc, 13216326e05fe8c2ff92b65b4759a91e45fad5ef886fFariborz Jahanian MemberName, MemberLoc, 13222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation(), QualType(), false); 13232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Handle 'field access' to vectors, such as 'V.xx'. 13262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (BaseType->isExtVectorType()) { 13272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: this expr should store IsArrow. 13282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); 13292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprValueKind VK = (IsArrow ? VK_LValue : BaseExpr.get()->getValueKind()); 13302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType ret = CheckExtVectorComponent(*this, BaseType, VK, OpLoc, 13312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Member, MemberLoc); 13322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (ret.isNull()) 13332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 13342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return Owned(new (Context) ExtVectorElementExpr(ret, VK, BaseExpr.take(), 13362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor *Member, MemberLoc)); 13372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Adjust builtin-sel to the appropriate redefinition type if that's 13402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // not just a pointer to builtin-sel again. 13412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsArrow && 13422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseType->isSpecificBuiltinType(BuiltinType::ObjCSel) && 134301a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor !Context.getObjCSelRedefinitionType()->isObjCSelType()) { 134401a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor BaseExpr = ImpCastExprToType(BaseExpr.take(), 134501a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor Context.getObjCSelRedefinitionType(), 13462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CK_BitCast); 13472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS, 13482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCImpDecl, HasTemplateArgs); 13492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Failure cases. 13522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor fail: 13532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Recover from dot accesses to pointers, e.g.: 13552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // type *foo; 13562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // foo.bar 13572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // This is actually well-formed in two cases: 13582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // - 'type' is an Objective C type 13592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // - 'bar' is a pseudo-destructor name which happens to refer to 13602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // the appropriate pointer type 13612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) { 13622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IsArrow && Ptr->getPointeeType()->isRecordType() && 13632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberName.getNameKind() != DeclarationName::CXXDestructorName) { 13642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) 13652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange() 13662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << FixItHint::CreateReplacement(OpLoc, "->"); 13672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Recurse as an -> access. 13692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IsArrow = true; 13702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS, 13712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ObjCImpDecl, HasTemplateArgs); 13722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If the user is trying to apply -> or . to a function name, it's probably 13762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // because they forgot parentheses to call that function. 13776dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (tryToRecoverWithCall(BaseExpr, 13786dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall PDiag(diag::err_member_reference_needs_call), 13796dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall /*complain*/ false, 13806dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall IsArrow ? &isRecordType : &isPointerToRecordType)) { 13816dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (BaseExpr.isInvalid()) 13822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 13836dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall BaseExpr = DefaultFunctionArrayConversion(BaseExpr.take()); 13846dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS, 13856dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall ObjCImpDecl, HasTemplateArgs); 13862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 13872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(MemberLoc, diag::err_typecheck_member_reference_struct_union) 13892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor << BaseType << BaseExpr.get()->getSourceRange(); 13902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 13922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 13932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 13942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// The main callback when the parser finds something like 13952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// expression . [nested-name-specifier] identifier 13962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// expression -> [nested-name-specifier] identifier 13972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// where 'identifier' encompasses a fairly broad spectrum of 13982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// possibilities, including destructor and operator references. 13992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// 14002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// \param OpKind either tok::arrow or tok::period 14012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// \param HasTrailingLParen whether the next token is '(', which 14022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// is used to diagnose mis-uses of special members that can 14032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// only be called 14042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// \param ObjCImpDecl the current ObjC @implementation decl; 14052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// this is an ugly hack around the fact that ObjC @implementations 14062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// aren't properly put in the context chain 14072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult Sema::ActOnMemberAccessExpr(Scope *S, Expr *Base, 14082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation OpLoc, 14092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor tok::TokenKind OpKind, 14102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor CXXScopeSpec &SS, 14112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor UnqualifiedId &Id, 14122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Decl *ObjCImpDecl, 14132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool HasTrailingLParen) { 14142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SS.isSet() && SS.isInvalid()) 14152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 14162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Warn about the explicit constructor calls Microsoft extension. 141862ec1f2fd7368542bb926c04797fb07023547694Francois Pichet if (getLangOptions().MicrosoftExt && 14192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Id.getKind() == UnqualifiedId::IK_ConstructorName) 14202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Diag(Id.getSourceRange().getBegin(), 14212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor diag::ext_ms_explicit_constructor_call); 14222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor TemplateArgumentListInfo TemplateArgsBuffer; 14242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Decompose the name into its component parts. 14262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationNameInfo NameInfo; 14272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const TemplateArgumentListInfo *TemplateArgs; 14282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DecomposeUnqualifiedId(Id, TemplateArgsBuffer, 14292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NameInfo, TemplateArgs); 14302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclarationName Name = NameInfo.getName(); 14322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool IsArrow = (OpKind == tok::arrow); 14332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NamedDecl *FirstQualifierInScope 14352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = (!SS.isSet() ? 0 : FindFirstQualifierInScope(S, 14362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor static_cast<NestedNameSpecifier*>(SS.getScopeRep()))); 14372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // This is a postfix expression, so get rid of ParenListExprs. 14392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprResult Result = MaybeConvertParenListExprToParenExpr(S, Base); 14402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Result.isInvalid()) return ExprError(); 14412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Base = Result.take(); 14422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Base->getType()->isDependentType() || Name.isDependentName() || 14442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor isDependentScopeSpecifier(SS)) { 14452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Result = ActOnDependentMemberExpr(Base, Base->getType(), 14462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor IsArrow, OpLoc, 14472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS, FirstQualifierInScope, 14482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor NameInfo, TemplateArgs); 14492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 14502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupResult R(*this, NameInfo, LookupMemberName); 14512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprResult BaseResult = Owned(Base); 14522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Result = LookupMemberExpr(R, BaseResult, IsArrow, OpLoc, 14532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS, ObjCImpDecl, TemplateArgs != 0); 14542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (BaseResult.isInvalid()) 14552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 14562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Base = BaseResult.take(); 14572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Result.isInvalid()) { 14592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Owned(Base); 14602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 14612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 14622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Result.get()) { 14642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // The only way a reference to a destructor can be used is to 14652b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // immediately call it, which falls into this case. If the 14662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // next token is not a '(', produce a diagnostic and build the 14672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // call now. 14682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!HasTrailingLParen && 14692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Id.getKind() == UnqualifiedId::IK_DestructorName) 14702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return DiagnoseDtorReference(NameInfo.getLoc(), Result.get()); 14712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return move(Result); 14732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 14742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Result = BuildMemberReferenceExpr(Base, Base->getType(), 14762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor OpLoc, IsArrow, SS, FirstQualifierInScope, 14772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R, TemplateArgs); 14782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 14792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return move(Result); 14812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 14822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 14832b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregorstatic ExprResult 14842b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorBuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow, 14852b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const CXXScopeSpec &SS, FieldDecl *Field, 14862b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor DeclAccessPair FoundDecl, 14872b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const DeclarationNameInfo &MemberNameInfo) { 14882b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // x.a is an l-value if 'a' has a reference type. Otherwise: 14892b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // x.a is an l-value/x-value/pr-value if the base is (and note 14902b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // that *x is always an l-value), except that if the base isn't 14912b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // an ordinary object then we must have an rvalue. 14922b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprValueKind VK = VK_LValue; 14932b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprObjectKind OK = OK_Ordinary; 14942b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (!IsArrow) { 14952b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (BaseExpr->getObjectKind() == OK_Ordinary) 14962b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor VK = BaseExpr->getValueKind(); 14972b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor else 14982b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor VK = VK_RValue; 14992b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 15002b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (VK != VK_RValue && Field->isBitField()) 15012b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor OK = OK_BitField; 15022b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15032b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // Figure out the type of the member; see C99 6.5.2.3p3, C++ [expr.ref] 15042b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType MemberType = Field->getType(); 15052b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (const ReferenceType *Ref = MemberType->getAs<ReferenceType>()) { 15062b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberType = Ref->getPointeeType(); 15072b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor VK = VK_LValue; 15082b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } else { 15092b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor QualType BaseType = BaseExpr->getType(); 15102b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsArrow) BaseType = BaseType->getAs<PointerType>()->getPointeeType(); 15112b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15122b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Qualifiers BaseQuals = BaseType.getQualifiers(); 15132b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15142b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // GC attributes are never picked up by members. 15152b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor BaseQuals.removeObjCGCAttr(); 15162b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15172b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // CVR attributes from the base are picked up by members, 15182b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // except that 'mutable' members don't pick up 'const'. 15192b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Field->isMutable()) BaseQuals.removeConst(); 15202b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15212b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Qualifiers MemberQuals 15222b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor = S.Context.getCanonicalType(MemberType).getQualifiers(); 15232b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15242b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // TR 18037 does not allow fields to be declared with address spaces. 15252b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(!MemberQuals.hasAddressSpace()); 15262b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15272b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Qualifiers Combined = BaseQuals + MemberQuals; 15282b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Combined != MemberQuals) 15292b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberType = S.Context.getQualifiedType(MemberType, Combined); 15302b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 15312b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15322b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor S.MarkDeclarationReferenced(MemberNameInfo.getLoc(), Field); 15332b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor ExprResult Base = 15342b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor S.PerformObjectMemberConversion(BaseExpr, SS.getScopeRep(), 15352b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor FoundDecl, Field); 15362b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (Base.isInvalid()) 15372b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return ExprError(); 15382b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return S.Owned(BuildMemberExpr(S.Context, Base.take(), IsArrow, SS, 15392b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Field, FoundDecl, MemberNameInfo, 15402b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor MemberType, VK, OK)); 15412b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 15422b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15432b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// Builds an implicit member access expression. The current context 15442b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// is known to be an instance method, and the given unqualified lookup 15452b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// set is known to contain only instance members, at least one of which 15462b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor/// is from an appropriate type. 15472b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorExprResult 15482b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas GregorSema::BuildImplicitMemberExpr(const CXXScopeSpec &SS, 15492b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor LookupResult &R, 15502b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor const TemplateArgumentListInfo *TemplateArgs, 15512b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor bool IsKnownInstance) { 15522b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(!R.empty() && !R.isAmbiguous()); 15532b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15542b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation loc = R.getNameLoc(); 15552b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15562b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // We may have found a field within an anonymous union or struct 15572b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // (C++ [class.union]). 15582b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // FIXME: template-ids inside anonymous structs? 15592b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IndirectFieldDecl *FD = R.getAsSingle<IndirectFieldDecl>()) 15602b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildAnonymousStructUnionMemberReference(SS, R.getNameLoc(), FD); 15612b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15622b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // If this is known to be an instance access, go ahead and build an 15632b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // implicit 'this' expression now. 15642b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor // 'this' expression now. 1565341350ee62abd1ad818e1e3d926cd718960e439bDouglas Gregor QualType ThisTy = getCurrentThisType(); 15662b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor assert(!ThisTy.isNull() && "didn't correctly pre-flight capture of 'this'"); 15672b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15682b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Expr *baseExpr = 0; // null signifies implicit access 15692b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (IsKnownInstance) { 15702b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SourceLocation Loc = R.getNameLoc(); 15712b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor if (SS.getRange().isValid()) 15722b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor Loc = SS.getRange().getBegin(); 15732b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor baseExpr = new (Context) CXXThisExpr(loc, ThisTy, /*isImplicit=*/true); 15742b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor } 15752b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor 15762b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor return BuildMemberReferenceExpr(baseExpr, ThisTy, 15772b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /*OpLoc*/ SourceLocation(), 15782b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /*IsArrow*/ true, 15792b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor SS, 15802b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor /*FirstQualifierInScope*/ 0, 15812b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor R, TemplateArgs); 15822b1ad8b42bbbe00a1845e566f52f1941b8dbc725Douglas Gregor} 1583