From: Steve Naroff Date: Mon, 14 Jan 2008 23:33:18 +0000 (+0000) Subject: Make sure Sema::GetTypeForDeclarator() deals with abstract declarators when diagnosin... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=14f3f1b80ec61e50e61a4353bd647ce37ee2dd06;p=clang Make sure Sema::GetTypeForDeclarator() deals with abstract declarators when diagnosing incorrect code. Bug submitted by Eli. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45989 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp index c4a9c0feaf..5ba25863db 100644 --- a/Sema/SemaType.cpp +++ b/Sema/SemaType.cpp @@ -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()) { diff --git a/test/Sema/complex-int.c b/test/Sema/complex-int.c index f0c29a94d3..b2555f5937 100644 --- a/test/Sema/complex-int.c +++ b/test/Sema/complex-int.c @@ -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 index 0000000000..411f27262a --- /dev/null +++ b/test/Sema/illegal-types.c @@ -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}} +