summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-07-09 00:05:08 +0000
committerAnders Carlsson <andersca@mac.com>2009-07-09 00:05:08 +0000
commit03f89b18283a63f2f445777c4090880af61e90ad (patch)
tree927fb07a888f6af44da1a72c18f0a5c1b2b42c2f
parentda0cf0b1342c6fb38758d18a42ed9be98b9255c4 (diff)
downloadbcm5719-llvm-03f89b18283a63f2f445777c4090880af61e90ad.tar.gz
bcm5719-llvm-03f89b18283a63f2f445777c4090880af61e90ad.zip
Store the isAddressOfOperand in the UnresolvedDeclRefExpr, so that we can pass it when instantiating the expr. Fixes another member pointer bug.
llvm-svn: 75075
-rw-r--r--clang/include/clang/AST/ExprCXX.h12
-rw-r--r--clang/lib/Sema/SemaExpr.cpp3
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateExpr.cpp2
-rw-r--r--clang/test/CXX/dcl.decl/dcl.meaning/dcl.mptr/p3.cpp8
4 files changed, 20 insertions, 5 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index 7d76a49d126..6956e58c825 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -985,11 +985,16 @@ class UnresolvedDeclRefExpr : public Expr {
/// declaration name.
NestedNameSpecifier *NNS;
+ /// \brief Whether this expr is an address of (&) operand.
+ bool IsAddressOfOperand;
+
public:
UnresolvedDeclRefExpr(DeclarationName N, QualType T, SourceLocation L,
- SourceRange R, NestedNameSpecifier *NNS)
+ SourceRange R, NestedNameSpecifier *NNS,
+ bool IsAddressOfOperand)
: Expr(UnresolvedDeclRefExprClass, T, true, true),
- Name(N), Loc(L), QualifierRange(R), NNS(NNS) { }
+ Name(N), Loc(L), QualifierRange(R), NNS(NNS),
+ IsAddressOfOperand(IsAddressOfOperand) { }
/// \brief Retrieve the name that this expression refers to.
DeclarationName getDeclName() const { return Name; }
@@ -1004,6 +1009,9 @@ public:
/// declaration.
NestedNameSpecifier *getQualifier() const { return NNS; }
+ /// \brief Retrieve whether this is an address of (&) operand.
+
+ bool isAddressOfOperand() const { return IsAddressOfOperand; }
virtual SourceRange getSourceRange() const {
return SourceRange(QualifierRange.getBegin(), getLocation());
}
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index df7e5afb17b..820c1775ae2 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -849,7 +849,8 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc,
if (SS && isDependentScopeSpecifier(*SS)) {
return Owned(new (Context) UnresolvedDeclRefExpr(Name, Context.DependentTy,
Loc, SS->getRange(),
- static_cast<NestedNameSpecifier *>(SS->getScopeRep())));
+ static_cast<NestedNameSpecifier *>(SS->getScopeRep()),
+ isAddressOfOperand));
}
LookupResult Lookup = LookupParsedName(S, SS, Name, LookupOrdinaryName,
diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp
index c82e1a7da3c..5e664add5cb 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp
@@ -798,7 +798,7 @@ TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
E->getDeclName(),
/*HasTrailingLParen=*/false,
&SS,
- /*FIXME:isAddressOfOperand=*/false);
+ E->isAddressOfOperand());
}
Sema::OwningExprResult
diff --git a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.mptr/p3.cpp b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.mptr/p3.cpp
index ee3cbeae4e0..101d75fc0f4 100644
--- a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.mptr/p3.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.mptr/p3.cpp
@@ -8,13 +8,19 @@ public:
static int s;
};
+template<typename T> void ft(T& t) {
+ t.*&T::i = 10; // expected-error{{cannot form a pointer-to-member to member 'i' of reference type 'int &'}}
+}
+
void f() {
int b;
A a(b);
int A::*ip = &A::s; // expected-error {{incompatible type initializing 'int *', expected 'int class A::*'}}
a.*&A::s = 10; // expected-error{{right hand operand to .* has non pointer-to-member type 'int *'}}
+
a.*&A::i = 10; // expected-error{{cannot form a pointer-to-member to member 'i' of reference type 'int &'}}
-
+ ft(a); // expected-note{{in instantiation of function template specialization 'ft' requested here}}
+
void A::*p = 0; // expected-error{{'p' declared as a member pointer to void}}
}
OpenPOWER on IntegriCloud