]> granicus.if.org Git - clang/commitdiff
PR19252: Fix crash if alignas is used with an auto-typed variable. Don't check
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 27 Mar 2014 01:22:48 +0000 (01:22 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 27 Mar 2014 01:22:48 +0000 (01:22 +0000)
the type of the variable until it's known.

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

lib/Sema/SemaDecl.cpp
lib/Sema/SemaTemplateInstantiateDecl.cpp
test/CXX/dcl.dcl/dcl.attr/dcl.align/p5.cpp
test/SemaCXX/attr-cxx0x.cpp

index e4511c925fc405b75e35293b391ae1499ad8cd71..bfbd870eefc6072b3135f9356f86d951d993b74a 100644 (file)
@@ -5344,9 +5344,6 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
   // Handle attributes prior to checking for duplicates in MergeVarDecl
   ProcessDeclAttributes(S, NewVD, D);
 
-  if (NewVD->hasAttrs())
-    CheckAlignasUnderalignment(NewVD);
-
   if (getLangOpts().CUDA) {
     // CUDA B.2.5: "__shared__ and __constant__ variables have implied static
     // storage [duration]."
@@ -5734,6 +5731,9 @@ void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {
   if (T->isUndeducedType())
     return;
 
+  if (NewVD->hasAttrs())
+    CheckAlignasUnderalignment(NewVD);
+
   if (T->isObjCObjectType()) {
     Diag(NewVD->getLocation(), diag::err_statically_allocated_object)
       << FixItHint::CreateInsertion(NewVD->getLocation(), "*");
@@ -5851,7 +5851,6 @@ void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {
   if (NewVD->isConstexpr() && !T->isDependentType() &&
       RequireLiteralType(NewVD->getLocation(), T,
                          diag::err_constexpr_var_non_literal)) {
-    // Can't perform this check until the type is deduced.
     NewVD->setInvalidDecl();
     return;
   }
index 0982f4425739cbfcdfa26640f5938697c8f7add3..8766c887f8b094bc11917049809d7f590f3a9246 100644 (file)
@@ -3593,9 +3593,6 @@ void Sema::BuildVariableInstantiation(
 
   InstantiateAttrs(TemplateArgs, OldVar, NewVar, LateAttrs, StartingScope);
 
-  if (NewVar->hasAttrs())
-    CheckAlignasUnderalignment(NewVar);
-
   LookupResult Previous(
       *this, NewVar->getDeclName(), NewVar->getLocation(),
       NewVar->isLocalExternDecl() ? Sema::LookupRedeclarationWithLinkage
index 10be98d16ea0466ec5f605bddb9aa6fb29cdd3fb..3c250f9d25dd282d329b4adbc4ac2c441c37a4ca 100644 (file)
@@ -9,6 +9,7 @@ alignas(1) alignas(4) int n6 alignas(2); // ok
 alignas(1) int n7 alignas(2), // expected-error {{less than minimum alignment}}
                n8 alignas(4); // ok
 alignas(8) int n9 alignas(2); // ok, overaligned
+alignas(1) extern int n10; // expected-error {{less than minimum alignment}}
 
 enum alignas(1) E1 {}; // expected-error {{requested alignment is less than minimum alignment of 4 for type 'E1'}}
 enum alignas(1) E2 : char {}; // ok
index 02d9dc912917b754a5126f4a915258ddd513972c..6ba89a62d70de7d5e5aa680434f610f59348bb13 100644 (file)
@@ -48,3 +48,5 @@ static_assert(alignof(int(int)) >= 1, "alignof(function) not positive"); // expe
 
 [[__carries_dependency__]]  // expected-warning{{unknown attribute '__carries_dependency__' ignored}}
 void func(void);
+
+alignas(4) auto PR19252 = 0;