diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-11 22:33:48 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-11 22:33:48 +0000 |
commit | aab36986ab66549e90e5af59bdaf62badad74a22 (patch) | |
tree | 059427d194ecb1796dc622f51a5399748c4b427b /clang/lib/Sema/SemaDecl.cpp | |
parent | a818d804a18a47fc3146b9caee322e9519a40bf1 (diff) | |
download | bcm5719-llvm-aab36986ab66549e90e5af59bdaf62badad74a22.tar.gz bcm5719-llvm-aab36986ab66549e90e5af59bdaf62badad74a22.zip |
Improve the diagnostic when trying to redefine a typedef with a
variably-modified type.
llvm-svn: 147973
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 588fc140444..f30f1fa5be6 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1383,10 +1383,21 @@ bool Sema::isIncompatibleTypedef(TypeDecl *Old, TypedefNameDecl *New) { OldType = Context.getTypeDeclType(Old); QualType NewType = New->getUnderlyingType(); + if (NewType->isVariablyModifiedType()) { + // Must not redefine a typedef with a variably-modified type. + int Kind = isa<TypeAliasDecl>(Old) ? 1 : 0; + Diag(New->getLocation(), diag::err_redefinition_variably_modified_typedef) + << Kind << NewType; + if (Old->getLocation().isValid()) + Diag(Old->getLocation(), diag::note_previous_definition); + New->setInvalidDecl(); + return true; + } + if (OldType != NewType && !OldType->isDependentType() && !NewType->isDependentType() && - !Context.hasSameType(OldType, NewType)) { + !Context.hasSameType(OldType, NewType)) { int Kind = isa<TypeAliasDecl>(Old) ? 1 : 0; Diag(New->getLocation(), diag::err_redefinition_different_typedef) << Kind << NewType << OldType; |