Template instantiation for the GNU address-of-label extension.

llvm-svn: 72301
This commit is contained in:
Douglas Gregor 2009-05-22 23:25:52 +00:00
parent a838a40bc4
commit 93fcf93bc6
2 changed files with 16 additions and 1 deletions

View File

@ -55,7 +55,7 @@ namespace {
OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
OwningExprResult VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E);
OwningExprResult VisitConditionalOperator(ConditionalOperator *E);
// FIXME: AddrLabelExpr
OwningExprResult VisitAddrLabelExpr(AddrLabelExpr *E);
OwningExprResult VisitStmtExpr(StmtExpr *E);
OwningExprResult VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
OwningExprResult VisitShuffleVectorExpr(ShuffleVectorExpr *E);
@ -526,6 +526,13 @@ TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
move(Cond), move(LHS), move(RHS));
}
Sema::OwningExprResult
TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
E->getLabelLoc(),
E->getLabel()->getID());
}
Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Sema::OwningStmtResult SubStmt
= SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);

View File

@ -178,6 +178,14 @@ template<typename T> struct IndirectGoto0 {
void f(T x) {
// FIXME: crummy error message below
goto *x; // expected-error{{incompatible}}
prior:
T prior_label = &&prior;
T later_label = &&later;
later:
(void)(1+1);
}
};