From: Enea Zaffanella Date: Fri, 11 Jan 2013 14:34:39 +0000 (+0000) Subject: Fixed an assertion failure triggered by invalid code. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=601e6e894c2a38243588b375bed0b9a9e60060bb;p=clang Fixed an assertion failure triggered by invalid code. Set invalid type of declarator after emitting error diagnostics, so that it won't be later considered when instantiating the template. Added test5_inst in test/SemaCXX/condition.cpp for non-regression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172201 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 1bdd7c3b39..60db55aff3 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -1996,6 +1996,7 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, SemaRef.Diag(OwnedTagDecl->getLocation(), diag::err_type_defined_in_alias_template) << SemaRef.Context.getTypeDeclType(OwnedTagDecl); + D.setInvalidType(true); break; case Declarator::TypeNameContext: case Declarator::TemplateParamContext: @@ -2006,6 +2007,7 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, SemaRef.Diag(OwnedTagDecl->getLocation(), diag::err_type_defined_in_type_specifier) << SemaRef.Context.getTypeDeclType(OwnedTagDecl); + D.setInvalidType(true); break; case Declarator::PrototypeContext: case Declarator::ObjCParameterContext: @@ -2016,6 +2018,7 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, SemaRef.Diag(OwnedTagDecl->getLocation(), diag::err_type_defined_in_param_type) << SemaRef.Context.getTypeDeclType(OwnedTagDecl); + D.setInvalidType(true); break; case Declarator::ConditionContext: // C++ 6.4p2: @@ -2023,6 +2026,7 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, // a new class or enumeration. SemaRef.Diag(OwnedTagDecl->getLocation(), diag::err_type_defined_in_condition); + D.setInvalidType(true); break; } } diff --git a/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp b/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp index 34a8c854a6..ec1ccbf5de 100644 --- a/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp +++ b/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp @@ -1,10 +1,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s struct A { }; -A::A (enum { e1 }) {} // expected-error{{can not be defined in a parameter}} \ -// expected-error{{out-of-line definition}} -void A::f(enum { e2 }) {} // expected-error{{can not be defined in a parameter}} \ -// expected-error{{out-of-line definition}} +A::A (enum { e1 }) {} // expected-error{{can not be defined in a parameter}} +void A::f(enum { e2 }) {} // expected-error{{can not be defined in a parameter}} enum { e3 } A::g() { } // expected-error{{can not be defined in the result type}} \ // expected-error{{out-of-line definition}} diff --git a/test/SemaCXX/alias-template.cpp b/test/SemaCXX/alias-template.cpp index 4bf79f851e..db9c82afd5 100644 --- a/test/SemaCXX/alias-template.cpp +++ b/test/SemaCXX/alias-template.cpp @@ -105,9 +105,7 @@ namespace TagName { template using S = struct { int n; }; // expected-error {{can not be defined}} template using T = class { int n; }; // expected-error {{can not be defined}} template using U = enum { a, b, c }; // expected-error {{can not be defined}} - template using V = struct V { int n; }; // expected-error {{redefinition of 'V' as different kind of symbol}} \ - expected-error {{'TagName::V' can not be defined in a type alias template}} \ - expected-note {{previous definition is here}} + template using V = struct V { int n; }; // expected-error {{'TagName::V' can not be defined in a type alias template}} } namespace StdExample { diff --git a/test/SemaCXX/condition.cpp b/test/SemaCXX/condition.cpp index ec5eb17b08..d805881194 100644 --- a/test/SemaCXX/condition.cpp +++ b/test/SemaCXX/condition.cpp @@ -19,7 +19,7 @@ void test() { while (struct NewS *x=0) ; while (struct S {} *x=0) ; // expected-error {{types may not be defined in conditions}} while (struct {} *x=0) ; // expected-error {{types may not be defined in conditions}} - switch (enum {E} x=0) ; // expected-error {{types may not be defined in conditions}} expected-error {{cannot initialize}} \ + switch (enum {E} x=0) ; // expected-error {{types may not be defined in conditions}} \ // expected-warning{{enumeration value 'E' not handled in switch}} expected-warning {{switch statement has empty body}} \ // expected-note{{put the semicolon on a separate line}} @@ -58,3 +58,12 @@ void test3() { void test4(bool (&x)(void)) { while (x); } + +template +void test5() { + if (struct S {}* p = 0) // expected-error {{types may not be defined in conditions}} + ; +} +void test5_inst() { + test5(); +}