[cfe-commits] r127811 - in /cfe/trunk: include/clang/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclCXX.cpp lib/Sema/SemaExprCXX.cpp lib/Sema/SemaTemplateDeduction.cpp test/SemaCXX/auto-subst-failure.cpp
Douglas Gregor
dgregor at apple.com
Fri Mar 18 09:15:44 PDT 2011
Bill, can you pull this into the 2.9 branch?
Thanks!
- Doug
On Mar 17, 2011, at 9:11 AM, Richard Smith wrote:
> Author: rsmith
> Date: Thu Mar 17 11:11:59 2011
> New Revision: 127811
>
> URL: http://llvm.org/viewvc/llvm-project?rev=127811&view=rev
> Log:
> Fix PR9488: 'auto' type substitution can fail (for instance, if it creates a reference-to-void type). Don't crash if it does.
> Also fix an issue where type source information for the resulting type was being lost.
>
> Added:
> cfe/trunk/test/SemaCXX/auto-subst-failure.cpp
> Modified:
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
> cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=127811&r1=127810&r2=127811&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Mar 17 11:11:59 2011
> @@ -3879,7 +3879,8 @@
> FunctionDecl *&Specialization,
> sema::TemplateDeductionInfo &Info);
>
> - bool DeduceAutoType(QualType AutoType, Expr *Initializer, QualType &Result);
> + bool DeduceAutoType(TypeSourceInfo *AutoType, Expr *Initializer,
> + TypeSourceInfo *&Result);
>
> FunctionTemplateDecl *getMoreSpecializedTemplate(FunctionTemplateDecl *FT1,
> FunctionTemplateDecl *FT2,
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=127811&r1=127810&r2=127811&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Mar 17 11:11:59 2011
> @@ -4664,15 +4664,17 @@
>
> // C++0x [decl.spec.auto]p6. Deduce the type which 'auto' stands in for.
> if (TypeMayContainAuto && VDecl->getType()->getContainedAutoType()) {
> - QualType DeducedType;
> - if (!DeduceAutoType(VDecl->getType(), Init, DeducedType)) {
> + TypeSourceInfo *DeducedType = 0;
> + if (!DeduceAutoType(VDecl->getTypeSourceInfo(), Init, DeducedType))
> Diag(VDecl->getLocation(), diag::err_auto_var_deduction_failure)
> << VDecl->getDeclName() << VDecl->getType() << Init->getType()
> << Init->getSourceRange();
> + if (!DeducedType) {
> RealDecl->setInvalidDecl();
> return;
> }
> - VDecl->setType(DeducedType);
> + VDecl->setTypeSourceInfo(DeducedType);
> + VDecl->setType(DeducedType->getType());
>
> // If this is a redeclaration, check that the type we just deduced matches
> // the previously declared type.
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=127811&r1=127810&r2=127811&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Mar 17 11:11:59 2011
> @@ -6137,15 +6137,17 @@
> }
>
> Expr *Init = Exprs.get()[0];
> - QualType DeducedType;
> - if (!DeduceAutoType(VDecl->getType(), Init, DeducedType)) {
> + TypeSourceInfo *DeducedType = 0;
> + if (!DeduceAutoType(VDecl->getTypeSourceInfo(), Init, DeducedType))
> Diag(VDecl->getLocation(), diag::err_auto_var_deduction_failure)
> << VDecl->getDeclName() << VDecl->getType() << Init->getType()
> << Init->getSourceRange();
> + if (!DeducedType) {
> RealDecl->setInvalidDecl();
> return;
> }
> - VDecl->setType(DeducedType);
> + VDecl->setTypeSourceInfo(DeducedType);
> + VDecl->setType(DeducedType->getType());
>
> // If this is a redeclaration, check that the type we just deduced matches
> // the previously declared type.
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=127811&r1=127810&r2=127811&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Mar 17 11:11:59 2011
> @@ -848,16 +848,18 @@
> diag::err_auto_new_ctor_multiple_expressions)
> << AllocType << TypeRange);
> }
> - QualType DeducedType;
> - if (!DeduceAutoType(AllocType, ConstructorArgs.get()[0], DeducedType))
> + TypeSourceInfo *DeducedType = 0;
> + if (!DeduceAutoType(AllocTypeInfo, ConstructorArgs.get()[0], DeducedType))
> return ExprError(Diag(StartLoc, diag::err_auto_new_deduction_failure)
> << AllocType
> << ConstructorArgs.get()[0]->getType()
> << TypeRange
> << ConstructorArgs.get()[0]->getSourceRange());
> + if (!DeducedType)
> + return ExprError();
>
> - AllocType = DeducedType;
> - AllocTypeInfo = Context.getTrivialTypeSourceInfo(AllocType, StartLoc);
> + AllocTypeInfo = DeducedType;
> + AllocType = AllocTypeInfo->getType();
> }
>
> // Per C++0x [expr.new]p5, the type being constructed may be a
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=127811&r1=127810&r2=127811&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp Thu Mar 17 11:11:59 2011
> @@ -3003,11 +3003,14 @@
> ///
> /// \param Result if type deduction was successful, this will be set to the
> /// deduced type. This may still contain undeduced autos if the type is
> -/// dependent.
> +/// dependent. This will be set to null if deduction succeeded, but auto
> +/// substitution failed; the appropriate diagnostic will already have been
> +/// produced in that case.
> ///
> /// \returns true if deduction succeeded, false if it failed.
> bool
> -Sema::DeduceAutoType(QualType Type, Expr *Init, QualType &Result) {
> +Sema::DeduceAutoType(TypeSourceInfo *Type, Expr *Init,
> + TypeSourceInfo *&Result) {
> if (Init->isTypeDependent()) {
> Result = Type;
> return true;
> @@ -3025,8 +3028,10 @@
> FixedSizeTemplateParameterList<1> TemplateParams(Loc, Loc, &TemplParamPtr,
> Loc);
>
> - QualType FuncParam =
> + TypeSourceInfo *FuncParamInfo =
> SubstituteAutoTransform(*this, TemplArg).TransformType(Type);
> + assert(FuncParamInfo && "substituting template parameter for 'auto' failed");
> + QualType FuncParam = FuncParamInfo->getType();
>
> // Deduce type of TemplParam in Func(Init)
> llvm::SmallVector<DeducedTemplateArgument, 1> Deduced;
>
> Added: cfe/trunk/test/SemaCXX/auto-subst-failure.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/auto-subst-failure.cpp?rev=127811&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/auto-subst-failure.cpp (added)
> +++ cfe/trunk/test/SemaCXX/auto-subst-failure.cpp Thu Mar 17 11:11:59 2011
> @@ -0,0 +1,15 @@
> +// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++0x
> +
> +void f() {
> + auto a = f(); // expected-error {{variable has incomplete type 'void'}}
> + auto &b = f(); // expected-error {{cannot form a reference to 'void'}}
> + auto *c = f(); // expected-error {{incompatible initializer of type 'void'}}
> +
> + auto d(f()); // expected-error {{variable has incomplete type 'void'}}
> + auto &&e(f()); // expected-error {{cannot form a reference to 'void'}}
> + auto *g(f()); // expected-error {{incompatible initializer of type 'void'}}
> +
> + (void)new auto(f()); // expected-error {{allocation of incomplete type 'void'}}
> + (void)new auto&(f()); // expected-error {{cannot form a reference to 'void'}}
> + (void)new auto*(f()); // expected-error {{incompatible constructor argument of type 'void'}}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list