summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-01-11 22:33:48 +0000
committerDouglas Gregor <dgregor@apple.com>2012-01-11 22:33:48 +0000
commitaab36986ab66549e90e5af59bdaf62badad74a22 (patch)
tree059427d194ecb1796dc622f51a5399748c4b427b /clang/lib/Sema/SemaDecl.cpp
parenta818d804a18a47fc3146b9caee322e9519a40bf1 (diff)
downloadbcm5719-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.cpp13
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;
OpenPOWER on IntegriCloud