Selector: (changes made after discussing this more with Steve Naroff)

- Make Selector::getAsIdentifierInfo() private.  Using IdentifierInfo* in
  Selector is an implementation detail that clients shouldn't think about.
- Modify diagnostic emission in Sema::ProcessPropertyDecl to not use
  Selector::getAsIdentifierInfo() (which could crash when IdentifierInfo* is
  null) and instead use Selector::getAsString().
- Tidy up Selector::getAsString() implementation.

llvm-svn: 66313
This commit is contained in:
Ted Kremenek 2009-03-07 01:22:02 +00:00
parent b6b7ce4b50
commit 0666a6ce70
3 changed files with 12 additions and 10 deletions

View File

@ -353,13 +353,6 @@ class Selector {
assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo"); assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
} }
Selector(uintptr_t V) : InfoPtr(V) {} Selector(uintptr_t V) : InfoPtr(V) {}
public:
friend class SelectorTable; // only the SelectorTable can create these
friend class DeclarationName; // and the AST's DeclarationName.
/// The default ctor should only be used when creating data structures that
/// will contain selectors.
Selector() : InfoPtr(0) {}
IdentifierInfo *getAsIdentifierInfo() const { IdentifierInfo *getAsIdentifierInfo() const {
if (getIdentifierInfoFlag()) if (getIdentifierInfoFlag())
@ -369,6 +362,14 @@ public:
unsigned getIdentifierInfoFlag() const { unsigned getIdentifierInfoFlag() const {
return InfoPtr & ArgFlags; return InfoPtr & ArgFlags;
} }
public:
friend class SelectorTable; // only the SelectorTable can create these
friend class DeclarationName; // and the AST's DeclarationName.
/// The default ctor should only be used when creating data structures that
/// will contain selectors.
Selector() : InfoPtr(0) {}
/// operator==/!= - Indicate whether the specified selectors are identical. /// operator==/!= - Indicate whether the specified selectors are identical.
bool operator==(Selector RHS) const { bool operator==(Selector RHS) const {
return InfoPtr == RHS.InfoPtr; return InfoPtr == RHS.InfoPtr;

View File

@ -352,8 +352,9 @@ std::string Selector::getAsString() const {
if (InfoPtr & ArgFlags) { if (InfoPtr & ArgFlags) {
IdentifierInfo *II = getAsIdentifierInfo(); IdentifierInfo *II = getAsIdentifierInfo();
// If the number of arguments is 0 then II is guaranteed to not be null.
if (getNumArgs() == 0) if (getNumArgs() == 0)
return II ? II->getName() : ""; return II->getName();
std::string Res = II ? II->getName() : ""; std::string Res = II ? II->getName() : "";
Res += ":"; Res += ":";

View File

@ -1139,7 +1139,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
Diag(property->getLocation(), Diag(property->getLocation(),
diag::err_accessor_property_type_mismatch) diag::err_accessor_property_type_mismatch)
<< property->getDeclName() << property->getDeclName()
<< GetterMethod->getSelector().getAsIdentifierInfo(); << GetterMethod->getSelector().getAsString();
Diag(GetterMethod->getLocation(), diag::note_declared_at); Diag(GetterMethod->getLocation(), diag::note_declared_at);
} }
@ -1152,7 +1152,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
Diag(property->getLocation(), Diag(property->getLocation(),
diag::err_accessor_property_type_mismatch) diag::err_accessor_property_type_mismatch)
<< property->getDeclName() << property->getDeclName()
<< SetterMethod->getSelector().getAsIdentifierInfo(); << SetterMethod->getSelector().getAsString();
Diag(SetterMethod->getLocation(), diag::note_declared_at); Diag(SetterMethod->getLocation(), diag::note_declared_at);
} }
} }