forked from OSchip/llvm-project
Use CanQualType to enforce the use of a canonical type argument to
CXXBasePaths::isAmbiguous(), rather than just asserting that we have a canonical type. Fixes PR7176. llvm-svn: 104374
This commit is contained in:
parent
c425fe4c80
commit
27ac429624
|
@ -196,7 +196,7 @@ public:
|
|||
/// \brief Determine whether the path from the most-derived type to the
|
||||
/// given base type is ambiguous (i.e., it refers to multiple subobjects of
|
||||
/// the same base type).
|
||||
bool isAmbiguous(QualType BaseType);
|
||||
bool isAmbiguous(CanQualType BaseType);
|
||||
|
||||
/// \brief Whether we are finding multiple paths to detect ambiguities.
|
||||
bool isFindingAmbiguities() const { return FindAmbiguities; }
|
||||
|
|
|
@ -49,9 +49,8 @@ CXXBasePaths::decl_iterator CXXBasePaths::found_decls_end() {
|
|||
/// ambiguous, i.e., there are two or more paths that refer to
|
||||
/// different base class subobjects of the same type. BaseType must be
|
||||
/// an unqualified, canonical class type.
|
||||
bool CXXBasePaths::isAmbiguous(QualType BaseType) {
|
||||
assert(BaseType.isCanonical() && "Base type must be the canonical type");
|
||||
assert(BaseType.hasQualifiers() == 0 && "Base type must be unqualified");
|
||||
bool CXXBasePaths::isAmbiguous(CanQualType BaseType) {
|
||||
BaseType = BaseType.getUnqualifiedType();
|
||||
std::pair<bool, unsigned>& Subobjects = ClassSubobjects[BaseType];
|
||||
return Subobjects.second + (Subobjects.first? 1 : 0) > 1;
|
||||
}
|
||||
|
|
|
@ -859,7 +859,7 @@ TryStaticMemberPointerUpcast(Sema &Self, Expr *&SrcExpr, QualType SrcType,
|
|||
}
|
||||
|
||||
// B is a base of D. But is it an allowed base? If not, it's a hard error.
|
||||
if (Paths.isAmbiguous(DestClass)) {
|
||||
if (Paths.isAmbiguous(Self.Context.getCanonicalType(DestClass))) {
|
||||
Paths.clear();
|
||||
Paths.setRecordingPaths(true);
|
||||
bool StillOkay = Self.IsDerivedFrom(SrcClass, DestClass, Paths);
|
||||
|
|
|
@ -389,7 +389,7 @@ bool Sema::CheckExceptionSpecSubset(
|
|||
if (!IsDerivedFrom(CanonicalSubT, CanonicalSuperT, Paths))
|
||||
continue;
|
||||
|
||||
if (Paths.isAmbiguous(CanonicalSuperT))
|
||||
if (Paths.isAmbiguous(Context.getCanonicalType(CanonicalSuperT)))
|
||||
continue;
|
||||
|
||||
// Do this check from a context without privileges.
|
||||
|
|
|
@ -157,3 +157,20 @@ namespace pr6783 {
|
|||
return object->*p2m; // expected-error {{left hand operand to ->*}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace PR7176 {
|
||||
namespace base
|
||||
{
|
||||
struct Process
|
||||
{ };
|
||||
struct Continuous : Process
|
||||
{
|
||||
bool cond();
|
||||
};
|
||||
}
|
||||
|
||||
typedef bool( base::Process::*Condition )();
|
||||
|
||||
void m()
|
||||
{ (void)(Condition) &base::Continuous::cond; }
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue