Improve diagnostics for the "type qualifier on return type has no

effect warning" by printing the qualifiers we saw and correctly
pluralizing the message, e.g.,

test/SemaCXX/conditional-expr.cpp:295:3: warning: 'const volatile' type
      qualifiers on return type have no effect
  const volatile Enum g2() {
  ^~~~~ ~~~~~~~~





git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108236 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2010-07-13 08:50:30 +00:00
Родитель 218f47ff74
Коммит de80ec1fa9
4 изменённых файлов: 31 добавлений и 9 удалений

Просмотреть файл

@ -121,7 +121,7 @@ def warn_use_out_of_scope_declaration : Warning<
def err_inline_non_function : Error<
"'inline' can only appear on functions">;
def warn_qual_return_type : Warning<
"type qualifier on return type has no effect">;
"'%0' type qualifier%s1 on return type %plural{1:has|:have}1 no effect">;
def warn_decl_shadow :
Warning<"declaration shadows a %select{"

Просмотреть файл

@ -1135,17 +1135,34 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
(!getLangOptions().CPlusPlus ||
(!T->isDependentType() && !T->isRecordType()))) {
unsigned Quals = D.getDeclSpec().getTypeQualifiers();
std::string QualStr;
unsigned NumQuals = 0;
SourceLocation Loc;
if (Quals & Qualifiers::Const)
if (Quals & Qualifiers::Const) {
Loc = D.getDeclSpec().getConstSpecLoc();
else if (Quals & Qualifiers::Volatile)
Loc = D.getDeclSpec().getVolatileSpecLoc();
else {
assert((Quals & Qualifiers::Restrict) && "Unknown type qualifier");
Loc = D.getDeclSpec().getRestrictSpecLoc();
++NumQuals;
QualStr = "const";
}
if (Quals & Qualifiers::Volatile) {
if (NumQuals == 0) {
Loc = D.getDeclSpec().getVolatileSpecLoc();
QualStr = "volatile";
} else
QualStr += " volatile";
++NumQuals;
}
if (Quals & Qualifiers::Restrict) {
if (NumQuals == 0) {
Loc = D.getDeclSpec().getRestrictSpecLoc();
QualStr = "restrict";
} else
QualStr += " restrict";
++NumQuals;
}
assert(NumQuals > 0 && "No known qualifiers?");
SemaDiagnosticBuilder DB = Diag(Loc, diag::warn_qual_return_type);
DB << QualStr << NumQuals;
if (Quals & Qualifiers::Const)
DB << FixItHint::CreateRemoval(D.getDeclSpec().getConstSpecLoc());
if (Quals & Qualifiers::Volatile)

Просмотреть файл

@ -292,10 +292,15 @@ namespace PR7598 {
return v;
}
const volatile Enum g2() { // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
return v;
}
void f() {
const Enum v2 = v;
Enum e = false ? g() : v;
Enum e2 = false ? v2 : v;
Enum e3 = false ? g2() : v;
}
}

Просмотреть файл

@ -44,7 +44,7 @@ namespace test2 {
// PR5134
namespace test3 {
class Foo {
friend const int getInt(int inInt = 0); // expected-warning{{type qualifier on return type has no effect}}
friend const int getInt(int inInt = 0); // expected-warning{{'const' type qualifier on return type has no effect}}
};
}