]> granicus.if.org Git - clang/commitdiff
For -Wignored-qualifiers, don't warn on qualifiers which we acquire via a
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 28 Mar 2013 03:27:52 +0000 (03:27 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 28 Mar 2013 03:27:52 +0000 (03:27 +0000)
typedef. Also don't warn on the _Atomic type specifier, just on the _Atomic
type qualifier.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178218 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaType.cpp
test/Sema/return.c
test/SemaCXX/return.cpp

index efbd275b8a9d8bac64d9108869c90f3317efa8fa..2bf402354855f833bb0eeae1698688d9a9f3518e 100644 (file)
@@ -1888,7 +1888,9 @@ static void diagnoseIgnoredQualifiers(
     SourceLocation VolatileQualLoc = SourceLocation(),
     SourceLocation RestrictQualLoc = SourceLocation(),
     SourceLocation AtomicQualLoc = SourceLocation()) {
-  assert(Quals && "no qualifiers to diagnose");
+  if (!Quals)
+    return;
+
   const SourceManager &SM = S.getSourceManager();
 
   struct Qual {
@@ -1933,12 +1935,10 @@ static void diagnoseIgnoredQualifiers(
 static void diagnoseIgnoredFunctionQualifiers(Sema &S, QualType RetTy,
                                               Declarator &D,
                                               unsigned FunctionChunkIndex) {
-  unsigned AtomicQual = RetTy->isAtomicType() ? DeclSpec::TQ_atomic : 0;
-
   if (D.getTypeObject(FunctionChunkIndex).Fun.hasTrailingReturnType()) {
     // FIXME: TypeSourceInfo doesn't preserve location information for
     // qualifiers.
-    diagnoseIgnoredQualifiers(S, RetTy.getCVRQualifiers() | AtomicQual,
+    diagnoseIgnoredQualifiers(S, RetTy.getLocalCVRQualifiers(),
                               D.getIdentifierLoc());
     return;
   }
@@ -1970,6 +1970,7 @@ static void diagnoseIgnoredFunctionQualifiers(Sema &S, QualType RetTy,
     case DeclaratorChunk::MemberPointer:
       // FIXME: We can't currently provide an accurate source location and a
       // fix-it hint for these.
+      unsigned AtomicQual = RetTy->isAtomicType() ? DeclSpec::TQ_atomic : 0;
       diagnoseIgnoredQualifiers(S, RetTy.getCVRQualifiers() | AtomicQual,
                                 D.getIdentifierLoc());
       return;
@@ -1986,7 +1987,7 @@ static void diagnoseIgnoredFunctionQualifiers(Sema &S, QualType RetTy,
 
   // Just parens all the way out to the decl specifiers. Diagnose any qualifiers
   // which are present there.
-  diagnoseIgnoredQualifiers(S, D.getDeclSpec().getTypeQualifiers() | AtomicQual,
+  diagnoseIgnoredQualifiers(S, D.getDeclSpec().getTypeQualifiers(),
                             D.getIdentifierLoc(),
                             D.getDeclSpec().getConstSpecLoc(),
                             D.getDeclSpec().getVolatileSpecLoc(),
index 77bd3f688ed9e2d90231690c896571af6bebcaa0..e231e81b097f64b85363e8a746068034f41ad172 100644 (file)
@@ -244,6 +244,11 @@ const int ignored_c_quals(); // expected-warning{{'const' type qualifier on retu
 const volatile int ignored_cv_quals(); // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
 char* const volatile restrict ignored_cvr_quals(); // expected-warning{{'const volatile restrict' type qualifiers on return type have no effect}}
 
+typedef const int CI;
+CI ignored_quals_typedef();
+
+const CI ignored_quals_typedef_2(); // expected-warning{{'const' type qualifier}}
+
 // Test that for switch(enum) that if the switch statement covers all the cases
 // that we don't consider that for -Wreturn-type.
 enum Cases { C1, C2, C3, C4 };
index 8a2d3eeb367faff91579dcbe8b5ab73cdb17d1f4..580f0a7233e2cafe804a02f3abdea0cab2713d43 100644 (file)
@@ -55,8 +55,7 @@ mixed_ret(); // expected-warning {{'volatile' type qualifier on return type has
 const int volatile // expected-warning {{'const volatile' type qualifiers on return type have no effect}}
     (((parens())));
 
-_Atomic(int)
-    atomic(); // expected-warning {{'_Atomic' type qualifier on return type has no effect}}
+_Atomic(int) atomic();
 
 _Atomic // expected-warning {{'_Atomic' type qualifier on return type has no effect}}
     int