aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2009-03-22 21:28:55 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2009-03-22 21:28:55 +0000
commitdfe292dbebe84bc3a19dba83e9eef52d56492b0a (patch)
treef2734bd61805045014761d059ea441bf0f8727d2
parent82227ff4eb665bbf41720ebdc0dc9215a86ba838 (diff)
Fix build from r67476 and address the easy part of Doug's comments on rvalue refs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67480 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaDeclCXX.cpp9
-rw-r--r--lib/Sema/SemaType.cpp9
2 files changed, 10 insertions, 8 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index 60d1692156..95e282ae25 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -711,7 +711,10 @@ namespace {
class VISIBILITY_HIDDEN PureVirtualMethodCollector {
ASTContext &Context;
+ public:
typedef llvm::SmallVector<const CXXMethodDecl*, 8> MethodList;
+
+ private:
MethodList Methods;
void Collect(const CXXRecordDecl* RD, MethodList& Methods);
@@ -1865,7 +1868,6 @@ Sema::CheckReferenceInit(Expr *&Init, QualType &DeclType,
BindsDirectly = true;
// Rvalue references cannot bind to lvalues (N2812).
- // FIXME: This part of rvalue references is still in flux. Revisit later.
if (isRValRef) {
if (!ICS)
Diag(Init->getSourceRange().getBegin(), diag::err_lvalue_to_rvalue_ref)
@@ -1909,8 +1911,6 @@ Sema::CheckReferenceInit(Expr *&Init, QualType &DeclType,
// 92) (this conversion is selected by enumerating the
// applicable conversion functions (13.3.1.6) and choosing
// the best one through overload resolution (13.3)),
- // FIXME: Without standard language for N2812, the rvalue reference treatment
- // here is pretty much a guess.
if (!isRValRef && !SuppressUserConversions && T2->isRecordType()) {
// FIXME: Look for conversions in base classes!
CXXRecordDecl *T2RecordDecl
@@ -1923,10 +1923,9 @@ Sema::CheckReferenceInit(Expr *&Init, QualType &DeclType,
= Conversions->function_begin();
Func != Conversions->function_end(); ++Func) {
CXXConversionDecl *Conv = cast<CXXConversionDecl>(*Func);
-
+
// If the conversion function doesn't return a reference type,
// it can't be considered for this conversion.
- // FIXME: This will change when we support rvalue references.
if (Conv->getConversionType()->isLValueReferenceType() &&
(AllowExplicit || !Conv->isExplicit()))
AddConversionCandidate(Conv, Init, DeclType, CandidateSet);
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp
index 24b32e8147..3f4e78cf28 100644
--- a/lib/Sema/SemaType.cpp
+++ b/lib/Sema/SemaType.cpp
@@ -323,10 +323,13 @@ QualType Sema::BuildReferenceType(QualType T, bool LValueRef, unsigned Quals,
SourceLocation Loc, DeclarationName Entity) {
if (LValueRef) {
if (const RValueReferenceType *R = T->getAsRValueReferenceType()) {
- // FIXME: Find the C++0x reference for reference collapsing.
- // In reference collapsing, lvalue refs win over rvalue refs.
+ // C++0x [dcl.typedef]p9: If a typedef TD names a type that is a
+ // reference to a type T, and attempt to create the type "lvalue
+ // reference to cv TD" creates the type "lvalue reference to T".
+ // We use the qualifiers (restrict or none) of the original reference,
+ // not the new ones. This is consistent with GCC.
return Context.getLValueReferenceType(R->getPointeeType()).
- getQualifiedType(Quals);
+ getQualifiedType(T.getCVRQualifiers());
}
}
if (T->isReferenceType()) {