forked from OSchip/llvm-project
PR14171: Don't crash if we hit one of the paths where GetFullTypeForDeclarator
rebuilds a function type, and that function type has parens around its name. llvm-svn: 166644
This commit is contained in:
parent
086ea5c1f5
commit
527b15e8f1
|
@ -2661,6 +2661,9 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
|
||||||
|
|
||||||
// C++0x [dcl.constexpr]p8: A constexpr specifier for a non-static member
|
// C++0x [dcl.constexpr]p8: A constexpr specifier for a non-static member
|
||||||
// function that is not a constructor declares that function to be const.
|
// function that is not a constructor declares that function to be const.
|
||||||
|
// FIXME: This should be deferred until we know whether this is a static
|
||||||
|
// member function (for an out-of-class definition, we don't know
|
||||||
|
// this until we perform redeclaration lookup).
|
||||||
if (D.getDeclSpec().isConstexprSpecified() && !FreeFunction &&
|
if (D.getDeclSpec().isConstexprSpecified() && !FreeFunction &&
|
||||||
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static &&
|
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static &&
|
||||||
D.getName().getKind() != UnqualifiedId::IK_ConstructorName &&
|
D.getName().getKind() != UnqualifiedId::IK_ConstructorName &&
|
||||||
|
@ -2672,6 +2675,12 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
|
||||||
T = Context.getFunctionType(FnTy->getResultType(),
|
T = Context.getFunctionType(FnTy->getResultType(),
|
||||||
FnTy->arg_type_begin(),
|
FnTy->arg_type_begin(),
|
||||||
FnTy->getNumArgs(), EPI);
|
FnTy->getNumArgs(), EPI);
|
||||||
|
// Rebuild any parens around the identifier in the function type.
|
||||||
|
for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
|
||||||
|
if (D.getTypeObject(i).Kind != DeclaratorChunk::Paren)
|
||||||
|
break;
|
||||||
|
T = S.BuildParenType(T);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// C++11 [dcl.fct]p6 (w/DR1417):
|
// C++11 [dcl.fct]p6 (w/DR1417):
|
||||||
|
@ -2725,6 +2734,12 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
|
||||||
T = Context.getFunctionType(FnTy->getResultType(),
|
T = Context.getFunctionType(FnTy->getResultType(),
|
||||||
FnTy->arg_type_begin(),
|
FnTy->arg_type_begin(),
|
||||||
FnTy->getNumArgs(), EPI);
|
FnTy->getNumArgs(), EPI);
|
||||||
|
// Rebuild any parens around the identifier in the function type.
|
||||||
|
for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
|
||||||
|
if (D.getTypeObject(i).Kind != DeclaratorChunk::Paren)
|
||||||
|
break;
|
||||||
|
T = S.BuildParenType(T);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -741,6 +741,15 @@ constexpr bool check(T a, T b) { return a == b.k; }
|
||||||
static_assert(S(5) == 11, "");
|
static_assert(S(5) == 11, "");
|
||||||
static_assert(check(S(5), 11), "");
|
static_assert(check(S(5), 11), "");
|
||||||
|
|
||||||
|
namespace PR14171 {
|
||||||
|
|
||||||
|
struct X {
|
||||||
|
constexpr (operator int)() { return 0; }
|
||||||
|
};
|
||||||
|
static_assert(X() == 0, "");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,3 +26,6 @@ class C {
|
||||||
|
|
||||||
void (C::*mpf)() const;
|
void (C::*mpf)() const;
|
||||||
cfn C::*mpg;
|
cfn C::*mpg;
|
||||||
|
|
||||||
|
// Don't crash!
|
||||||
|
void (PR14171)() const; // expected-error {{non-member function cannot have 'const' qualifier}}
|
||||||
|
|
Loading…
Reference in New Issue