forked from OSchip/llvm-project
Make ASTContext::getDeclAlign return the correct alignment for
FunctionDecls. This commit silences an incorrect warning that is issued when a function pointer is cast to another function pointer type. The warning gets issued because alignments of the source and destination do not match in Sema::CheckCastAlign, which happens because ASTContext::getTypeInfoImpl and ASTContext::getDeclAlign return different values for functions (the former returns 4 while the latter returns 1). This should fix PR31558. rdar://problem/29533528 Differential Revision: https://reviews.llvm.org/D27478 llvm-svn: 291253
This commit is contained in:
parent
98f0af4b3e
commit
d62f2c8c0a
|
@ -1458,7 +1458,9 @@ CharUnits ASTContext::getDeclAlign(const Decl *D, bool ForAlignof) const {
|
|||
T = getPointerType(RT->getPointeeType());
|
||||
}
|
||||
QualType BaseT = getBaseElementType(T);
|
||||
if (!BaseT->isIncompleteType() && !T->isFunctionType()) {
|
||||
if (T->isFunctionType())
|
||||
Align = getTypeInfoImpl(T.getTypePtr()).Align;
|
||||
else if (!BaseT->isIncompleteType()) {
|
||||
// Adjust alignments of declarations with array type by the
|
||||
// large-array alignment on the target.
|
||||
if (const ArrayType *arrayType = getAsArrayType(T)) {
|
||||
|
|
|
@ -59,3 +59,11 @@ void test4() {
|
|||
i = (int *)&s.s0;
|
||||
i = (int *)a;
|
||||
}
|
||||
|
||||
// No warnings.
|
||||
typedef int (*FnTy)(void);
|
||||
unsigned int func5(void);
|
||||
|
||||
FnTy test5(void) {
|
||||
return (FnTy)&func5;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue