Sent from my iPhone
On Apr 25, 2013, at 6:54 PM, Rafael Espíndola <[email protected]> wrote: > HI Douglas, > > I would normally wait for your review on this, but it seemed fairly > safe and fixed a buildbot broken by the previous patch fixing one > line extern C declarations. > > Let me know if you are OK with this patch. > > On 25 April 2013 21:30, Rafael Espindola <[email protected]> wrote: >> Author: rafael >> Date: Thu Apr 25 20:30:23 2013 >> New Revision: 180591 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=180591&view=rev >> Log: >> Add r180263 back, but fix hasBraces() to be correct during parsing. >> >> Original commit message: >> >> Fix a case in linkage computation that should check for single line extern >> "C". >> >> Modified: >> cfe/trunk/include/clang/AST/DeclCXX.h >> cfe/trunk/lib/AST/Decl.cpp >> cfe/trunk/lib/AST/DeclCXX.cpp >> cfe/trunk/lib/Sema/SemaDeclCXX.cpp >> cfe/trunk/test/SemaCXX/undefined-internal.cpp >> >> Modified: cfe/trunk/include/clang/AST/DeclCXX.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=180591&r1=180590&r2=180591&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/AST/DeclCXX.h (original) >> +++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Apr 25 20:30:23 2013 >> @@ -2352,22 +2352,27 @@ public: >> private: >> /// Language - The language for this linkage specification. >> LanguageIDs Language; >> + /// True if this linkage spec has brances. This is needed so that >> hasBraces() >> + /// returns the correct result while the linkage spec body is being >> parsed. >> + /// Once RBraceLoc has been set this is not used, so it doesn't need to be >> + /// serialized. >> + bool HasBraces; Please turn this and the Language member into bit fields to shrink the size of this class. >> /// ExternLoc - The source location for the extern keyword. >> SourceLocation ExternLoc; >> /// RBraceLoc - The source location for the right brace (if valid). >> SourceLocation RBraceLoc; >> >> LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc, >> - SourceLocation LangLoc, LanguageIDs lang, >> - SourceLocation RBLoc) >> + SourceLocation LangLoc, LanguageIDs lang, bool HasBraces) >> : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec), >> - Language(lang), ExternLoc(ExternLoc), RBraceLoc(RBLoc) { } >> + Language(lang), HasBraces(HasBraces), ExternLoc(ExternLoc), >> + RBraceLoc(SourceLocation()) { } >> >> public: >> static LinkageSpecDecl *Create(ASTContext &C, DeclContext *DC, >> SourceLocation ExternLoc, >> SourceLocation LangLoc, LanguageIDs Lang, >> - SourceLocation RBraceLoc = >> SourceLocation()); >> + bool HasBraces); >> static LinkageSpecDecl *CreateDeserialized(ASTContext &C, unsigned ID); >> >> /// \brief Return the language specified by this linkage specification. >> @@ -2377,12 +2382,18 @@ public: >> >> /// \brief Determines whether this linkage specification had braces in >> /// its syntactic form. >> - bool hasBraces() const { return RBraceLoc.isValid(); } >> + bool hasBraces() const { >> + assert(!RBraceLoc.isValid() || HasBraces); >> + return HasBraces; >> + } >> >> SourceLocation getExternLoc() const { return ExternLoc; } >> SourceLocation getRBraceLoc() const { return RBraceLoc; } >> void setExternLoc(SourceLocation L) { ExternLoc = L; } >> - void setRBraceLoc(SourceLocation L) { RBraceLoc = L; } >> + void setRBraceLoc(SourceLocation L) { >> + RBraceLoc = L; >> + HasBraces = RBraceLoc.isValid(); >> + } >> >> SourceLocation getLocEnd() const LLVM_READONLY { >> if (hasBraces()) >> >> Modified: cfe/trunk/lib/AST/Decl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=180591&r1=180590&r2=180591&view=diff >> ============================================================================== >> --- cfe/trunk/lib/AST/Decl.cpp (original) >> +++ cfe/trunk/lib/AST/Decl.cpp Thu Apr 25 20:30:23 2013 >> @@ -476,6 +476,13 @@ template <typename T> static bool isInEx >> return First->getDeclContext()->isExternCContext(); >> } >> >> +static bool isSingleLineExternC(const Decl &D) { >> + if (const LinkageSpecDecl *SD = >> dyn_cast<LinkageSpecDecl>(D.getDeclContext())) >> + if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces()) >> + return true; >> + return false; >> +} >> + >> static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, >> LVComputationKind computation) >> { >> assert(D->getDeclContext()->getRedeclContext()->isFileContext() && >> @@ -504,7 +511,8 @@ static LinkageInfo getLVForNamespaceScop >> return PrevVar->getLinkageAndVisibility(); >> >> if (Var->getStorageClass() != SC_Extern && >> - Var->getStorageClass() != SC_PrivateExtern) >> + Var->getStorageClass() != SC_PrivateExtern && >> + !isSingleLineExternC(*Var)) >> return LinkageInfo::internal(); >> } >> >> @@ -1580,11 +1588,8 @@ VarDecl::DefinitionKind VarDecl::isThisD >> // A declaration directly contained in a linkage-specification is treated >> // as if it contains the extern specifier for the purpose of determining >> // the linkage of the declared name and whether it is a definition. >> - const DeclContext *DC = getDeclContext(); >> - if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(DC)) { >> - if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces()) >> - return DeclarationOnly; >> - } >> + if (isSingleLineExternC(*this)) >> + return DeclarationOnly; >> >> // C99 6.9.2p2: >> // A declaration of an object that has file scope without an initializer, >> >> Modified: cfe/trunk/lib/AST/DeclCXX.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff >> ============================================================================== >> --- cfe/trunk/lib/AST/DeclCXX.cpp (original) >> +++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Apr 25 20:30:23 2013 >> @@ -1816,14 +1816,14 @@ LinkageSpecDecl *LinkageSpecDecl::Create >> SourceLocation ExternLoc, >> SourceLocation LangLoc, >> LanguageIDs Lang, >> - SourceLocation RBraceLoc) { >> - return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc); >> + bool HasBraces) { >> + return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces); >> } >> >> LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, unsigned >> ID) { >> void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LinkageSpecDecl)); >> return new (Mem) LinkageSpecDecl(0, SourceLocation(), SourceLocation(), >> - lang_c, SourceLocation()); >> + lang_c, false); >> } >> >> void UsingDirectiveDecl::anchor() { } >> >> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Apr 25 20:30:23 2013 >> @@ -10507,7 +10507,8 @@ Decl *Sema::ActOnStartLinkageSpecificati >> // FIXME: Add all the various semantics of linkage specifications >> >> LinkageSpecDecl *D = LinkageSpecDecl::Create(Context, CurContext, >> - ExternLoc, LangLoc, >> Language); >> + ExternLoc, LangLoc, Language, >> + LBraceLoc.isValid()); >> CurContext->addDecl(D); >> PushDeclContext(S, D); >> return D; >> >> Modified: cfe/trunk/test/SemaCXX/undefined-internal.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/undefined-internal.cpp?rev=180591&r1=180590&r2=180591&view=diff >> ============================================================================== >> --- cfe/trunk/test/SemaCXX/undefined-internal.cpp (original) >> +++ cfe/trunk/test/SemaCXX/undefined-internal.cpp Thu Apr 25 20:30:23 2013 >> @@ -323,3 +323,10 @@ namespace test13 { >> } >> } >> >> +namespace test14 { >> + extern "C" const int foo; >> + >> + int f() { >> + return foo; >> + } >> +} >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
