]> granicus.if.org Git - clang/commitdiff
Make sure Sema::GetTypeForDeclarator() deals with abstract declarators when diagnosin...
authorSteve Naroff <snaroff@apple.com>
Mon, 14 Jan 2008 23:33:18 +0000 (23:33 +0000)
committerSteve Naroff <snaroff@apple.com>
Mon, 14 Jan 2008 23:33:18 +0000 (23:33 +0000)
Bug submitted by Eli.

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

Sema/SemaType.cpp
test/Sema/complex-int.c
test/Sema/illegal-types.c [new file with mode: 0644]

index c4a9c0feaf56a1e52058beb9041bf79fa8c25da2..5ba25863dbaf3cc2f9e3420d2cdbbdf5ec933cc3 100644 (file)
@@ -164,7 +164,7 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) {
       if (T->isReferenceType()) {
         // C++ 8.3.2p4: There shall be no ... pointers to references ...
         Diag(D.getIdentifierLoc(), diag::err_illegal_decl_pointer_to_reference,
-             D.getIdentifier()->getName());
+             D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
         D.setInvalidType(true);
         T = Context.IntTy;
       }
@@ -177,7 +177,7 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) {
         // C++ 8.3.2p4: There shall be no references to references ...
         Diag(D.getIdentifierLoc(),
              diag::err_illegal_decl_reference_to_reference,
-             D.getIdentifier()->getName());
+             D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
         D.setInvalidType(true);
         T = RT->getReferenceeType();
       }
@@ -204,13 +204,13 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) {
         D.setInvalidType(true);
       } else if (T->isFunctionType()) {
         Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_of_functions,
-             D.getIdentifier()->getName());
+             D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
         T = Context.getPointerType(T);
         D.setInvalidType(true);
       } else if (const ReferenceType *RT = T->getAsReferenceType()) {
         // C++ 8.3.2p4: There shall be no ... arrays of references ...
         Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_of_references,
-             D.getIdentifier()->getName());
+             D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
         T = RT->getReferenceeType();
         D.setInvalidType(true);
       } else if (const RecordType *EltTy = T->getAsRecordType()) {
index f0c29a94d35d886d88ae4d4c882e0b9a2a6dcc29..b2555f5937181adf6024c63b02b510a939ba8218 100644 (file)
@@ -3,8 +3,12 @@
 void a() {
 __complex__ int arr;
 __complex__ short brr;
+__complex__ unsigned xx;
+__complex__ signed yy;
+
 __complex__ int result;
 
 result = arr*brr;
+result = xx*yy;
 }
 
diff --git a/test/Sema/illegal-types.c b/test/Sema/illegal-types.c
new file mode 100644 (file)
index 0000000..411f272
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: clang -fsyntax-only -verify -std=c++98 %s
+
+void a (void []()); // expected-error{{'type name' declared as array of functions}}
+void b (void p[]()); // expected-error{{'p' declared as array of functions}}
+void c (int &[]); // expected-error{{'type name' declared as array of references}}
+void d (int &p[]); // expected-error{{'p' declared as array of references}}
+